.png)
У меня все еще есть странная проблема с балансировкой столбцов в 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