\section と itemize はペナルティ システムに対して何を行っていますか? (eledmac 列バランスの問題)

\section と itemize はペナルティ システムに対して何を行っていますか? (eledmac 列バランスの問題)

2 列の脚注で列のバランスが崩れるという奇妙な問題がまだ残っていますeledmac.sty。しかし、新しい MWE があるので、これが特定の問題ではない可能性があることが示されていますeledmac(これが、より広い読者に向けてここに投稿する理由です)。

次のようなシンプルな MWE があります:

\documentclass{article}
\usepackage{lipsum}

\usepackage{eledmac}
\foottwocolX{A}
\def\footnote#1{\footnoteA{#1}}

\begin{document}

% Either remove this section: 
\section{Section Headline}

\lipsum[1]

% ... or remove the item / quote environment: 
\begin{itemize}
%\begin{quote} 
    \item The same problem happens if this is not an itemize but a quote
        environment. 
%\end{quote}
\end{itemize}

Bla\footnote{Test.} 
Foo\footnote{Test Test Test Test Test Test Test Test Test Test Test Test Test
Test Test }
Bar \footnote{Test.} 

\end{document}

この MWE では、2 つの列の脚注が次のように不均衡に見えます。

ここに画像の説明を入力してください

しかし、もし私がどちらか\section または環境itemize(同じ垂直スペースを維持するように通常のテキストを配置する)では、列は次のようにバランスが取られます。

ここに画像の説明を入力してください

quoteの代わりに環境を使用する場合も同様ですitemize

ペナルティ システムに何かおかしなことをして、脚注の列バランスのペナルティ計算が「イライラ」したりすることは可能itemizeですか?quote\section

私の前の記事私は、パネル変数を設定することによってこの動作に適切に影響を与えることは不可能であると指摘しました。別の投稿列バランス調整アルゴリズムのコードを抽出したので、実際に試してみます。

答え1

わあ、LaTeX カーネルは 20 年経った今でも驚きの成果を生み出し続けています!

なんと厄介なバグでしょう。初日から存在していました。

これは eledmac の問題ではなく、LaTeX がセクション見出しの後に少なくとも 2 行のテキストを保持しようとする方法の問題です。これは\clubpenalty10000 に設定して実行し、\everypar2 番目の段落を開始するときに元の設定を復元するために使用します。

残念ながら、MWE の 2 番目の段落は環境であるため、リセットはグループ内で行われます。したがって、環境の最後には禁止値が戻ります。定義を戻してリセットすることも\clubpenalty悪くありません。\everypar

ただし、環境グループが終了した後、LaTeX は、いわゆる「段落環境」(余分なスペースがあるため周囲に空白行がある環境) を処理するためのコードをさらに実行し、そのメカニズム ( \@doendpe) はいくつかの設定を復元するためにも使用され\everypar、その過程で復元するコード\clubpenaltyが失われます。

その結果、それ以降は `\clubpenalty は 10000 のままとなり、それ以降のすべての段落で最初の 2 行が一緒に保持されます。これが脚注の違いです。2 番目の脚注では、最初の行と 2 番目の行の間にブレークポイントがなくなります。

通常のテキスト、または実際ほとんどの LaTeX ドキュメントでは、LaTeX が通常、許容可能な近くのページ区切りを見つけるため、気付かれません (それに、クラブ ラインはそれほど素晴らしいものではありません :-) ) が、ここでは明らかに示されています。

\documentclass{article}

\def\X{\showthe\clubpenalty\showthe\everypar}

\begin{document}

\section{Section Headline}

\X

a little bit of text

\X

% Uncomment this para then the issue goes away

%Another paragraph that makes \verb=\clubpenalty= okay again.

\X

% ... or remove the item / quote environment: 
\begin{itemize}
    \item \X 
        The same problem happens if this is not an itemize but a quote
        environment. 

\end{itemize}
\X

\par

\X  Here is the issue: \verb=\clubpenalty= is restored back to 10000 but the \verb=\@doendpe= kills the also restored \verb=\everypar= so that it is never set back to normal.

Bla\footnote{Test.} 
Foo\footnote{\X Test Test Test Test Test Test Test Test Test Test Test Test Test
Test Test }
Bar \footnote{Test.} 

\X

Another paragraph

\X

\end{document}

上記のバージョンを実行すると、ドラマがどのように展開するかがわかります。

考えられる修正方法は次のようになります (ただし、これは非常にデリケートな領域であり、すべての影響を考慮したかどうかはわかりません...したがって、これはテストされていないアイデアとして受け止めてください。基本的には、\clubpenaltypar env の終わりに達すると、保存された値に無条件に戻されますが、これを条件付きで実行する必要がある場合があります)。

\makeatletter
\def\@doendpe{\@endpetrue
     \def\par{\@restorepar      
              \clubpenalty \@clubpenalty
              \everypar{}\par\@endpefalse}%
     \everypar{{\setbox\z@\lastbox}\everypar{}\clubpenalty \@clubpenalty
               \@endpefalse}}
\makeatother

関連情報