对我来说,在普通文本主体中,孤行(段落第一行后的分页符)是可以容忍的,因此我保留 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
用于跳过引文上方的两行。您可能需要优化此值。