考虑以下 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}
这里,myproof
和solution
是两个获得额外 的最终环境\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}