Что делают \section и itemize с системой штрафов? (проблема с балансировкой столбцов eledmac)

Что делают \section и itemize с системой штрафов? (проблема с балансировкой столбцов eledmac)

У меня все еще есть странная проблема с балансировкой столбцов в 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 две колонки сносок выглядят несбалансированными, вот так:

введите описание изображения здесь

Но если я удалюили the \section илисреды itemize(поместив вместо него обычный текст, чтобы сохранить то же вертикальное пространство), столбцы будут сбалансированы следующим образом:

введите описание изображения здесь

То же самое происходит, если я использую quoteсреду вместо itemize.

Возможно ли, что itemizeмы quoteделаем \sectionчто-то странное с системой штрафов, из-за чего расчет штрафа за балансировку столбцов в сноске становится «раздражённым» или что-то в этом роде?

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

решение1

Ого, спустя два десятилетия ядро ​​LaTeX все еще способно преподносить сюрпризы!

Какой противный баг, и он там с первого дня.

Это не проблема eledmac, это проблема способа, которым LaTeX пытается сохранить не менее 2 строк текста после заголовка раздела. Он делает это, устанавливая \clubpenaltyзначение 10000, а затем использует \everyparдля восстановления исходной настройки, когда начинает второй абзац.

К сожалению, второй абзац в MWE — это среда, и поэтому сброс происходит внутри группы. Поэтому в конце среда \clubpenaltyполучает обратно свое запрещающее значение. Это было бы не так уж и плохо, как \everyparи получение обратно его определения для сброса.

Однако после завершения группы окружения LaTeX запускает дополнительный код для обработки так называемого «окружения абзаца» (окружения, вокруг которых есть пустые строки, поскольку они получают дополнительные интервалы), и этот механизм ( \@doendpe) также используется \everyparдля восстановления некоторых настроек, и по пути код для восстановления \clubpenaltyтеряется.

В результате с этого момента `\clubpenalty остается на уровне 10000, сохраняя во всех последующих абзацах первые две строки вместе --- и именно это создает разницу в сносках: во второй сноске больше нет точки разрыва между первой и второй строкой).

В обычном тексте или в большинстве документов 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}

Если вы запустите приведенную выше версию, то увидите, как разворачивается драма.

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

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

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