如果我将数字的类别代码更改为 11,会发生什么情况?(即 \makedigitsletter)

如果我将数字的类别代码更改为 11,会发生什么情况?(即 \makedigitsletter)

这个帖子,@Heiko Oberdiek 说

但是 TeX 期望的每个数字都必须是 catcode 12(问题)!例如。\hspace{1em}

他说的“每个数字”是什么意思?除了计数器/尺寸/胶水外,以下哪个会损坏?

\def\cs#1{}
\box 255
\numexpr 1+1 \relax
\ifcase 1 ... \fi
\char"26
$1+1$

(请随意扩展列表)

答案1

从 TeXbook 第 269 页借用的语法方案中可以立即看出,本质上全部如果数字的类别代码为 11 而不是 12,则需要数字的句法结构将会中断。

⟨数字⟩ → ⟨可选符号⟩⟨无符号数⟩ ⟨可选
符号⟩ → ⟨可选空格
⟩ | ⟨可选符号⟩⟨正数或负数⟩⟨
可选空格⟩ ⟨无符号数⟩ → ⟨普通整数⟩ | ⟨强制整数⟩
⟨普通整数⟩ → ⟨内部整数⟩
| ⟨整数常量⟩⟨一个可选空格⟩
| '12 ⟨八进制常量⟩⟨一个可选空格⟩
| "12 ⟨十六进制常量⟩⟨一个可选空格⟩
| `12 ⟨字符标记⟩⟨一个可选空格⟩
⟨整数常量⟩ → ⟨数字⟩ | ⟨数字
⟩⟨整数常数⟩ ⟨八进制常数⟩ → ⟨八进制数字⟩ | ⟨八进制数字⟩⟨八进制常数⟩ ⟨十六进制常数⟩ → ⟨十六进制数字⟩ | ⟨十六进制数字⟩⟨十六进制常数⟩ ⟨八进制数字⟩ → 12 | 12 | 12 | 12 | 12 |
12 | 12 |
12 0数字12进制数字 | 12 | 12十六进制 数字 数字⟩ | 11 | 11 | 11 | 11 | 12 | 12 | 12 | 12 ⟨一个可选空格⟩ → ⟨空格标记⟩ | ⟨空⟩ ⟨强制整数⟩ → ⟨内部尺寸⟩ | ⟨内部胶水⟩34567
89
ABCDEF
ABCDEF

同样,像这样的定义\def\cs#1{...}也会被破坏,因为如果我们想要一个参数,语法规定后面的数字#有类别代码 12。

你不会有问题印刷数字,但诸如此类的简单的事情\\[1ex]就会严重崩溃。

你可能总是\detokenize需要语法数字,因为 TeX 在需要 ⟨number⟩ 时会执行扩展:

\hspace{\detokenize{1}em}

将在文档中起作用。这值得这么痛苦吗?

相关内容