\ifnum 的扩展会创建一个奇怪的 \relax 标记

\ifnum 的扩展会创建一个奇怪的 \relax 标记

我当时本应该写论文,却因为一些 TeX 代码而拖延时间。代码运行得差不多还好(至少比写作好),直到一个神秘的东西不知\relax从哪里冒了出来!

一开始我以为这是我的愚蠢行为,但当我将代码缩减到最低限度时,我意识到我根本不知道发生了什么。我将代码缩减到基本上只使用原语,所以这不应该是任何编码问题。以下是有问题的代码:

\def\useIInnn#1#2#3{#2}
\def\useIInn#1#2{#2}
\detokenize\expandafter{\ifnum0=0\expandafter\useIInnn\fi\useIInn{1}{\BOOM}}
\bye

它的输出是(对我来说很惊讶):

\relax \fi {1}{\BOOM }

那个是\relax从哪里来的?


我意识到测试不会导致0=0因为\ifnum会继续扩展标记(据我所知,它会导致0=01错误的结果;我在代码中更正了这一点:)。然而,这\relax对我来说仍然是个谜。

答案1

让我们看看会发生什么。这些标记\ifnum0=0并不是一个完整的测试,因为根据规则,TeX 会扩展标记,直到找到一个不能解释为数字的不可扩展标记;如果这个标记是一个空格,它将被吞掉。然而,TeX 将绝不在确定条件测试的过程中,超越匹配\else或扩展标记。\fi

后面跟着的标记0\expandafter,它扩展了\fi:哦,这意味着必须评估条件!在这种情况下,即每当条件文本在当时\else\fi出现时未完成并且必须扩展时,TeX 都会插入一个特殊\relax标记,称为冻结\relax

\relax在以下情况下您也会得到冻结\if x\fi:在以下情况下为二\if\fi

这是 中的模块 379 tex.web

相关内容