将 \raggedbottom 范围限定为单个页面

将 \raggedbottom 范围限定为单个页面

如何定义单个页面为\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。但它并没有完全捕获memoirs \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}

相关内容