我正在尝试通过使用 catcodes 使某些包含大量特殊字符的方程式更易读。
这有效:
\documentclass[12pt]{book}
\begin{document}
$$
\catcode`X\active
\defX{\times}
X
$$
\begin{equation}
\catcode`X\active
\defX{\times}
X
\end{equation}
\[
\catcode`X\active
\defX{\times}
X
\]
\end{document}
但当我\usepackage{autonum}
,第三个选项 ( \[\]
) 会显示“未定义的控制序列”。有没有办法解决这个问题,而不是总是选择第二个选项?
[MiKTeX 2014 年 1 月 31 日]
编辑:在实际文档中,我仅使用后者内部的自定义环境来切换方程式特定部分的 catcode。因此,虽然重新定义方程式外部的 catcode 可以发挥作用,但这个问题更多的是关于如何在不彻底颠覆方程式的情况下做到这一点。
答案1
您可以让数学变得活跃,而不是让角色变得活跃。
\documentclass[12pt]{book}
\usepackage{autonum}
\usepackage{xparse}
\NewDocumentCommand{\activate}{mO{0}m}{%
\begingroup\lccode`~=`#1\relax
\lowercase{\endgroup\newcommand~}[#2]{#3}%
\mathcode`#1="8000
}
\begin{document}
\begin{equation}
\activate{X}{\times}
X
\end{equation}
\[
\activate{X}{\times}
X
\]
\end{document}
你甚至可以说
\begin{equation}
\activate{X}[1]{\times_{#1}}
X{3}
\end{equation}
您可以想象更好的应用程序。
答案2
以下是根据 OP 评论进行的编辑。在这种情况下,我仍然在结构之前分配新的 catcode \[ \]
,但演示我可以将其重新分配给结构内的其他内容\[ \]
。这是否更好地帮助了 OP?
\documentclass[12pt]{book}
\usepackage{autonum}
\catcode`X\active
\def\xact{\catcode`X\active\defX{\times}}
\def\xnormA{\defX{A}\catcode`X11}
\def\xnormX{\defX{\char88}\catcode`X11}
\catcode`X11
\begin{document}
$$
\xact
X
$$
\begin{equation}
\xact
X
\end{equation}
{\xact
\[
X \textrm{~becomes~} \xnormA X \textrm{~becomes~} \xnormX X
\textrm{~becomes~} \xact X
\]
}
\centering X returns as normal
\end{document}
答案3
编辑:对于方程式,egreg 的解决方案似乎是最合适的。我在这里保留旧的解决方案作为替代方案,它可能在更一般的上下文中有用(例如在宏参数和棘手的环境中更改 catcode)。
根据记录,我最终得到的解决方案本质上是\scantokens
内部(不?)健康剂量的 es\[\]
和一些替代的数学环境:
\let\oldEquationBracket\[
\def\[#1\]{\oldEquationBracket\scantokens{#1}\]}
\def\xalignImpl#1{\begin{align}\scantokens{#1}\end{align}}
\makeatletter
\newenvironment{xalign}{\collect@body\xalignImpl}{}
\makeatother
...
(如果能提供如何将其放入align
自身而不是定义新环境的提示,我们将不胜感激。)此解决方案可能有隐藏的问题,也可能没有,但它似乎适用于我的用例。