根据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
但这个问题不是关于奇怪的解决方法而是关于确切的规则。:-)