如何在 align 环境中正确使用 \collect@body

如何在 align 环境中正确使用 \collect@body

以下代码(用作\collect@body该特定问题的测试用例的示例)修改bmatrix不是添加周围的[]。这似乎工作正常,但当我尝试在环境中使用它时,需要插入一个额外的括号组align

在此处输入图片描述

如果没有额外的括号组,我得到:

\bmatrix 的参数有一个额外的}。

问题:

我该如何修改它,以便当我尝试使用该环境时不需要添加额外的括号组bmatrix

代码:

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand{\@MatrixWithoutBracs}[1]{%  
    \begin{matrix}%
        #1%  content
    \end{matrix}
}
\renewenvironment{bmatrix}{%
    \collect@body\@MatrixWithoutBracs%
}{}%
\makeatother

\begin{document}\noindent
In \verb|equation| things work
\begin{equation*}
    A = \begin{bmatrix}
            a_{11} & a_{12} \\
            a_{21} & a_{22} \\
        \end{bmatrix}
\end{equation*}
and in \verb|align| had to use an extra brace group:
\begin{align*}
   A &= {\begin{bmatrix}
            a_{11} & a_{12} \\
            a_{21} & a_{22} \\
        \end{bmatrix}}
\end{align*}
\end{document}

答案1

问题出在&子环境中的标记,这些标记应该受到保护,不受外部环境的影响。Knuth 经常在 LaTeX 中使用这种卑鄙的伎俩。

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand{\@MatrixWithoutBracs}[1]{%  
    \begin{matrix}
        #1%  content
    \end{matrix}%
}
\renewenvironment{bmatrix}
   {{\ifnum0=`}\fi\collect@body\@MatrixWithoutBracs}
   {\ifnum0=`{\fi}}
\makeatother

\begin{document}

\noindent
In \verb|equation| things work
\begin{equation*}
    A = \begin{bmatrix}
            a_{11} & a_{12} \\
            a_{21} & a_{22} \\
        \end{bmatrix}
\end{equation*}
and in \verb|align| had to use an extra brace group:
\begin{align*}
   A &= \begin{bmatrix}
            a_{11} & a_{12} \\
            a_{21} & a_{22} \\
        \end{bmatrix}
\end{align*}

\end{document}

在此处输入图片描述

相关内容