所以我有以下代码:
\newcount\x\x\i
\ifnum\x<3 \advance\x1 \fi
\the\x
\bye
我从命令行调用它,pdftex '\def\i{9}\input test.tex'
这将输出 10(或 \i + 1),这意味着将\ifnum
被忽略,而\advance
始终执行。如何让 TeX 正确处理\ifnum
?
答案1
\x\i
扩展\i
以寻找数字来形成整数,因此它继续扩展\ifnum
;在这种情况下,\x
仍然设置为 0。注意不之后的空格\i
和换行符将被忽略。
在 后添加\relax
或。\space
\i
\newcount\x\x\i\relax
\ifnum\x<3 \advance\x1 \fi
\the\x
\bye
或者,空白行也很好
\newcount\x\x\i
\ifnum\x<3 \advance\x1 \fi
\the\x
\bye
因为插入的\par
标记将停止查找新数字。
让我们看看你的代码会发生什么。首先 TeX 定义一个新的计数器\x
并\newcount\x
消失。接下来,看到 后\x
,TeX 知道它必须执行分配;=
后面跟着 no(它也会消失)并被\i
扩展;但是,根据规则,TeX 将继续扩展标记,直到找到不能解释为十进制数字的东西(类别代码为 12 的显式标记和对应于 0 到 9 的数字的字符代码)。
的扩展\ifnum
包括两个步骤;首先执行测试,在这种情况下它返回 true,因为赋值尚未完成;然后条件与测试一起消失,并且保留 true 文本(否则匹配或之前的任何内容都将\else
被\fi
跳过)。因此我们有
\x=9 \advance\x1 \fi
后面的空格9
会停止扩展,并且按照规则会被忽略。然后\x
被赋值 9 并前进。接下来\fi
会进行扩展,但其扩展为空。
使用\i\relax
,执行分配,然后\ifnum
进行检查。