將標記清單附加到 \everymath

將標記清單附加到 \everymath

我模仿 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}

設定\everymathab

相關內容