Stephan 的 TUGboat 文章中关于 \expandafter 的问题

Stephan 的 TUGboat 文章中关于 \expandafter 的问题

在 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}

有可能细节我的观点是,要么提到了上述规则,要么该案例不应被视为一个例子,而应被视为其本身的一个特征。

相关内容