我有一个相当大的文档,其结构如下
\newenvironment{A}{sth.}{sth.}
\newenvironment{B}{sth.}{sth.}
\newenvironment{C}{sth.}{sth.}
\begin{A}
\begin{B}
\end{B}
\begin{C}
\end{C}
\begin{B}
\end{B}
\begin{C}
\end{C}
\end{A}
\begin{A}
\begin{B}
\end{B}
\begin{C}
\end{C}
\begin{B}
\end{B}
\begin{C}
\end{C}
\end{A}
现在我想防止环境B
和C
被分开,无论是在分栏符还是分页符上。它们总是成对出现,这样环境之后B
总是会有一个环境C
跟在后面。一种解决方案是将两个环境合二为一,即不是使用 \begin{B} \end{B} \begin{C} \end{C},而是使用
\begin{D}
\end{D}
但我宁愿不这样做,因为已经有很多文本是用该方案编写的。另一种可能性是minipage
在环境中打开B
,然后在中关闭它C
,但这会导致! LaTeX Error: \begin{minipage} on input line 21 ended by \end{C}.
还有其他解决方案吗?或者我应该重写整个文档?
答案1
这是一个想法。
首先,A、B、C的原始定义保存在A、BB、Cc中
\newenvironment{A}{sth.}{sth.}
\newenvironment{BB}{sth.}{sth.}
\newenvironment{CC}{sth.}{sth.}
然后将新环境 B 和 C 保持在同一个盒子里。
\newsavebox\BC
\newenvironment{B}{%
\global\setbox\BC\vbox\bgroup\begin{BB}}{%
\par\xdef\mtprevdepth{\the\prevdepth}
\end{BB}\egroup}
\newenvironment{C}{%
\setbox\BC\vbox\bgroup\unvbox\BC\prevdepth\mtprevdepth\begin{CC}}{%
\end{CC}\egroup\box\BC}
更新:这是使用etoolbox
包的另一种想法
\usepackage{etoolbox}
\newenvironment{A}{\textbf{A}sth.}{sth.}
\newenvironment{B}{\textbf{B}sth.}{sth.}
\newenvironment{C}{\textbf{C}sth.}{sth.}
\BeforeBeginEnvironment{B}{\begin{minipage}{\linewidth}}
\AfterEndEnvironment{C}{\end{minipage}}