我仍然遇到一个奇怪的问题,即两列脚注中的列平衡问题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 中,两列脚注看起来不平衡,如下所示:
但如果我删除任何一个这\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
到达 par env 的末尾时无条件地设置回其保存的值,很可能需要有条件地完成此操作:
\makeatletter
\def\@doendpe{\@endpetrue
\def\par{\@restorepar
\clubpenalty \@clubpenalty
\everypar{}\par\@endpefalse}%
\everypar{{\setbox\z@\lastbox}\everypar{}\clubpenalty \@clubpenalty
\@endpefalse}}
\makeatother