将标记列表附加到 \everymath

将标记列表附加到 \everymath

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

设置\everymathab

相关内容