Amsmath 环境吞噬 \active 角色

Amsmath 环境吞噬 \active 角色
\documentclass{amsart}
{\catcode`\z\active
\global\def\activate{\catcode`\z\active\defz{active}z}}
\begin{document}
{\activate z} %1
\begin{equation}\activate z\end{equation} %2
\begin{align}\activate z\end{align} %3
{\activate\begin{align}z\end{align}} %4
\end{document}

(1) 和 (2) 的表现与我预期的一样,打印出 'activeactive'(在显示的等式中,对于 (2))。但是,(3) 打印出 'activez',我不知道为什么。

编辑:(4) 的行为也符合我的预期,在 之前打印出 'active' align,然后在 内部打印另一个 'active' alignalign环境(与环境不同equation)是否将其主体读取为参数?

答案1

AMS 对齐将其主体视为命令的参数,因此与任何 catcode 更改一样,您的\activate\verb等将不起作用。

这是有记录的限制,说明为什么您不能定义类似的简写,\ba \ea而必须使用\begin...\end语法。

主体被设置两次以进行测量和布局测试,因此代码将主体作为参数,以便可以重复使用。

答案2

您可以使用数学活动字符而不是活动字符,这样不需要更改类别代码,从而避免了由于将align内容作为宏的参数加载而导致的问题。

\documentclass{article}
\usepackage{amsmath}

\mathchardef\equal=\mathcode`=

\newenvironment{autoalign}
  {\activateequal\align}
  {\endalign}
\newcommand{\activateequal}{%
  \mathcode`==\string"8000
  \begingroup\lccode`~=`=
  \lowercase{\endgroup\def~}{&\equal}%
}

\begin{document}

\begin{align}
a     &= b+c \\
a^{2} &= b^{2}+2bc+c^{2}
\end{align}

\begin{autoalign}
a     = b+c \\
a^{2} = b^{2}+2bc+c^{2}
\end{autoalign}

\end{document}

autoalign环境中,=将字符设为数学活动 (mathcode "8000),并将其活动版本定义为。然后启动&\equal正常环境。align

不过,我认为这种方法并没有什么用,只不过是代码混淆而已。

在此处输入图片描述

相关内容