Beenden einer Umgebung im „Vorher“ einer neuen Umgebung

Beenden einer Umgebung im „Vorher“ einer neuen Umgebung

Ich versuche, eine Umgebung zu schaffen, in der eine multicolsGruppe geschlossen wird, etwas unternommen wird und dann eine neue begonnen wird multicols.

Etwas wie

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

Das funktioniert nicht, ich erhalte die Fehlermeldung

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

MWE

Dies baut sich auf.

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

Ich erhalte eine lange unausgeglichene Spalte, dann eine neue Seite und ausgeglichene Spalten. Wenn ich die Zeile, die in der neuen Umgebung beginnt, auskommentiere \end{multicols}und die nächste auskommentiere, erhalte ich die obige Fehlermeldung.

Mich interessiert der allgemeine Fall: „Wie beende ich eine Umgebung im Abschnitt ‚Vorher‘ eines \newenvironment?

(Mein unmittelbares Anliegen ist: „Wie kann ich das Ziel, eine multicolsSeite so zu beenden, dass sie ausgewogen ist, und zur nächsten Seite übergehen, besser erreichen?“. So wie ich es jetzt mache, könnte ich das einfach überhaupt nicht machen, aber ich möchte aus anderen Gründen eine Umgebung verwenden.)

Antwort1

Mit einem Makro wäre das viel einfacher. Bei einer Umgebung muss man den Überblick behalten \@currenvirund sich in der richtigen Gruppe befinden. \endgroup und \begingroup dienen zum Beenden und Neustarten der blanacedbreak-Umgebung.

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

Antwort2

Weitere Untersuchungen und Experimente zeigen, dass die neue Umgebung nicht nur eine „Hülle für Dinge“ ist, sondern tatsächlich eine strukturelle Bedeutung hat (eine implizite Gruppe erstellt). Das heißt,

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

wirkt so etwas wie

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

Ich hatte – anscheinend fälschlicherweise – gedacht, dass das „vorher“ so etwas wie eine Textersetzung sei. Ich hatte das implizite vergessen begingroup.

Es stellt sich heraus, dass mit der obigen Definition

\balancedbreak
Some content goes here
\endbalancedbreak

Scheint zu funktionieren.

Derzeit funktionierende Lösung:

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

Dies funktioniert genau dann, wenn sich \begin{someenv}zwischen \begin{multicols}und kein anderes befindet \balancedbreak. Ein kann \begin{someenv} some stuff goes here \end{someenv}problemlos vorhanden sein, aber dies kann nicht „innerhalb“ einer anderen Umgebung oder Gruppe geschehen.

Das ist viel brüchiger, als mir wirklich gefällt, und ich weiß nicht, ob ich es als allgemeine Lösung empfehlen würde. Wenn ich jedoch verstehe, wie und warum es funktioniert, denke ich, dass ich damit leben kann. Ich bin natürlich offen für andere Lösungen.

verwandte Informationen