每个 longtable 中的 \vbox 都未满...可以修复还是必须将其忽略?

每个 longtable 中的 \vbox 都未满...可以修复还是必须将其忽略?

我收到了一些奇怪的警告“检测到行号为 ... 的 \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

相关内容