\BeforeBeginEnvironment 和 \NewEnviron 的交互

\BeforeBeginEnvironment 和 \NewEnviron 的交互

考虑以下 MWE。

\documentclass{article}

\usepackage{etoolbox}
\usepackage{environ}
\usepackage{tcolorbox}
\usepackage{amsthm}

\BeforeBeginEnvironment{proof}{\tcblower}

\NewEnviron{solution}{\begin{proof}[Solution]%
\BODY%
\end{proof}%
}

\begin{document}

\begin{tcolorbox}
Upper box.
\begin{proof}[Solution]
My solution.
\end{proof}
\end{tcolorbox}

\begin{tcolorbox}
Upper box.
\begin{solution}
My solution.
\end{solution}
\end{tcolorbox}

\end{document}

第一个tcolorbox显示符合预期,而第二个,天真地应该产生完全相同的东西,却引发了几个错误:多余的{s,\begin{xyz}以 结尾\end{notxyz},等等等等。

另一方面,如果我只是使用\newenvironment{solution}{\proof[Solution]}{\endproof},则可以很好地编译,但是\tcblower不再附加在之前\begin{solution},因此它不会自动设置到下面的框中。

我对此至少有两个疑问:

首先,是否可以让 get (和相关命令) 与和 一起\BeforeBeginEnvironment工作?这不仅可以解决问题,而且如果效果如预期,还可以提供一个更干净的解决方案(只需少加载一个包)。\<environment>\end<environment>

其次,到底发生了什么?我的意思是看看它:这段代码只是乞讨正确编译!

答案1

\tcblower是一个非常特殊的标记,它结束一个环境(上部的内容框)并开始另一个环境(下部的内容框)。因此,在\tcblower使用之前,必须关闭上部的所有环境和 TeX 组。这也意味着您不能先开始下部的环境或 TeX 组,然后再使用\tcblower

\BeforeBeginEnvironment{proof}{\tcblower}做正确的事情,即添加\tcblower 环境proof开始了。

另一方面,创建一个隐式使用的solution新环境\tcblower环境的开始。

为了避免该问题,您可以执行以下操作:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{environ}
\usepackage{tcolorbox}
\usepackage{amsthm}

\newenvironment{myproof}[1][]{\begin{proof}[#1]}{\end{proof}}
\BeforeBeginEnvironment{myproof}{\tcblower}

\newenvironment{solution}{\begin{proof}[Solution]}{\end{proof}}
\BeforeBeginEnvironment{solution}{\tcblower}


\begin{document}

\begin{tcolorbox}
Upper box.
\begin{proof}[Solution]
My solution.
\end{proof}
\end{tcolorbox}

\begin{tcolorbox}
Upper box.
\begin{solution}
My solution.
\end{solution}
\end{tcolorbox}

\end{document}

这里,myproofsolution是两个获得额外 的最终环境\tcblower

答案2

或者,你可以\tcblower调用两个都proof和环境solution并在环境\tcblower开始时重新定义solution,这样您就不会得到第二个\tcblower(这会导致您遇到的相同问题):

\BeforeBeginEnvironment{proof}{\tcblower}
\BeforeBeginEnvironment{solution}{\tcblower}

\NewEnviron{solution}{%
    \def\tcblower{}% <--- was already added before \begin{solution}.
    \begin{proof}[Solution]%
        \BODY%
    \end{proof}%
}

现在两个都 tcolorbox环境产生相同的结果:

在此处输入图片描述

代码:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{environ}
\usepackage{tcolorbox}
\usepackage{amsthm}

\BeforeBeginEnvironment{proof}{\tcblower}
\BeforeBeginEnvironment{solution}{\tcblower}

\NewEnviron{solution}{%
    \def\tcblower{}%
    \begin{proof}[Solution]%
        \BODY%
    \end{proof}%
}

\begin{document}

\begin{tcolorbox}
Upper box.
\begin{proof}[Solution]
My solution.
\end{proof}
\end{tcolorbox}

\begin{tcolorbox}
Upper box.
\begin{solution}
My solution.
\end{solution}
\end{tcolorbox}

\end{document}

相关内容