![Stephan 的 TUGboat 文章中关于 \expandafter 的问题](https://linux22.com/image/472643/Stephan%20%E7%9A%84%20TUGboat%20%E6%96%87%E7%AB%A0%E4%B8%AD%E5%85%B3%E4%BA%8E%20%5Cexpandafter%20%E7%9A%84%E9%97%AE%E9%A2%98.png)
在 Stephan Bechtolshein 的第一页中TUGboat 文章,\expandafter
他 介绍 了 执行 的 规则\expandafter
.
我认为 iii 的情况不应该列在这里,因为开头的花括号应该是 token e而不是 token 1。也就是说,作者应该把 iii 放在最外面的步骤 1 中。我是对的吗?
答案1
不幸的是,本教程不够精确。实际上,第 2.iii 点完全错误:如果 ⟨token 1 ⟩ 是{
,那么它根本就不会被扩展,因为没有字符标记是可扩展的。
但第 2 项在很多方面都是错误的。其他原语都是可扩展的,不仅仅是\expandafter
,\csname
还有\the
。例如,所有条件语句是可扩展的,包括和\else
其中。此功能使您可以执行以下任务\fi
\or
⟨primitive if⟩⟨condition⟩
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{⟨first⟩}{⟨second⟩}%
这是一段非常有用的代码,但 Bechtolsheim 似乎忽略了它(据我所知,他那本关于 TeX 的四卷书甚至都没有提到它)。它也是\number
可扩展的,这只是另一个基本概念。
它要简单得多:当 TeX 扩展标记(即,除非扩展被抑制,例如在使用 读取宏定义中的替换文本时\def
)并找到 时\expandafter
,它会跳过下一个标记,我们称之为 ⟨token埃⟩,并尝试扩展下一个。如果 token 是可扩展的,则将其替换为其扩展(可能带有参数查找)。的扩展\expandafter
为 void,并且该过程从 ⟨token 重新开始埃⟩ 将被扩展(如果可扩展)或执行。
⟨token 时没有任何区别埃⟩ 是{
关于每个可能的其他标记。
此外,示例 8 有点误导,因为它跳过了一个基本特性,即在分配给标记寄存器时,(可选)后面=
可以跟一个 ⟨filler⟩,这意味着 TeX 将忽略空格和\relax
标记来扩展标记,直到找到{
。这使得可以这样做
\tb=\expandafter{\the\ta}
有可能细节我的观点是,要么提到了上述规则,要么该案例不应被视为一个例子,而应被视为其本身的一个特征。