![忽略字符作为控制符号](https://linux22.com/image/327162/%E5%BF%BD%E7%95%A5%E5%AD%97%E7%AC%A6%E4%BD%9C%E4%B8%BA%E6%8E%A7%E5%88%B6%E7%AC%A6%E5%8F%B7.png)
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