\vbox 未满-如何找到有问题的页面?

\vbox 未满-如何找到有问题的页面?

我正在编译一个大型乳胶模板,这里,并且总是有一些 \vbox 未满的警告。我知道它们只是间距问题,讨论这里,但是有没有办法配置警告消息来告诉我问题发生在哪里?

这样,我就可以轻松地在 PDF 和源文件中找到问题页面,并决定是否需要修复它。

答案1

最常见的是,内容过少或过满的\vboxes 与内容不足或过多的页面有关(因为它们是作为esv的垂直列表构建的box)。因此,在页面级别,您可以通过查看日志来找到有问题的构造。以下是一个简单的示例:

\documentclass{article}
\usepackage{lipsum}
\tracingpages1
\tracingoutput1
\begin{document}

\lipsum[1-50]
\noindent\rule{\textwidth}{1.1\textheight}
\lipsum[1-50]

\end{document}

上述代码包含一些虚拟文本,后跟一个“段落”,该段落明显大于(垂直方向)文本块(高度比 大 10% \textheight)。它还包括一些跟踪命令用于调试。.log显示

%% goal height=550.0, max depth=5.0
% t=10.0 g=550.0 b=10000 p=0 c=100000#
% t=22.0 g=550.0 b=10000 p=150 c=100000#
% t=34.0 g=550.0 b=10000 p=0 c=100000#
% t=46.0 plus 1.0 g=550.0 b=10000 p=250 c=100000#
% t=58.0 plus 1.0 g=550.0 b=10000 p=0 c=100000#
% t=70.0 plus 1.0 g=550.0 b=10000 p=0 c=100000#
% t=82.0 plus 1.0 g=550.0 b=10000 p=0 c=100000#
% t=94.0 plus 1.0 g=550.0 b=10000 p=0 c=100000#
% t=106.0 plus 1.0 g=550.0 b=10000 p=150 c=100000#
% t=118.0 plus 1.0 g=550.0 b=10000 p=0 c=100000#
% t=725.9478 plus 2.0 g=550.0 b=* p=150 c=*


Completed box being shipped out [10] []

%% goal height=550.0, max depth=5.0
% t=605.00336 g=550.0 b=* p=150 c=*#

Overfull \vbox (55.00336pt too high) has occurred while \output is active []



Completed box being shipped out [11] []

我们将其解释为页面[10],并且正在顺利发货。然后,页面之后发生了[10]一个问题Overfull \vbox。很可能这个框与页面相关联,[11]因为页面[10]已经发货了发生此消息。跟踪页面的页面构造[10]并不像 Knuth 自己所说的那样“用户友好”。但是,我们使用以下解释书籍第 15 章:TeX 如何将行变成页,第 112 页):

第一行以 开头,%% 是在第一个框或插入进入当前页面列表时写入的;它显示将用于该页面的goal height和(即和 的当前值)。[...] 日志文件中的尺寸始终以点为单位显示。max depth\vsize\maxdepth

后续行以单个 开头 %,每当将合法断点从最近贡献列表移动到当前页面列表时,都会写入这些行。每 %行都显示 t,如果发生分页,则为迄今为止的总高度,以及 g,为目标高度;在此示例中,高度g 保持不变 [...],但 g如果页面上插入了脚注等内容,则高度会降低。 的值 t稳步增加,从 10 到 22 再到 34,等等;页面顶部的基线相距 12pt,底部的基线相距 11pt(材料设置为九点类型)。

我们基本上看到% 当前页面上每个水平框的文本行。但是,这些% 行是由水平框后面的惩罚项或粘连项生成的,而不是由框本身生成的。每 % 行还显示了与断点相关的不良程度 b、惩罚项 p和成本 c ;如果此成本是目前为止最好的,则用符号标记# ,表示“如果没有更好的方法,则此断点将用于当前页面。”[无论你的不良程度为] b=10000,[...] 它们都太糟糕了,TeX 认为它们无法区分;在这种情况下c=100000,TeX 只是积累材料,直到页面足够满,可以容纳. [...]。最后一行的 b<10000符号b=*和 表示和 是无限的;总高度 [ ] 不能通过缩小可用的粘连来减少到 [ ]。因此,页面在最佳的先前位置弹出 [...]。c=*bctg

因此很明显,在读取页面内容时,[10]TeX 达到了一个点,即t总高度无法降低到g最大高度,并且页面在之前的最佳断点,内容溢出到后续页面(页面[11])。页面[11]只有一个与断点相关的最优(但无限)成本,因此页面再次被发送出去……这次页面过满,因为对于页面目标来说太大605.00336pt了。55.00336pt550pt

相关内容