![为了使“\”成为第 12 类,为什么要在 TeX 中将其转换为第 13 类?](https://linux22.com/image/471291/%E4%B8%BA%E4%BA%86%E4%BD%BF%E2%80%9C%5C%E2%80%9D%E6%88%90%E4%B8%BA%E7%AC%AC%2012%20%E7%B1%BB%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%9C%A8%20TeX%20%E4%B8%AD%E5%B0%86%E5%85%B6%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%AC%AC%2013%20%E7%B1%BB%EF%BC%9F.png)
第 40 页的练习 7.5TeXbook要求归类\
为12类。这个问题的答案是
{\catcode‘/=0 \catcode‘\\=13 /message{/string\}}
为什么应该将其分配\
给13而不是12?
这个答案的解释是
(当 \csname 和 \endcsname 之间没有标记时获得的 “空控制序列” 不是本练习的解决方案,因为 \string 会将其转换为 '\csname\endcsname'。但是,还有另一种解决方案:如果 TEX 的 \escapechar 参数 — — 将在下一个危险弯道中解释 — — 为负数或大于 255,则 '\string\' 有效。)
-
当 \csname 和 \endcsname 之间没有标记时,您获得的“空控制序列”不是此练习的解决方案
这是什么意思?
-
如果 TEX 的 \escapechar 参数(将在下一个危险弯道中解释)为负数或者大于 255,则 '\string\' 有效。)
这是什么意思?
很难理解他们。
答案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 中的(强制)空格。当然,在其他情况下也可以使用空格。