为了使“\”成为第 12 类,为什么要在 TeX 中将其转换为第 13 类?

为了使“\”成为第 12 类,为什么要在 TeX 中将其转换为第 13 类?

第 40 页的练习 7.5TeXbook要求归类\为12类。这个问题的答案是

{\catcode‘/=0 \catcode‘\\=13 /message{/string\}}

为什么应该将其分配\给13而不是12?

这个答案的解释是

(当 \csname 和 \endcsname 之间没有标记时获得的 “空控制序列” 不是本练习的解决方案,因为 \string 会将其转换为 '\csname\endcsname'。但是,还有另一种解决方案:如果 TEX 的 \escapechar 参数 — — 将在下一个危险弯道中解释 — — 为负数或大于 255,则 '\str​​ing\' 有效。)

  1. 当 \csname 和 \endcsname 之间没有标记时,您获得的“空控制序列”不是此练习的解决方案

这是什么意思?

  1. 如果 TEX 的 \escapechar 参数(将在下一个危险弯道中解释)为负数或者大于 255,则 '\str​​ing\' 有效。)

这是什么意思?

很难理解他们。

答案1

解释在练习的解决方案中。Knuth建议尝试

\message{\string~}
\message{\string\~}

看到结果分别是~\~。事实上,你在输出中得到了这些字符\message,这确实满的对输入的标记进行扩展,意味着这些字符具有“可打印类别代码”,在本例中恰好是 12。

如果你尝试,\message{\string\}你不会走得太远,因为它\}变成了一个单一的标记,而不是一个右括号。

但是,通常为活动字符的示例~告诉您可以使反斜杠处于活动状态(在组中,因此它将在组末恢复其标准行为)并对其进行“字符串化”:

{\catcode`/=0 \catcode`\\=\active /message{/string\}}

当然,如果您想要一个类别代码为 12 的“可用”反斜杠,您需要为其定义一个宏:

{\catcode`/=0 \catcode`\\=\active /xdef/bschar{/string\}}

或者(你可能想研究一下这是如何工作的)

\begingroup\lccode`~=`\\ \lowercase{\endgroup\edef\bschar{\string~}}

另一个解决方案(Knuth 暗示的)是

{\escapechar=-1 \xdef\bschar{\string\\}}

所有这三种方式最终都\bschar扩展为类别代码为 12 的反斜杠。

你也可以这样做

\chardef\bschar=`\\

但这会导致\bschar一个不可扩展的 token印刷一个反斜杠(假设字体在插槽 92 处有一个反斜杠)。

\是否有必要使用类别代码 13?完全没有必要。控制台上将显示以下内容:

{\catcode`/=0 \catcode`\\=1 /message{/string\}}
{\catcode`/=0 \catcode`\\=2 /message{/string\}}
{\catcode`/=0 \catcode`\\=3 /message{/string\}}
{\catcode`/=0 \catcode`\\=4 /message{/string\}}
{\catcode`/=0 \catcode`\\=6 /message{/string\}}
{\catcode`/=0 \catcode`\\=7 /message{/string\}}
{\catcode`/=0 \catcode`\\=8 /message{/string\}}
{\catcode`/=0 \catcode`\\=11 /message{/string \}}
{\catcode`/=0 \catcode`\\=12 /message{/string\}}
{\catcode`/=0 \catcode`\\=13 /message{/string\}}

请注意 catcode 11 中的(强制)空格。当然,在其他情况下也可以使用空格。

相关内容