在新命令中使用 empheq 时出错

在新命令中使用 empheq 时出错

我刚刚开始使用该软件包empheq来创建一个围绕方程式的框。我想创建一对简短的新命令来进入和退出 empheq 环境,但遇到了错误。作为参考,这里有一个可以运行且我想修改的最小代码示例:

\documentclass{minimal} 
\usepackage{empheq}

\newcommand*\widefbox[1]{\fbox{\hspace{2em}#1\hspace{2em}}}

\begin{document}

\begin{empheq}[box=\widefbox]{align}
Y & =Ak^{\alpha}L^{1-\beta}\\
C & =(1-s)Y\\
Y & =C + I + G\\
\Delta K & = I -\delta K
\end{empheq}

\end{document}

其结果为:

盒式方程的最小工作示例

我想创建相同的输出,但不必每次都输入\begin{empheq}[box=\widefbox]{align}\end{empheq}所以我尝试定义两个新命令:

\newcommand{\eqnboxbegin}{\begin{empheq}[box=\widefbox]{align}}
\newcommand{\eqnboxend}{\end{empheq}}

第一个命令按预期工作,但第二个命令有问题。也就是说,此代码可以工作:

\documentclass{minimal} 
\usepackage{empheq}

\newcommand*\widefbox[1]{\fbox{\hspace{2em}#1\hspace{2em}}}
\newcommand{\eqnboxbegin}{\begin{empheq}[box=\widefbox]{align}}

\begin{document}

\eqnboxbegin
Y & =Ak^{\alpha}L^{1-\beta}\\
C & =(1-s)Y\\
Y & =C + I + G\\
\Delta K & = I -\delta K
\end{empheq}

\end{document}

但是此代码会产生错误:

\documentclass{minimal} 
\usepackage{empheq}

\newcommand*\widefbox[1]{\fbox{\hspace{2em}#1\hspace{2em}}}
\newcommand{\eqnboxbegin}{\begin{empheq}[box=\widefbox]{align}}
\newcommand{\eqnboxend}{\end{empheq}}

\begin{document}

\eqnboxbegin
Y & =Ak^{\alpha}L^{1-\beta}\\
C & =(1-s)Y\\
Y & =C + I + G\\
\Delta K & = I -\delta K
\eqnboxend

\end{document}

错误信息如下:

paragraph ended before \empheq was complete.

我无法理解这一点。提前感谢您的帮助!

答案1

为了完成环境所做的事情,(我怀疑)它们将和empheq之间的所有材料收集到一个框中。如果终止框集合的分隔符隐藏在未展开的宏中,则收集将持续到文档结尾。\begin{empheq}\end{empheq}

这个新环境对我有用:

\newenvironment{empheqbox}{%
    \empheq[box=\widefbox]{align}%
}{%
    \endempheq%
}

您会注意到我正在使用直接环境命令,因为empheq使用环境形式也会产生失控参数错误。


更新

阅读后empheq包装文档,其中引用这个文件,AmS 存储环境内容的底层机制确实是错误的根源。

这与不幸的复杂技术有关:给定的环境必须将其内容读取为分隔的宏参数,因为它们使用从 Spivak 的 amstex.tex 继承的算法对内容进行多遍处理。显而易见的解决方案 — 用不同的算法替代多遍计算中的框改组而不是标记改组 — 需要从头开始重写这些显示环境;虽然这是一个值得追求的目标,但它超出了 AmS-LaTeX 项目的原始范围。

因此,看起来\begin{}\end{}对于强大的使用来说是强制性的。

作者empheq注意到了这一点,并建议将上面的环境写成

\newenvironment{empheqbox}{%
    \setkeys{EmphEqEnv}{align}
    \setkeys{EmphEqOpt}{box=\widefbox}
    \EmphEqMainEnv%
}{%
    \endEmphEqMainEnv%
}

相关内容