\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 中,两列脚注看起来不平衡,如下所示:

在此处输入图片描述

但如果我删除任何一个\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

相关内容