新しい環境の「前」で環境を終了する

新しい環境の「前」で環境を終了する

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}

1 つの長い不均衡な列が表示され、その後に新しいページと均衡のとれた列が表示されます。新しい環境で始まる行のコメントを解除し\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}

私は、「before」がテキストの置換のようなものだと考えていましたが、どうやらそれは間違いだったようです。暗黙の を忘れていました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}

これは、私にとっては満足できるほど脆弱ではないので、一般的な解決策として推奨できるかどうかはわかりません。とはいえ、仕組みと理由を理解した上で、これで我慢できると思います。もちろん、他の解決策も検討します。

関連情報