说
\count89=14 \the\count89~{\count89=11 \the\count89~}\the\count89
产生14 11 14
,正如人们所期望的那样。但是,删除中间子句中的空格:
\count89=14 \the\count89~{\count89=11\the\count89~}\the\count89
然后你得到了14 14
。这也是有道理的,因为解析器必须吃掉所有的11\the\count89
而没有空格来终止输入。
到目前为止,一切都很好,但是中间从句实际上起什么作用呢?试试
\count89=14 \the\count89~{\count89=11\the\count89 \the\count89~}\the\count89
然后你得到了14 14
。注意中间子句中的额外空格。然而没有输出。解析器必须吃掉到结束括号的所有内容并将其分配给\count89
。我知道\the\count89
计算结果为一系列分配了other
类别代码的标记。我认为这可能会以某种方式使解析器进入“吃掉所有内容”状态,直到结束括号,但事实并非如此。如果你说
\count89=14 \the\count89~{\count89=11\the\count89~\the\count89~}\the\count89
(注意附加的~
),那么输出就是14 1114 14
,这正是人们所期望的。
这是怎么回事?为什么~
可以终止输入值,而普通空格却不能?
答案1
从
\count89=14 \the\count89~{\count89=11 \the\count89~}\the\count89
你会得到14 11 14
,正如你所说,这是意料之中的。让我们看看
\count89=14 \the\count89~{\count89=11\the\count89~}\the\count89
在11
没有空格之后,TeX 继续扩展,直到找到~
。这是一个活动字符,因此它的行为类似于宏,其扩展以 开始\penalty
。现在 TeX 找到的数字是1114
,它设置\count89
为该值。括号使它忘记赋值,你会得到
14 14
两个 用两个空格表示~
。在赋值语句中搜索<number>
会继续使用宏扩展,直到找到不能解释为数字的内容。
如果在此扩展过程中发现空格标记,则停止搜索数字并吞噬。但~
会扩展为\penalty10000\
,因此保留。
更多解释
A太空代币在上述意义上,是类别代码为 10 的显式字符。当 TeX 寻找数字来执行分配时,它将进行宏扩展(包括可扩展基元),并且如前所述,当扩展后发现非数字时,它将停止。如果停止是由空格标记引起的,它将被忽略;否则,在分配完成后,将再次读取导致停止的标记。
因此,在第二个示例中,\the\count89~
变为14\penalty10000\
,赋值变为\count89=1114
,但\penalty10000\
将在排版阶段进行处理。使用以下命令可获得相同的输出
{\count89=11\the\count89\ }
因为\
不是空格标记。它在输出中产生一个空格,但这是完全不相关的事。
答案2
在读取 89 时,内部\count89
空间被吸收,因此 tex seees 计数寄存器 89
但这意味着当外部赋值寻找值时,空间不存在
\count89=11\the\count89 \the\count89