我知道amsmath
包装上的技术说明不能引入直接缩写,例如
\newcommand{\bal}{\begin{align}} % doesn't work
\newcommand{\eal}{\end{align}} % doesn't work
或者
\newcommand{\bal}{\align} % doesn't work
\newcommand{\eal}{\endalign} % doesn't work
令我困惑的是
\newenvironment{foo}{\align}{\endalign}
做工作,至少如果一个人足够乖巧,能够勤奋地打字\begin{foo}...\end{foo}
,因为\foo...\endfoo
也不会工作。
我真的很感激有人能帮我解释一下幕后发生的事情:-)
答案1
基本上,\begin{align}
执行\align
,进而调用\start@align
。
这个宏记录了里面的内容\@currenvir
并进行设置,以便环境中要吸收的内容就是第一次出现的任何内容\end{align}
。
如果你这样做
\newenvironment{foo}{\align}{\endalign}
的执行\begin{foo}
将设置\@currenvir
为foo
,因此\start@align
将使 TeX 吸收 之前的所有内容\end{foo}
,然后执行\endfoo
(在本例中,它只是\endalign
)。
这就解释了为什么
\newenvironment{foo}{\begin{align}}{\end{align}} % WRONG!
不起作用:\start@align
执行时,\begin
已设置\@currenvir
为align
,并且不会有明确的 \end{align}
被发现。
environ
处理时使用相同的策略\NewEnviron
,因此如果我们想根据它们定义新的环境,用它定义的环境也必须出现在“宏形式”中。