\clubpenalty 的意外值

\clubpenalty 的意外值

在以下 MWE 中,\clubpenalty在文档开头的预期默认值为 150。但是,按照此特定顺序,a) a \sectionb) a 段落 c) aquote环境的组合将导致 a\clubpenalty为 10000(即从此点开始不允许出现孤儿)。忽略这三个元素中的任何一个都将产生 的预期值 150。\clubpenalty为什么会这样?

\documentclass{article}

\begin{document}

Clubpenalty: \the\clubpenalty\ (should be 150)

% Removing either a) the \section or b) the paragraph following it
%     or c) the "quote" environment following it will produce
%     the expected value of 150 for \clubpenalty
\section{A section}

Some text.

\begin{quote}
Some text inside a \texttt{quote} environment.
\end{quote}

Clubpenalty: \the\clubpenalty\ (should be 150)

\end{document}

答案1

我发现这个 hack 似乎有效,至少如果问题环境基于list

\makeatletter
\g@addto@macro\endtrivlist{\aftergroup\@restoreclubpenalty}
\def\@restoreclubpenalty{\clubpenalty\@clubpenalty}
\makeatother

答案2

我想说这是一个错误。它也已经报告(但没有分析或解决):http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=latex/4065

粗略地说,我会说问题在于列表(引用是列表)中\item没有开始段落,因此everypar列表和章节的诡计发生冲突。

答案3

抱歉回复晚了。由于我之前的回答被转换成了评论,而且据我所知,我无法在评论中包含 TeX 代码,所以我粘贴了这里提到的 Marcin Woliński 的补丁(我现在没时间分析它,只是粘贴它):

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

相关内容