我尝试以嵌套的方式使用两个 Environ,但得到了
! Argument of \marray has an extra }
错误。知道为什么会发生这种情况吗?
\documentclass{minimal}
\usepackage{amsmath,environ}
\NewEnviron{meqmultinum}[1]{
\begin{equation}\begin{split}
\BODY
\end{split}\label{eq:#1}\end{equation}
}
\NewEnviron{marray}[2]{
\renewcommand*{\arraystretch}{#2}
\begin{array}{#1}
\BODY
\end{array}
}
\begin{document}
\begin{meqmultinum}{test}
a&=\begin{marray}{l l}{1.2}
\alpha & \beta\\
\gamma & \kappa
\end{marray}\\
b&=\begin{array}{l l}
\alpha & \beta\\
\gamma & \kappa
\end{array}
\end{meqmultinum}
\end{document}
答案1
环境split
内部meqmultinum
提供对齐。这意味着环境的内容是逐个单元处理的:
单元格 1: a
单元格 2:=\begin{marray}{l l}{1.2} \alpha
其余部分& \beta \\ \gamma & \kappa \end{marray}
不属于单元格 2。因此 的代码\begin{marray}
会抱怨,因为它\end
找不到\end{marray}
。
可以通过在周围添加花括号来解决这个问题\begin{marray}...\end{marray}
:
\begin{meqmultinum}{test}
a&={\begin{marray}{l l}{1.2}
\alpha & \beta\\
\gamma & \kappa
\end{marray}}\\
...
\end{meqmultinum}
为什么用array
而不是 呢marray
?环境array
不需要一开始就看到\end{array}
,而是建立一个表格,并在这个内部表格中处理array
和 的内容。&
其他定义marray
David Carlisle 在他的评论中给出了另一种解决此问题的方法。无需environ
对包进行特殊的环境处理array
:
\newenvironment*{marray}[2]{%
\renewcommand*{\arraystretch}{#2}%
\begin{array}{#1}%
}{%
\end{array}%
}
答案2
没有必要\NewEnviron
在这些环境中使用;在这种情况下split
可能会出现问题,但aligned
可以代替使用。
\documentclass{article}
\usepackage{amsmath}
\newenvironment{meqmultinum}[1]
{\equation\label{eq:#1}\aligned}
{\endaligned\endequation}
\newenvironment{marray}[2]
{\renewcommand*{\arraystretch}{#2}\array{#1}}
{\endarray}
\begin{document}
\begin{meqmultinum}{test}
a&=\begin{marray}{l l}{1.2}
\alpha & \beta\\
\gamma & \kappa
\end{marray}\\
b&=\begin{array}{l l}
\alpha & \beta\\
\gamma & \kappa
\end{array}
\end{meqmultinum}
\end{document}