当使用不灵活的文档类时,经常会遇到警告
Underfull \vbox (badness 10000) has occurred while \output is active []
在没有显示数学的页面上。
在未满\vbox
Frank Mittelbach 引用了配套书籍(第二版)中关于“过于死板”的页面规范。建议的(也是显而易见的)方法是增加灵活性。
为了增加灵活性,提出了相同的建议 什么是未满的水平盒子和垂直盒子以及如何去除它们?。
所讨论的文档类的构造(故意,如果是短视的)没有考虑到在\parskip
、章节标题和文本之间以及其他一些位置的拉伸。此外,一个选项允许从 更改[10pt]
为[11pt]
正文,因此即使\textheight
在一种尺寸下是整数行,另一种尺寸也不会满足标准。
可以\vfuzz
指定一个小的津贴,如果没有超过,将抑制过满框消息。但没有任何与负津贴等价的东西。
我检查了etex
手册(最新的,日期为 1998/03/04)并且etextools
没有发现任何有用的内容。我查看了tex.web
代码,但是不清楚如何在没有新原语的情况下解决这个问题。
忽略日志中的这些消息并不是一个好主意,因为“结构性”消息会掩盖那些确实需要注意的消息(通常很少)。有没有人想出一种方法来抑制仅有的那些 vbox 未满的消息只偏离了几个点?
答案1
只要缺口在这个限制之内,在页面上添加一个有限的拉伸就会抑制警告,所以在 11pt 时 1pt 会完全抑制警告 .7pt 会使其具有“非无限”的糟糕程度,而任何比这小得多的东西都会有无限的糟糕程度。
\documentclass[11pt]{amsart}
\makeatletter
\def\@textbottom{\vskip \z@ \@plus 1pt}
\let\@texttop\relax
\makeatother
\begin{document}
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
aa\\bb\\cc\\dd\\ee\\ff\\gg
\end{document}
答案2
有不“负面\vfuzz
”。我看到的唯一方法是修补输出例程以测量要输出的页面的实际高度,如果与所需高度的差异小于阈值,则\vbadness10000
在实际构建框时发出。
我认为,使用\raggedbottom
不是一个选择,因为它可能引入难以控制的可变性。
一个似乎有效的补丁amsart.cls
,在避免页面未满的方向上,是
\textheight=\dimexpr
\ifcase\@mainsize
\or % 0
\or % 1
\or % 2
\or % 3
\or % 4
\or % 5
\or % 6
\or % 7
57\or % 8
52\or % 9
48\or % 10
44\or % 11
41\fi % 12
\baselineskip+\topskip\relax
而不是\textheight=584pt
为所有尺寸设置。这将为 提供以下值\textheight
:
580pt(8pt 大小)
582pt(9pt 大小)
586pt(10pt 大小)
582pt(11pt 大小)
584pt(12pt 大小)
这可能类似amsbook
。
当然,这会破坏许多现有文档。主要尺寸与“理想”高度的两点差异并不明显。当然,所有添加不可拉伸或不可收缩空间的对象都应占用整数行数。
答案3
一种选择是修改输出例程,以便它在最后包含\vspace
一些内容:plus
\documentclass[a4paper]{amsart}
\usepackage{lipsum}
\usepackage{showframe}
% fixed text size so that paper size has no influence.
\setlength{\textheight}{545pt}
\setlength{\textwidth}{350pt}
\begin{document}
% adjust some lengths to invoke the problem
\parskip0pt
\baselineskip30pt
% this, put at the beginning of the document, solves the problem
% adjust the `plus` part of the `\vspace` to your faviourite value
\makeatletter
\edef\orig@output{\the\output}
\output{\setbox\@cclv\vbox{\unvbox\@cclv\vspace{0pt plus 20pt}}\orig@output}
\makeatother
% the warnings for the pages that are actually full have disappeared
\lipsum
% these `\vbox`es are really short and the warning is there
\vbox{\lipsum[1]}\par
\vbox{\lipsum[1]}\par
\vbox{\lipsum[1]}\par
\vbox{\lipsum[1]}\par
\end{document}
第 2 页和第 4 页的警告是正确的,因为第 2 页由于寡妇消除而缺少一行。