![Floatbarrier 防止页面分页时底部对齐](https://linux22.com/image/357349/Floatbarrier%20%E9%98%B2%E6%AD%A2%E9%A1%B5%E9%9D%A2%E5%88%86%E9%A1%B5%E6%97%B6%E5%BA%95%E9%83%A8%E5%AF%B9%E9%BD%90.png)
当我使用 placeins 包并使用 \FloatBarrier 时,浮动移动到下一页时会出现一种奇怪的(对我来说)行为。
看这个例子:
\documentclass[
12pt,
pdftex,
a4paper,
twoside,
openright,
parskip=half,
]{scrreprt}
\usepackage{showframe}
\usepackage{blindtext}
\usepackage{placeins}
\begin{document}
\section{First chapter}
\Blindtext[1][3]
\begin{figure}[htbp]
\rule{14cm}{8cm}
\caption{Here is some caption.}
\end{figure}
Just some text to force the page break to occure. \\
Just some text to force the page break to occure. \\
\Blindtext[1][1]
\FloatBarrier
\section{Second section}
\Blindtext[2][1]
\end{document}
第 1 页末尾没有垂直校正(\flushbottom}。如果删除 \FloatBarrier,布局就很好。
我知道在这种情况下,不需要 \FloatBarrier,但在某些情况下我需要它,这看起来很奇怪。当然,在这种情况下我可以用 \pagebreak 替换 \FloatBarrier,但这是预期的行为吗?
答案1
这是预期的行为,但尚不清楚总体上如何改变。
\FloatBarrier
本质上是:如果有待处理的浮动,\clearpage
则不执行任何操作
所以页面看起来很短的原因是因为\clearpage
总是在页面底部的分页符前留有空白。确实必须这样做。
\clearpage
正如您所知,这里有待处理的浮动,您可以轻松测试如果没有填充页面末尾,它会是什么样子,方法是使用
\pagebreak\FloatBarrier
在生成的测试文件上
这似乎是一种改进,但这仅在强制分页符恰好接近页面的自然结束处时才有效,因此保持齐底设置才有效。
一般情况下,强制分页前页面上可能只有少量的文字,那么将空间放在页面底部是唯一的可能性。
如果我将您的测试文件更改为
\documentclass[
12pt,
pdftex,
a4paper,
twoside,
openright,
parskip=half,
]{scrreprt}
\usepackage{showframe}
\usepackage{blindtext}
\usepackage{placeins}
\begin{document}
\section{First chapter}
\Blindtext[1][1]
\begin{figure}[p]
\rule{14cm}{8cm}
\caption{Here is some caption.}
\end{figure}
\Blindtext[1][1]
%\pagebreak
\FloatBarrier
\section{Second section}
\Blindtext[2][1]
\end{document}
然后你就会看到跟页面被强制短一模一样的情况:
但在本例中显然很多更糟糕的是,如果您要更改\clearpage
以保留 flushbottom 设置,您可以通过取消注释来检查\pagebreak
以获取 flushbottom 设置
Underfull \vbox (badness 10000) has occurred while \output is active
因此,一般来说,让页面变短是唯一可能的默认设置,但在特定情况下,如果页面不是“太短”,您可以\pagebreak
在障碍物之前放置它,以强制页面底部齐平。