
我模仿 Donald Knuth 設定|
為逐字分隔符號。為了在數學模式下賦予它正常的含義,我設定了
\everymath{\catcode`\|=12}
\everydisplay{\catcode`\|=12}
不過我想附加這而\everymath
不是刪除其先前的內容(如果有)。我試過了
\everymath{a}
\everymath{\the\everymath b}
但它不起作用。任何想法?
PS:這個問題是針對plain TeX的。
答案1
這個方法行不通:如果你有,比如說,
\section{Proof that $|x|\ge 0$}
的設定\catcode`|=12
不會生效,因為|
已經被標記化了。
最安全的方法是說
\catcode`|=\active
\protected\def|{\ifmmode\expandafter\vert\else\expandafter\activebar\fi}
\def\activebar{...<whatever you want>...}
如果您想使用不帶有 e-TeX 擴充功能的 Plain TeX,則產生的命令將非常脆弱,因此請小心使用:
\def|{\relax\ifmmode\expandafter\vert\else\expandafter\activebar\fi}
\relax
(你可以在 TeXbook 中找到原因)。
讓我們嘗試一個 Plain TeX 文件:
\input manmac
\everymath\expandafter{\the\everymath\catcode`|=12 }
\everydisplay\expandafter{\the\everydisplay\catcode`|=12 }
\beginsection $|x|$ is never negative.
|the $p$-norm| is
$$
\Vert x\Vert=\root p\of{|x_1|^p+\cdots+|x_n|^p}
$$
\bye
你得到
! Argument of \\ has an extra }.
<inserted text>
\par
<to be read again>
}
因為|
當 的論證\beginsection
被吸收時已經被標記化了。
和
\input manmac
\let\manmacbar| % after manmac | is active
\protected\def|{%
\ifmmode
\expandafter\vert
\else
\expandafter\manmacbar
\fi
}
\beginsection $|x|$ is never negative.
|the $p$-norm| is
$$
\Vert x\Vert=\root p\of{|x_1|^p+\cdots+|x_n|^p}
$$
\bye
您不會收到任何錯誤,並且輸出是預期的:
答案2
A. Ellet 在評論中給了答案(編輯:只\expandafter
需要一個):
\everymath{a}
\everymath\expandafter{\the\everymath b}
設定\everymath
為ab