请考虑以下纯 TeX 手稿
\catcode`z=10
\newcount\charcode
\charcode=`z
\font\myfont=cmtt14\myfont
character code = \the\charcode, category code = \the\catcode\charcode
\end
手稿首先将字母的类别代码z
(ASCII 122)设置为10
。然后将字母z
的字符代码存储在计数器 中\charcode
。然后将字体更改为 Computer Modern Typewriter。最后,它将存储在 中的数字\charcode
以及相应的类别代码排版。
当使用 pdftex 编译此稿件时,生成的排版文本为
字符代码 = 32,类别代码 = 10
因此看起来,改变字母的类别代码z
也会将其字符代码从 122 更改为 32。
这种行为是在 TeXbook 或 TeX 引擎的源代码中指定的吗,或者它是 pdftex 中的一个错误?
答案1
TeXbook,第 47 页,第四个双重危险段落:
如果 TeX 遇到类别 10(空格)的字符,则操作取决于当前状态。如果 TeX 处于状态否或者年代,字符只是被略过,TeX 保持相同的状态。否则 TeX 处于状态米;该字符被转换为字符代码为 32 的类别 10 的标记,并且 TeX 进入状态年代。空格标记中的字符代码始终为 32。
这涉及到标记化阶段。然而,这本书并没有立即说出全部真相,这应该通过对“有趣的空间”的讨论来补充(第 377-378 页):
情况出奇地复杂,因为可以使用来创建像10
\uppercase
这样的“有趣的空间”标记;例如,命令*
\uccode` =`* \uppercase{\uppercase{\def\fspace{ }\let\ftoken= } }
创建
\fspace
一个扩展为 funny space 的宏,它们会创建\ftoken
一个隐式 funny space。(假设 的类别为 12 ,则测试\if\fspace*
、\if\ftoken*
、\ifcat\fspace\stoken|
和\ifcat\ftoken\stoken
都将为真;但如果的类别为 10,则将为假,因为 TeX 将所有新创建的空间标记标准化为10,如第 8 章所述。)由于各种形式的空间标记在行为上几乎相同,因此没有必要纠结于细节。*
*
\if\fspace*
⍽
有趣的空格只能通过\uppercase
或\lowercase
以各种方式创建。因此,“空格标记中的字符代码始终为 32”这一说法本质上是正确的,但并非全部事实,因为一些秘传可能会进入其中。