我正在尝试创建一个环境,以关闭一个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}
这比真正让我高兴的要脆弱得多,我不知道我是否会推荐它作为通用解决方案。话虽如此,了解它的工作原理和原因后,我想我可以接受它。当然,我愿意接受其他解决方案。