在新环境的“之前”结束环境

在新环境的“之前”结束环境

我正在尝试创建一个环境,以关闭一个multicols群组、做一件事,然后开始一个新的事情multicols

就像是

\newcount{\colcount}
\newenvironment{balancedbreak}{%
\let\colcount\col@number
\end{multicols}\newpage\begin{multicols}{\colcount}
}{
}

这不起作用,我收到错误消息

! LaTeX Error: \begin{balancedbreak} on input line 38 ended by \end{multicols}

平均能量损失

这样就构建了。

\documentclass{article}
\usepackage{multicol}
\usepackage{lipsum}

\newcount{\colcount}
\newenvironment{balancedbreak}{%
\let\colcount\col@number%
%\end{multicols}\newpage\begin{multicols}{\colcount}%
\newpage
}{%
}

\begin{document}
\begin{multicols}{2}
\lipsum[1]
\lipsum[2]
\begin{balancedbreak}
\textbf{Testing here}
\end{balancedbreak}
\lipsum[3]
\lipsum[4]
\end{multicols}
\end{document}

我得到了一个较长的不平衡列,然后是一个新的页面和平衡的列。如果我取消注释新环境中的行\end{multicols}并注释掉下一行,我会收到上述错误消息。

我对一般情况很好奇:“如何在‘之前’部分结束环境\newenvironment

(我迫切需要的是“我怎样才能更好地实现结束一页的目标multicols,使其平衡并移动到下一页?”。我根本无法按照现在的方式去做,但我想出于其他原因使用环境。)

答案1

使用宏来执行此操作会容易得多。使用环境时,您必须跟踪\@currenvir并处于正确的组中。\endgroup 和 \begingroup 用于终止并重新启动 blacancedbreak 环境。

\documentclass{article}
\usepackage{multicol}
\usepackage{lipsum}
%\tracingmacros=1

\makeatletter
\newcount{\colcount}
\newenvironment{balancedbreak}{%
\global\colcount=\col@number% current value will otherwise be lost
\endgroup\endmulticols\newpage
\multicols\colcount\begingroup
\def\@currenvir{balancedbreak}%
}{}%
\makeatother

\begin{document}
\begin{multicols}{2}
\lipsum[1]
\lipsum[2]
\begin{balancedbreak}
\textbf{Testing here}
\end{balancedbreak}
\lipsum[3]
\lipsum[4]
\end{multicols}
\end{document}

答案2

进一步的研究和实验表明,新环境不仅仅是一个“东西的包装”,而且实际上具有结构意义(创建一个隐式组)。也就是说,

\newcount\colcount
\newenvironment{balancedbreak}{%
\let\colcount\col@number%
\end{multicols}\newpage\begin{multicols}{\colcount}%
}{%
}

类似于

  • \begin{balancedbreak}
    • \begingroup
      • \let\colcount\col@number
      • \end{multicols}\newpage\begin{multicols}{\colcount}

我以为——看来是错误的——“之前”就像是文本替换。我忘记了隐含的begingroup

事实证明,使用上面的定义,

\balancedbreak
Some content goes here
\endbalancedbreak

看起来确实有效。

目前可行的解决方案:

\newcount\colcount
\newenvironment{balancedbreak}{%
\ifnum\doublecol@number>\z@ % if multicol
  \let\colcount\col@number%
  \end{multicols}\newpage\begin{multicols}{\colcount}%
\else%
  \newpage%
\fi
}{%
}

当且仅当和\begin{someenv}之间没有其他 时,此方法才有效。 可以存在而没有 问题,但这不能在另一个环境或组“内部”发生。\begin{multicols}\balancedbreak\begin{someenv} some stuff goes here \end{someenv}

这比真正让我高兴的要脆弱得多,我不知道我是否会推荐它作为通用解决方案。话虽如此,了解它的工作原理和原因后,我想我可以接受它。当然,我愿意接受其他解决方案。

相关内容