我对 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
这只第一级扩展,并未全部完成。