我不太熟悉 TeX 的分类代码。如果我使用
\catcode`\|=13 \renewcommand{|}{hello world}
那么我的文档中所有 都|
将被 替换hello world
。但是,我如何才能继续打印符号呢|
?当然,循环引用
\catcode`\|=13 \renewcommand{|}{hello|world}
不起作用(超出了 TeX 的强大容量),尽管我希望所有 的实例都|
打印为。如果我没记错的话,上面的代码只适用于常规文本模式。如果要在数学模式下使用hello|world
,上面的代码会有什么变化?|
答案1
通常采用两种方法来解决这个问题。
A
在更改 catcode 之前,将具有原始 catcode 的字符保存在宏中。这是有效的,因为 catcode 是在输入时分配的。
\documentclass{article}
\newcommand{\mypipe}{|}
\catcode`\|=\active
\renewcommand{|}{hello\mypipe world}
\begin{document}
|
\end{document}
乙
使用 强制将 catcode 设置|
为 12 \string
:
\documentclass{article}
\catcode`\|=\active
\renewcommand{|}{hello\string|world}
\begin{document}
|
\end{document}
数学模式
字符也可以仅在数学模式下处于活动状态,即其数学代码可以是"8000
。为了在这种情况下获得原始含义,可以定义一个控制序列作为字符前一个数学代码的同义词:
\mathchardef\mymathpipe=\mathcode`\|
看看实施情况icomma
包作为示例。