在以下 MWE 中,\clubpenalty
在文档开头的预期默认值为 150。但是,按照此特定顺序,a) a \section
b) 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}%
}