以下代码(用作\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}