Добавить список токенов к \everymath

Добавить список токенов к \everymath

Я подражал Дональду Кнуту, установив |в качестве дословного разделителя. Чтобы придать ему нормальное значение в математическом режиме, я установил

\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

Связанный контент