如何抑制“Underfull \vbox (badness 10000) ... while \output is active”?

如何抑制“Underfull \vbox (badness 10000) ... while \output is active”?

当使用不灵活的文档类时,经常会遇到警告

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 页由于寡妇消除而缺少一行。

相关内容