练习 8.6。假设纯 TEX 的类别代码有效,但字符
^^A
、^^B
、^^C
分别^^M
属于类别 0、7、10 和 11。从(相当荒谬的)输入行 产生了哪些标记^^B^^BM^^A^^B^^C^^M^^@\M␣
?(请记住,此行后面跟着 ⟨return⟩,即^^M
;并回想一下^^@
表示 ⟨null⟩ 字符,当 INITEX 开始时,它的类别为 9。)
回想一下,0
代表转义,7
代表上标,10
代表空格,11
代表字母。
给出的答案是:
^^B
7
^^B
7
M
11
|^^B|
␣
10
^^M
7
|M^^M|
.
(我习惯用|cs|
“cs”来表示控制序列名称。)
问题:为什么␣
10在那里!?首先,^^C
后面跟着一个非字母字符^^A^^B
(转义字符后跟一个非字母),因此进入状态 S(不是M),并且明确地写出在这种情况下,任何空格字符都“只是被忽略”。
答案1
第 47 页对此进行了解释:
如果 TeX 看到类别 10 的字符,则操作取决于当前状态。如果处于状态 N 或 S,则忽略该字符并保持相同状态。否则,在状态 M 下,字符将转换为空格(字符代码 32),类别代码为 10,并进入状态 S。空格标记中的字符代码始终为 32。
第 46 页:
如果 TeX 在任何状态下看到类别 0,… (b) 如果下一个字符不属于类别 11,则名称由该符号组成。… 此名称将成为控制序列标记。对于类别 10 的字符,TeX 在情况 (b) 中进入状态 S…,否则 TeX 进入状态 M。
因此之后它处于状态 M ^^A^^B
,因为^^B
它不属于第 10 类。
答案2
在转义字符后跟一个非 catcode 11 的字符后,tex 进入状态 M,除非该字符是空格。因此,空格会在之后跳过,\
但不会跳过之后\$
或之后^^A^^B