\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' align
。align
环境(与环境不同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
不过,我认为这种方法并没有什么用,只不过是代码混淆而已。