如何定义单个页面为\raggedbottom
?或者,为了完整起见,定义为\flushbottom
?
背景
在一条评论对于相关答案,Ben Lerner 提供了以下代码片段来声明单个页面\raggedbottom
:
\def\oneraggedpage{\raggedbottom\afterpage{\flushbottom}}
当我尝试这样做时,它并没有像预期的那样工作:它没有生成单个页面,而是\raggedbottom
生成了整个文档。此外,即使这样做可行,这种做法也假设默认状态(页面发送出去后文档需要返回的状态)是\flushbottom
,但事实可能如此,也可能并非如此(参见\ensuremath
)。
所以问题是,将\raggedbottom
(或类似的)效果范围限定到单个页面的最佳方法是什么?
(抱歉,没有 MWE,但在这种情况下很难想出一个)
示例案例
如果有助于思考这如何有用,想象一下写一篇论文,其中参考文献放在最后的附加页中。默认情况下,即使没有,最后一页也可以是参差不齐的\raggedbottom
。但如果最后一页有参考文献,那么文档本身的“最终页”将是第页前參考文獻。
也许在这种情况下(激励我的实际案例)这些变化可以融入到参考书目的环境中?
答案1
\afterpage
对其参数进行分组,并且由于\flushbuttom
未全局设置其值,因此这些值会丢失。您需要一个“全局”变体\flushbottom
:
\documentclass{article}
\usepackage{afterpage}
\usepackage{lipsum}
\begin{document}
\flushbottom
\lipsum[1-2]
\pagebreak
\raggedbottom\lipsum[1-2]
\makeatletter
\afterpage{\global\let\@textbottom\relax \global\let\@texttop\relax}
\pagebreak\lipsum[1-2]
\pagebreak abc
\end{document}
答案2
更新 \global
之前已添加\let
,\afterpage
如 Ulrike Fischer 的回答中所述。如果没有它,下面的代码将无法按预期工作 -\raggedbottom
应用于两个连续的页面,而不是一个。感谢 StevenB.Segletes 指出这一点。
这是捕获当前设置的版本,假设底部对齐完全通过调整\@textbottom
和来实现\@texttop
。这在标准 LaTeX 和类中都是正确的memoir
。但它并没有完全捕获memoir
s \sloppybottom
。
\documentclass{article}
\usepackage{afterpage}
\usepackage{lipsum}
\makeatletter
\newcommand{\oneraggedpage}{\let\mytextbottom\@textbottom
\let\mytexttop\@texttop
\raggedbottom
\afterpage{%
\global\let\@textbottom\mytextbottom
\global\let\@texttop\mytexttop}}
\begin{document}
\flushbottom
%\raggedbottom
\lipsum[1-6]
\vspace{1ex plus 30ex}
\vrule height 10cm
\vspace{1ex plus 30ex}
\oneraggedpage
\lipsum[7]
\vspace{1ex plus 30ex}
\vrule height 10cm
\vspace{1ex plus 30ex}
\lipsum[8-20]
\end{document}