我收到了一些奇怪的警告“检测到行号为 ... 的 \vbox 未满(不良程度为 10000)”。显然,我的每个“longtable”都出现了警告。有没有办法修复它们(我实际上不知道原因)或者我必须忽略它们?
最小工作示例(PdfLaTeX 在每次编译时都会三次显示这些警告longtable [2000/10/22 v4.10 Multi-page Table package (DPC)]
;每个警告\demounderfullvbox
都可以被完整的示例代码替换,或者源代码可能会减少到一个longtable
,但这不会改变行为):
\documentclass[english,11pt,a4paper]{article}
\usepackage{longtable}
\newcommand{\demounderfullvbox}{%
\begin{longtable}{|l|p{2in}|}
%
\endfirsthead
%
\hline\multicolumn{2}{|l|}{\textsl{\ldots continued from previous page}}\\*
\endhead
%
\multicolumn{2}{|l|}{\textsl{will be continued on next page\ldots}}\\*
\hline
\endfoot
%
\hline
\endlastfoot
%
\hline%
aa: & 4711\\
\hline%
aaa: & 2\\
\hline%
aaaa: & 4711-2\\
\end{longtable}
}
\begin{document}
\newpage
%
\demounderfullvbox
\demounderfullvbox
\demounderfullvbox
\end{document}
如果tabular
使用 而不是longtable
,则不会出现警告,但这并不能解决问题,因为可以在表中放置更多的行。
删除行尾\\
也aaaa:
没有任何效果。
“underfull \vbox”警告似乎指定了一个对我来说看起来正常的源代码行(当\demounderfullvbox
被示例代码替换时,这一点更加清楚),认为这个警告是在计算第一个 LTchunk 时引发的吗?
提前感谢您的帮助和建议!
答案1
未满框实际上是\hline
在表格的开头(紧接着之后进入\endlastfoot
)
相反,如果你将它从那里移除,并将其放在第一个头的末尾,如下所示,一切都会顺利进行。
目前我还不清楚造成这种情况的原因,但我确信软件包文档中已经详细解释过了......
\documentclass[english,11pt,a4paper]{article}
\usepackage{longtable}
\showboxdepth10
\showboxbreadth10
\newcommand{\demounderfullvbox}{%
\begin{longtable}{|l|p{2in}|}
\hline%
\endfirsthead
%
\hline
\multicolumn{2}{|l|}{\textsl{\ldots continued from previous page}}
\endhead
%
\multicolumn{2}{|l|}{\textsl{will be continued on next page\ldots}}\\
\hline
\endfoot
%
\hline
\endlastfoot
%
aa: & 4711\\
\hline%
aaa: & 2\\
\hline%
aaaa: & 4711-2
\end{longtable}%
}
\begin{document}
\newpage
%
\demounderfullvbox
\demounderfullvbox
\demounderfullvbox
\end{document}
答案2
该示例可以简化为
\showboxdepth=\maxdimen
\showboxbreadth=\maxdimen
\documentclass{article}
\usepackage{longtable}[2004/02/01]
\begin{document}
\begin{longtable}{l}
\hline
x
\end{longtable}
\end{document}
该.log
文件包含:
Package: longtable 2004/02/01 v4.11 Multi-page Table package (DPC)
[...]
Underfull \vbox (badness 10000) detected at line 10
\vbox(8.39996+0.0)x345.0
.\penalty 10000
.\hbox(0.4+0.0)x345.0, glue set 163.8611fill
..\glue(\tabskip) 0.0 plus 1.0fill
..\hbox(0.4+0.0)x17.27782, glue set 17.27782fill
...\leaders 0.0 plus 1.0fill
....\rule(0.4+0.0)x*
..\glue(\tabskip) 0.0 plus 1.0fill
软件包longtable
将其内容分成几块(如下\LT@start
):
\dimen@ii\vfuzz
\vfuzz\maxdimen
\setbox\tw@\copy\z@
\setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
\setbox\tw@\vbox{\unvbox\tw@}%
\vfuzz\dimen@ii
因为分割的框太大或太小\unvbox\tw@
都无所谓。将框设置为其自然大小。 过满的框由 捕获。 如果启动表格,则下一行对于 来说太大。 但是该行本身对于 来说太小,并生成 未满的。\vsplit
\setbox\tw@\vbox{\unvbox\tw@}
\vfuzz
\hline
\hline
\ht\@arstrutbox
\ht\@arstrutbox
\vbox
顺便说一句,文档说:
也可使用 \hline,如同在 tabular 中一样。
因此,我认为此行为是一个错误,可以通过设置\vbadness
为 来修复10000
,请参阅标有 的行(added)
:
\makeatletter
\def\LT@start{%
\let\LT@start\endgraf
\endgraf\penalty\z@\vskip\LTpre
\dimen@\pagetotal
\advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
\advance\dimen@ \ht\LT@foot
\edef\restore@vbadness{\vbadness\the\vbadness\relax}% (added)
\vbadness=\@M % (added)
\dimen@ii\vfuzz
\vfuzz\maxdimen
\setbox\tw@\copy\z@
\setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
\setbox\tw@\vbox{\unvbox\tw@}%
\vfuzz\dimen@ii
\restore@vbadness % (added)
\advance\dimen@ \ht
\ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@\dp
\ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
\advance\dimen@ -\pagegoal
\ifdim \dimen@>\z@\vfil\break\fi
\global\@colroom\@colht
\ifvoid\LT@foot\else
\advance\vsize-\ht\LT@foot
\global\advance\@colroom-\ht\LT@foot
\dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
\maxdepth\z@
\fi
\ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
\output{\LT@output}%
}
\makeatother