
LaTeX 定義\vec
為
\DeclareMathAccent{\vec}{\mathord}{letters}{"7E}
最終擴展到
\mathaccent"017E\relax
而 plainTeX 則將其定義為
\def\vec{\mathaccent"017E }
替換\relax
為空格。
有什麼實際差異嗎?
答案1
的語法\mathaccent
是 (TeXbook, p. 291)
\mathaccent
⟨15 位數⟩⟨數學場⟩
⟨15 位數字⟩ 是一個 0–2 15範圍內的整數(LaTeX 允許的任何表示形式)。什麼是⟨數學場⟩?我們在第289頁找到它
⟨數學場⟩ → ⟨填充物⟩⟨數學符號⟩ | ⟨填充物⟩
{
⟨數學模式素材⟩}
⟨filler⟩ 是任何空格標記和\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
更適合這項工作的事實。