解析奇异点:什么时候空格不是空格

解析奇异点:什么时候空格不是空格

\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

相关内容