我定义了以下命令:
\NewDocumentCommand \displayls {s m}{%
\IfBooleanTF{#1}{\textls*[250]{#2}}{\textls[250]{#2}}%
}
我想重构定义以消除重复。
我可以制作一个简单的版本:
\NewDocumentCommand \displayls {s m}{%
\csname textls\endcsname[250]{#2}%
}
如果我尝试处理星号参数,就会遇到麻烦。我尝试过:
\NewDocumentCommand \displayls {s m}{%
\csname textls\IfBooleanTF{#1}{*}{}\endcsname[250]{#2}%
}
但这对于 -form 不起作用*
;它产生:
以下是测试文档:
\documentclass{article}
\usepackage{microtype,xparse}
\NewDocumentCommand \displayls {s m}{%
% (One of the definitions above)
}
\begin{document}
\displayls{foo}
\displayls*{foo}
\end{document}
\expandafter
我之前尝试过添加\csname
,但并没有什么变化。
答案1
只需复制\textls
;或使用\exp_last_unbraced:Nf
(但我不会费心这么做)。
\documentclass{article}
\usepackage{microtype,xparse}
\NewDocumentCommand{\displayls}{s m}{%
\IfBooleanTF{#1}{\textls*}{\textls}[250]{#2}%
}
\ExplSyntaxOn
\NewDocumentCommand\displaylsvar{s m}
{
\exp_last_unbraced:Nf \textls \IfBooleanT{#1}{*} [250] {#2}
}
\ExplSyntaxOff
\begin{document}
\displayls{foo}
\displayls*{foo}
\displaylsvar{foo}
\displaylsvar*{foo}
\end{document}
只是为了了解你的尝试。如果你\textls*
称它为二标记,即\textls
和*
;相反,\csname textls*\endcsname
构造单个标记(未定义,因此像 那样处理\relax
)。
\textls
另外,这里是by的定义microtype
:
\DeclareRobustCommand\textls{%
\@ifstar{\let\MT@ls@adjust@\MT@ls@adjust@empty\MT@textls}%
{\let\MT@ls@adjust@\MT@ls@adjust@relax\MT@textls}%
}
我认为避免建议的简单版本中的重复没有多大意义。