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