跳转到内容

TeX/expandafter

来自维基教科书,自由的教科书
< TeX
\expandafter <macro> <tokens>

\expandafter 命令会延迟展开宏,直到它的参数被展开。

\def\a[#1]{A's argument was `#1'}
\def\args{[FOO]}
\a\args

将无法工作,显示“! \a 的使用与定义不匹配”。这是因为在定义 \a 时,第一个参数(表示为 #1)出现在方括号中。因此,\a 期望它的第一个参数出现在方括号中,而在 \a\args 中,\a 之后紧随的字符不是左方括号。使用 \expandafter,我们可以写

\expandafter\a\args

这会在 \a 之前展开 \args,就好像我们在开头写了以下内容一样

\a[FOO]

因此,TeX 将打印 "A's argument was `FOO'"。

\expandafter 命令首先展开 <macro> 之后的令牌,然后展开 <macro>,将展开的 <tokens> 放在它后面,就好像它们是在文件中键入的一样。

多次调用

[编辑 | 编辑源代码]

人们有时会看到长串的 expandafters,通常可以理解为“在 N 后展开”,例如

% Chain of expandafters leads to \pra having definition ``\onelevelexpanded''
\def\onelevelexpanded{Page={\the\count0} }
\def\mycommandcontents{\onelevelexpanded}
\ea\def\ea\pra\ea{\mycommandcontents}

这仅展开 \mycommandcontents 一次(与 TeX/edef 相反)。

参考文献

[编辑 | 编辑源代码]

参见 Stephan Bechtolsheim 的文章

华夏公益教科书