避免在 quote/quotation 环境开始时出现孤儿

避免在 quote/quotation 环境开始时出现孤儿

对我来说,在普通文本主体中,孤行(段落第一行后的分页符)是可以容忍的,因此我保留 TeX 的默认设置(\clubpenalty=150)。另一方面,我想摆脱quote/quotation环境开头的孤行。

  • 我的第一次(天真的?)尝试是在此环境的基础上quote\clubpenalty=10000在此环境内定义一个新环境;这仍然产生了孤儿。

  • 在翻遍了LaTeX2e 来源,我尝试嵌入\@afterheading(p. 287) 到我的自定义环境中;这导致了一条错误消息。

  • 最后(出于绝望),我将\@nobreaktrue(用于\@afterheading)插入到我的自定义环境中;这工作

这引出了以下问题:

  • 为什么我的局部重新定义尝试\clubpenalty失败了?

  • 有什么\@nobreaktrue作用?有副作用吗?

  • 如果是后者,那么在quote/quotation环境开始时避免出现孤儿的正确方法是什么?


\documentclass{report}

\usepackage[latin]{babel}

\usepackage{blindtext}

\setlength{\textwidth}{350pt}

\newenvironment{failednoorphanquote}{\begin{quote}\clubpenalty=10000\relax}{\end{quote}}

\makeatletter
\newenvironment{noorphanquote}{\begin{quote}\@nobreaktrue}{\end{quote}}
\makeatother

\begin{document}

\chapter{bla}

\blindtext[3]

\begin{quote}
\blindtext
\end{quote}

\chapter{blubb}

\blindtext[3]

\begin{failednoorphanquote}
\blindtext
\end{failednoorphanquote}

\chapter{foo}

\blindtext[3]

\begin{noorphanquote}
\blindtext
\end{noorphanquote}

\end{document}

编辑:回应 Martin Scharrer 的回答:我正在寻找一种解决方案,它(与\Needspace)不对环境上方的垂直空间做出隐含的假设quote

答案1

\@nobreaktrue是正确的做法。它之所以有效,是因为环境quote最终会执行类似

\everypar{%
    \if@nobreak
        \@nobreakfalse
        \clubpenalty=10000
    \else
        \clubpenalty=150
    \fi
}

所以你的\clubpenalty被覆盖了。

要回答您的其他问题,\@nobreaktrue请扩展为\global\let\if@nobreak\iftrue。没有不利影响,因为如果它为真,那么一旦段落开始,它就会立即(全局)设置为假。

答案2

在我提出这个问题几个月后,我发布了我的quoting包。其同名的新环境提供了在启动时控制孤儿包的功能,其中包括使用 为单个环境禁用孤儿包,使用 为\begin{quoting}[noorphanfirst]全局禁用孤儿包\usepackage[noorphanfirst]{quoting}。(还有一个相关选项noorphanafter。)

\documentclass{report}

\usepackage[latin]{babel}

\usepackage{quoting}

\usepackage{blindtext}

\setlength{\textwidth}{350pt}

\begin{document}

\chapter{bla}

\blindtext[3]

\begin{quoting}
\blindtext
\end{quoting}

\chapter{blubb}

\blindtext[3]

\begin{quoting}[noorphanfirst]
\blindtext
\end{quoting}

\end{document}

答案3

我无法回答为什么\clubpenalty会失败和\@nobreaktrue有效,但这里有一个替代解决方案:

needspace如果空间不够容纳两行,您可以使用该包在引文前强制分页:

\usepackage{needspace}
\newenvironment{noorphanquote}{\Needspace*{3\baselineskip}\begin{quote}}{\end{quote}}

这里3\baselineskip用于跳过引文上方的两行。您可能需要优化此值。

相关内容