LaTeX 定义\vec
为
\DeclareMathAccent{\vec}{\mathord}{letters}{"7E}
最终扩展为
\mathaccent"017E\relax
而 plainTeX 将其定义为
\def\vec{\mathaccent"017E }
\relax
用空格替换。
有什么实际区别吗?
答案1
语法\mathaccent
是(TeXbook,第 291 页)
\mathaccent
⟨15 位数⟩⟨数学字段⟩
⟨15 位数⟩ 是介于 0–2 15之间的整数(以 LaTeX 允许的任何表示法表示) 。什么是 ⟨数学字段⟩?我们在第 289 页找到它
⟨数学字段⟩ → ⟨填充⟩⟨数学符号⟩ | ⟨填充⟩
{
⟨数学模式材料⟩}
⟨填充符⟩ 是任意的空格标记和标记序列,\relax
在处理输入流寻找符合语法规则的内容时,这些序列会被忽略(进行扩展)。
因此,在 LaTeX 中,\relax
将被吞噬为 ⟨filler⟩,而在纯 TeX 中,空格终止了数字的规范并同样会被忽略。
为什么 LaTeX 使用\relax
?答案就在 的定义中,\DeclareMathAccent
它在内部使用\set@mathaccent
:
% latex.ltx, line 3596:
\def\set@mathaccent#1#2#3#4{%
\xdef#2{\mathaccent"\mathchar@type#3\hexnumber@#1#4\relax}}
选择可能取决于何时写入辅助文件\relax
更适合该工作这一事实。