如何处理由公式或浮点数引起的 vbox 不足的问题?

如何处理由公式或浮点数引起的 vbox 不足的问题?

twoside文档中,\flushbottom在 KOMA 类中自动激活。只要文本从上到下填满所有页面,并且公式仅出现在页面中间,就像本 MWE 中一样,这就可以正常工作。

\documentclass[twoside]{scrartcl}
\usepackage{lipsum}
\begin{document}
\lipsum[1-7]
\par
\[\sum_{n=1}^\infty \frac{1}{n^2}\]
\end{document}

该文档编译时没有出现警告,结果看起来不错。但是,有时公式会出现在分页符附近,就像这个经过调整以显示效果的 MWE 中一样。

\documentclass[twoside]{scrartcl}
\usepackage{lipsum}
\begin{document}
\lipsum[1-5]
\par
\lipsum[1][1]
\par
\[\sum_{n=1}^\infty \frac{1}{n^2}\]
\end{document}

LaTeX 抱怨它无法填满页面,导致页面未满vbox

Underfull \vbox (badness 10000) has occurred while \output is active

结果看起来不太美观,段落之间有很大间隙,这是由于公式被强行放到第二页造成的。当文档中包含浮动时也会发生类似情况,导致vbox我的文档出现许多未满的情况。

公式导致垂直框未满

从印刷的角度来看,是否有针对这种情况的首选解决方案?我能想到三种可能的方法:

  1. 接受现状并忽略不充分的vbox警告。

  2. 关闭\flushbottom。我个人认为这不是双面文档的好解决方案。

  3. 让 LaTeX 增加受影响页面上的线条分布,使效果分布得更均匀。我个人认为这是视觉上最令人满意的方法。为此我需要修改多长?我需要添加橡胶长度吗\linespread

对于这种情况,是否存在公认的最佳印刷实践?


编辑:请注意,在这种情况下,可以通过更改换行符来解决问题,这会导致某些段落中的行数不同,正如 David 所指出的那样。然而,对于vbox高度不是 的倍数的浮动(即图像)导致的未满情况,这种情况几乎从未发生过\baselineskip。以下 MWE 说明了这种情况。

\documentclass[twoside,12pt]{scrartcl}
\usepackage{lipsum}
\begin{document}

\begin{figure}[t]
  \centering
  \fbox{\begin{minipage}[c][25.2\baselineskip][c]{0.9\textwidth}\centering xxx\end{minipage}}
\end{figure}

\lipsum[1-3]
\end{document}

在这里,LaTeX 也抱怨文本不够饱满vbox,并且段落在输出中看起来被拉长了。

垂直框未满且有浮动

答案1

示例文档有误,因为在数学显示之前不应该有段落分隔符。

然而,同样的问题也出现在

\documentclass[twoside]{scrartcl}
\usepackage{lipsum}
\begin{document}
\lipsum[1-5]
\par
\lipsum[1][1]
\par
zzz
\[\sum_{n=1}^\infty \frac{1}{n^2}\]
\end{document}

您可以看到原文第 2 页顶部的异常空间不是垂直空间,而实际上是段落的“白线”,因此不会在分页符处丢失,此处该行有可见的文本。

如果你能够进行手动控制,你可以做很多事情,例如

  1. 使用\enlargethispage+/- 调整页面高度\baselineskip以获得更好的分隔效果,在这种情况下,最好在双页跨页的两页上都进行此操作

  2. 重写文本以使其更加合适。

  3. 在较大的段落中使用\looseness,在换行决定上有灵活性,可以多占一行或少占一行,例如在这里

    \documentclass[twoside]{scrartcl}
    \usepackage{lipsum}
    \begin{document}
    \looseness=1
    \lipsum[1]
    
    \looseness=1
    \lipsum[2]
    
    \looseness=1
    \lipsum[3]
    
    \looseness=1
    \lipsum[4]
    
    \looseness=1
    \lipsum[5]
    
    
    \looseness=1
    \lipsum[1]
    
    zzz
    \[\sum_{n=1}^\infty \frac{1}{n^2}\]
    \end{document}
    

您提到的选项 3 是最不理想的(实际上不是一个选项),更改页面之间的行距会非常分散注意力。

答案2

回答David 很好地解决了vbox公式导致的未满的情况。对于浮点数的情况,有一种不同的方法。长度\textfloatsep(以及其他)控制图形和文本的分离。默认情况下,此长度是灵活的,但对于问题中提出的情况来说,灵活性太小了。默认情况下,该值似乎是

20.0pt plus 2.0pt minus 4.0pt

为了避免段落之间拉伸,弹性值至少应为\baselineskip。这可以通过类似下面的设置来实现。

\setlength{\textfloatsep}{1.25\baselineskip plus 0.4\baselineskip minus 0.6\baselineskip}

相关内容