
Я подражал Дональду Кнуту, установив |
в качестве дословного разделителя. Чтобы придать ему нормальное значение в математическом режиме, я установил
\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>...}
Если вы хотите использовать Plain TeX без расширений e-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
А. Эллет дал ответ в комментариях (правка: \expandafter
нужен только один):
\everymath{a}
\everymath\expandafter{\the\everymath b}
устанавливает \everymath
дляab