关于在 \expandafter

关于在 \expandafter

我对 TeX 中的命令感到困惑\expandafter。在 TeXbook 中,Knuth 说

\expandafter 令牌TeX 首先读取紧随其后的标记 \expandafter,而不对其进行扩展;我们称其为. 然后 TeX 读取后面的 token(如果该标记有参数,可能还有更多标记),用其扩展替换它。最后 TeX 放入回到那个扩展的前面。

以下是一个例子:

% \b\c->\c->A
\def\a#1{\ifx#1\c c\else not c\fi}
\def\b#1{#1}
\def\c{A}
\expandafter\a\b\c
\bye

结果是c,而不是not c,这不是我期望的!因为 TeX 替换(后面的标记)经过它的展开,为什么\c没有展开成字母呢A?该怎么理解\expandafter

答案1

的扩展\b在于寻找一个论据,并\b用替换文本替换该论据。因此,当\expandafter行动时,它完成其工作并消失,留下

\a\c

在输入流中。这反过来会扩展为

\ifx\c\c c\else not c\fi

这正确地给出了c。如果您还想扩展\c令牌,则必须采取不同的做法:

\expandafter\expandafter\expandafter\a\b\c

当你第一次\expandafter行动时

\expandafter\a\c

然后左派的行动\expandafter将产生

\a A

变成

\ifx A\c c\else not c\fi

这将给予not c

请记住,\expandafter这只第一级扩展,并未全部完成。

相关内容