我怎样才能防止 \ifnum 被忽略?

我怎样才能防止 \ifnum 被忽略?

所以我有以下代码:

\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进行检查。

相关内容