在这个帖子,@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 |
120
⟨数字1
⟩ →2
⟨八进制数字 ⟩ | 12 | 12 ⟨十六进制 数字⟩ → ⟨ 数字⟩ | 11 | 11 | 11 | 11 | 12 | 12 | 12 | 12 ⟨一个可选空格⟩ → ⟨空格标记⟩ | ⟨空⟩ ⟨强制整数⟩ → ⟨内部尺寸⟩ | ⟨内部胶水⟩3
4
5
6
7
8
9
A
B
C
D
E
F
A
B
C
D
E
F
同样,像这样的定义\def\cs#1{...}
也会被破坏,因为如果我们想要一个参数,语法规定后面的数字#
有类别代码 12。
你不会有问题印刷数字,但诸如此类的简单的事情\\[1ex]
就会严重崩溃。
你可能总是\detokenize
需要语法数字,因为 TeX 在需要 ⟨number⟩ 时会执行扩展:
\hspace{\detokenize{1}em}
将在文档中起作用。这值得这么痛苦吗?