在新環境「之前」結束環境

在新環境「之前」結束環境

我正在嘗試創建一個環境,​​可以關閉一個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}並註解掉下一行,我會收到上面的錯誤訊息。

我對一般情況很好奇:「如何在 a 的『之前』部分結束環境\newenvironment

(我的迫切需求是「如何更好地實現結束頁面的目標multicols,使其平衡並移至下一頁?」。我根本無法像現在這樣這樣做,但我想使用環境或其他原因。)

答案1

使用宏來做到這一點會容易得多。對於一個環境,​​你必須追蹤\@currenvir並加入正確的群體。 \endgroup 和 \begingroup 用於終止並重新啟動 blanecedbreak 環境。

\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}

這比真正讓我高興的方式要脆弱得多,而且我不知道我是否會推薦它作為通用解決方案。也就是說,在了解它的工作原理和原因後,我想我可以忍受它。當然,我願意接受其他解決方案。

相關內容