我模仿了 Donald Knuth,将其设置|
为逐字分隔符。为了在数学模式下赋予其正常含义,我设置了
\everymath{\catcode`\|=12}
\everydisplay{\catcode`\|=12}
但我想附加而不是\everymath
删除其之前的内容(如果有的话)。我试过
\everymath{a}
\everymath{\the\everymath b}
但它不起作用。有什么想法吗?
PS:这个问题是关于纯 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 中找到原因)。
让我们尝试一个纯 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