忽略字符作为控制符号

忽略字符作为控制符号

TeXbook 练习 8.2(f) (作者 Knuth) 表示不是忽略的字符可能会出现在控制序列名称中间。但以下方法有效...

\catcode`\t=9 \def\t{\TeX} \t \end

这是为什么?

答案1

他的意思是,虽然该 catcodet会被忽略,因此TetX会打印为 TeX,但在标记化时不会被忽略,因此\TetX不会标记化为\TeX. (并且由于同样的原因,它实际上\t是一个正常的标记,如您所展示的)。

答案2

我将引用我的书“TeXbook naruby”第 22 页。

标记处理器规则的优先级很重要。第一条规则(优先级最高)是 (a)“双插入符号”规则。第二条规则是当出现 catcode 为 0 的字符时“创建控制序列”(b)。这条规则规定:

有两种方法。如果第一个字符(catcode 0 之后)具有 catcode 11(字母),则控制序列由所有连续的 catcode 11 字符创建,直到行尾或第一个具有不同 catcode 的字符。在这种情况下,令牌处理器进入状态 S(跳过空格)。否则第一个字符不是 catcode 11。然后控制序列的标识符仅包含此字符。仅当\创建了控制序列(反斜杠空格)时,才会在此处应用此后的状态 S。

下一条规则(优先级较低)是(c)“正常标记”和(d)“忽略字符”以及许多其他规则(e)--(i)。

从上面的文字中我们可以看出,在 (b) 级“创建控制序列”中,只有 11 和非 11 的 catcode 会被处理。当然,被忽略的 catcode 是非 11 的,因此由字母组成的控制序列到此为止。但被忽略的字符可以是单个非 11 的控制序列。

答案3

正如其他答案中所述,我们这里的控制序列不是控制字 (转义字符然后是一个或多个字母),而是控制符号 (转义字符然后是一个非字母)。因此,这种情况与所说的没有什么不同\%

忽略字符不能出现在控制字中,这是根据以下规则得出的由 wipet 描述。 因此

\catcode`\t=9
\def\setup{\TeX}
\se up
\seup
\se oops
\end

第二次和第三次使用时会出现错误,但第一次不会:我们定义了一个宏,\se必须接下来是up不是一个名为 的宏。(当然,\seup如果您使用 ,它也会起作用,\setup因为被忽略。)t

相关内容