Завершение среды «до» новой среды

Завершение среды «до» новой среды

Я пытаюсь создать среду, в которой можно будет закрыть 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}в новой среде, и закомментирую следующую, я получаю сообщение об ошибке выше.

Мне интересен общий случай: «как мне закончить окружение в разделе «before» \newenvironment?

(Моя непосредственная потребность — «как мне лучше достичь цели завершения multicolsстраницы, чтобы она сбалансировалась и перешла на следующую страницу?». Я бы просто не мог делать этого так, как я делаю сейчас, но я хотел бы использовать среду по другим причинам.)

решение1

Было бы намного проще сделать это с помощью макроса. С окружением нужно отслеживать \@currenvirи быть в нужной группе. \endgroup и \begingroup должны завершать и перезапускать окружение 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}

решение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}без проблем, но это не может произойти «внутри» другой среды или группы.

Это гораздо более хрупко, чем то, что действительно делает меня счастливым, и я не знаю, что я бы рекомендовал это как общее решение. Тем не менее, понимая, как это работает и почему, я думаю, что смогу с этим жить. Я, конечно, открыт для других решений.

Связанный контент