Poner fin a un entorno en el 'antes' de un nuevo entorno

Poner fin a un entorno en el 'antes' de un nuevo entorno

Estoy tratando de crear un entorno que cierre un multicolsgrupo, haga una cosa y luego comience uno nuevo multicols.

Algo como

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

Esto no funciona, me sale el mensaje de error

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

MWE

Esto construye.

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

Obtengo una columna larga desequilibrada, luego una página nueva y columnas equilibradas. Si descomento la línea que comienza \end{multicols}en el nuevo entorno y comento la siguiente, aparece el mensaje de error anterior.

Tengo curiosidad sobre el caso general: "¿Cómo finalizo un entorno en la sección 'antes' de a \newenvironment?

(Mi necesidad inmediata es "¿cómo puedo lograr mejor el objetivo de finalizar una multicolspágina para que se equilibre y pase a la página siguiente?". Simplemente no podría hacerlo como estoy ahora, pero me gustaría usar un entorno por otras razones.)

Respuesta1

Sería mucho más fácil hacer esto con una macro. Con un entorno tienes que realizar un seguimiento \@currenviry estar en el grupo correcto. \endgroup y \begingroup deben terminar y reiniciar el entorno blanacedbreak.

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

Respuesta2

Investigaciones y experimentos adicionales muestran que el nuevo entorno no es sólo un "envoltorio para cosas", sino que en realidad tiene un significado estructural (crea un grupo implícito). Eso es,

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

actúa algo así como

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

Pensé (al parecer incorrectamente) que el 'antes' era algo así como una sustitución de texto. Había olvidado lo implícito begingroup.

Resulta que usando la definición anterior,

\balancedbreak
Some content goes here
\endbalancedbreak

Parece funcionar.

Solución de trabajo actual:

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

Esto funciona si y sólo si no hay otro \begin{someenv}entre el \begin{multicols}y el \balancedbreak. Puede haber un \begin{someenv} some stuff goes here \end{someenv}sin problema, pero esto no puede suceder 'dentro' de otro entorno o grupo.

Esto es mucho más frágil de lo que realmente me hace feliz y no sé si lo recomendaría como solución general. Dicho esto, entendiendo cómo funciona y por qué, creo que puedo vivir con ello. Por supuesto, estoy abierto a otras soluciones.

información relacionada