![为什么TeX中有256个不同的长度为2的控制序列和256^2个长度为3的控制序列?](https://linux22.com/image/470410/%E4%B8%BA%E4%BB%80%E4%B9%88TeX%E4%B8%AD%E6%9C%89256%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E9%95%BF%E5%BA%A6%E4%B8%BA2%E7%9A%84%E6%8E%A7%E5%88%B6%E5%BA%8F%E5%88%97%E5%92%8C256%5E2%E4%B8%AA%E9%95%BF%E5%BA%A6%E4%B8%BA3%E7%9A%84%E6%8E%A7%E5%88%B6%E5%BA%8F%E5%88%97%EF%BC%9F.png)
在这本书的第 11 页TeXbook,有一个疑问:
长度为 2 的不同控制序列(包括转义符)有多少种可能?长度为 3 的不同控制序列又有多少种可能?
答案是:
长度为 2 的控制序列共有 256 个;其中大多数在 TEX 开始时未定义。(TEX 允许任何字符作为转义符,但它不区分以不同转义符开头的控制序列。)如果我们假设有 52 个字母,则长度为 3 的控制序列恰好有 522 个(每对字母一个,从 AA 到 zz)。但第 7 章解释了如何使用 \catcode 将任何字符更改为“字母”;因此可以使用 256^2 个长度为 3 的潜在控制序列中的任何一个。
这个256是怎么算出来的,256^2又是怎么算出来的?我看不懂答案。
答案1
事实上,存在 256 个 2 个字母的序列和 256×256 个 3 个字母的序列,这只是因为在经典 TeX(和 pdfTeX)中,字符代码是 0 到 255 之间的数字。因此,有 256 个长度为 1 的名称和 256×256 个长度为 2 的名称(每个名称前面都有一个转义字符)。
字符代码的上限 255 在 tex 语法(例如\char
或 )中的任何地方都是明确的\mathchar
。
如果你尝试\char256
在 tex 或 pdftex 中,你将收到一个错误
! Bad character code (256).
l.3 \char256
? h
A character number must be between 0 and 255.
I changed this one to zero.
?
在 xetex 或 luatex 中,上面的 255 需要替换为最大的 Unicode 值,即十六进制 10FFFF = 十进制 1114111,因此包括转义符在内共有 1114112 个代码 0-1114111 和 114112×114112=1241245548544 三个字符序列。
使用 luatex 您将获得
! Bad character code (1114112).
l.7 \char"110000
? h
A character code must be between 0 and 1114111.
I changed this one to zero.
?
从\char"110000