\ifx 不将 \noexpand 视为 \relax

\ifx 不将 \noexpand 视为 \relax

TeXbook(第 20 次印刷,Addison-Wesley 1991)描述了原语\noexpand<token>是如何扩展的(第 213 页):

\relax扩展就是标记本身;但是,如果标记是一个通常会按照 TeX 扩展规则进行扩展的控制序列,则该标记将被解释为其含义为“ ”。

鉴于此,我期望以下纯 TeX 手稿排版为“是”。事实上,它排版为“否”。为什么?

\def\foo{bar}%
\expandafter\ifx\noexpand\foo\relax yes\else no\fi%
\bye

答案1

您必须首先查看 的模块 358 tex.web,其中无扩展标志定义为 257(评论说这表征了放松)。当宏前面有 时\noexpand,变量当前状态被安排了无扩展标志当前命令被安排了放松

在此处输入图片描述

模块 507 解释了\ifx它的工作原理:首先存储下一个 token,以及它的当前命令当前状态中的值;此后,另一个令牌被吸收,并且其当前命令相比于。在你的情况下,这个测试返回 true,因为两个值都是放松

然而现在b(条件的返回值)返回的是当前状态=而这些不匹配。

在此处输入图片描述

结论是 的扩展\noexpand\foo\relax,但并不像 那样\ifx,而且这是设计使然。

相关内容