catcode-10 标记的字符代码

catcode-10 标记的字符代码

请考虑以下纯 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”这一说法本质上是正确的,但并非全部事实,因为一些秘传可能会进入其中。

相关内容