xparse - \NewExpandableDocumentCommand - 计算获取替换文本所需的扩展步数的规则是什么?

xparse - \NewExpandableDocumentCommand - 计算获取替换文本所需的扩展步数的规则是什么?

根据xparse 软件包的文档语法\NewExpandableDocumentCommand是:

\NewExpandableDocumentCommand ⟨function⟩ {⟨arg spec⟩} {⟨code⟩}

当使用 xparse\NewExpandableDocumentCommand定义一个可扩展命令时 - 用于计算从 传出的到 由的参数, , 等替换的标记组成的 的⟨function⟩扩展步骤量的确切规则是什么?⟨function⟩⟨arguments⟩⟨replacement-text⟩⟨code⟩⟨code⟩#1#2⟨arguments⟩

例如,使用\newcommand一个可以做

% LaTeX 2e
\newcommand\FirstAndSecond[2]{#1 and #2}
\expandafter\def\expandafter\test\expandafter{\FirstAndSecond{A}{B}}
\show\test
\stop

并且正如预期的那样,使用一个\expandafter-chain可以得到消息:

> \test=macro:
->A and B.
l.4 \show\test

如果使用\NewExpandableDocumentCommand\newcommand不是并且

% LaTeX 2e
\RequirePackage{xparse}
\NewExpandableDocumentCommand\FirstAndSecond{mm}{#1 and #2}
\expandafter\def\expandafter\test\expandafter{\FirstAndSecond{A}{B}}
\show\test
\stop

,然后人们会收到消息

> \test=macro:
->\__xparse_start_expandable:nNNNNn {mm}\FirstAndSecond  \FirstAndSecond  \Firs
tAndSecond code ?{\__xparse_expandable_grab_m:w \__xparse_expandable_grab_m:w }
{A}{B}.
l.5 \show\test

。显然,根据 xparser 定义的命令\NewExpandableDocumentCommand需要更多的扩展步骤。

似乎使用\romannumeral-expansion 可以解决这个问题而不需要知道确切的规则:

% LaTeX 2e
\RequirePackage{xparse}
\csname @ifdefinable\endcsname\stopromannumeral{\chardef\stopromannumeral=`\^^00}%
% !!! The call to \FirstAndSecond must always be preceded by \romannumeral !!!
\NewExpandableDocumentCommand\FirstAndSecond{mm}{\stopromannumeral #1 and #2}
\expandafter\def\expandafter\test\expandafter{\romannumeral\FirstAndSecond{A}{B}}
\show\test
\stop
> \test=macro:
->A and B.
l.7 \show\test

但这个问题不是关于奇怪的解决方法而是关于确切的规则。:-)

相关内容