如何构造包含星号的命令名称?

如何构造包含星号的命令名称?

我定义了以下命令:

\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}%
}

我认为避免建议的简单版本中的重复没有多大意义。

相关内容