为什么 multicol 环境中的 xtabular 会跨页面匹配表格高度?

为什么 multicol 环境中的 xtabular 会跨页面匹配表格高度?

我有很长的表格,需要为其生成 LaTeX。为了减少页数,我将它们分散到多个列中。

奇怪的是,xtabular 会匹配不同页面上表格的高度。我更希望它们填满每页上的所有可用空间。

此行为在multicolmulticol*环境中均持续存在。

另外,第一页的第一列很短,但我不太关心这个。

平均能量损失


\documentclass{article}
\usepackage{xtab}
\usepackage{booktabs}
\usepackage{multicol}
\usepackage[left=1in,right=1in,top=1in,bottom=1in]{geometry}

% Allows xtabular to work in multicol environment
% Adapted from http://tex.stackexchange.com/a/46876/111714
\makeatletter
\let\mcnewpage\newpage
\newcommand{\changenewpage}{%
  \renewcommand\newpage{%
    \if@firstcolumn
      \hrule width\linewidth height0pt
      \columnbreak
    \else
      \mcnewpage
    \fi
}}
\makeatother

% Repeats row n times (only for demo)
% Adapted from http://tex.stackexchange.com/a/62181/111714
\newcommand{\reprow}[1]{%
2016-08-18 19:00:57&24.9\\
\ifnum#1>1 
  \expandafter\reprow\expandafter{\numexpr#1-1\expandafter\relax\expandafter}
\fi
}

\begin{document}

% Comment/Uncomment to see effect
\vspace*{3in}

\begin{multicols*}{3}
\changenewpage
\tt

\tablefirsthead{
    \toprule
    Time&Temp \\
    \midrule
}
\tablehead{\midrule}
\tabletail{\midrule}
\tablelasttail{\bottomrule}
\begin{xtabular}{@{}p{1.4in}p{0.3in}@{}}
\reprow{255}
\end{xtabular}

\end{multicols*}

\end{document}

图片


第 1 页和第 2 页无初始 vspace

第 1 页和第 2 页的初始 vspace

(这使文档从 2 页增加到 4 页)

答案1

它居然能正常工作,这有点令人惊讶。但它表现出了如此多的问题,以至于我的结论是 xtab 毫无希望(在这种情况下,也许在一般情况下)。

打开选项debugshow,你会看到

  • 它为你没有的标题保留了空间
  • 它为头部和尾部保留了太多空间
  • 并且它高估了每行所需的空间

前两个问题解释了为什么您的第一个“页面”(即多列)显示得这么短。最后一个问题解释了为什么您的所有列都显示得这么短。

设置\columnseprule=1pt以查看 multicols 认为列的位置。可以通过设置进行一些改进\xentrystretch{-0.15},但显然这是不正确的(因为它本质上说,如果 X 是行高,则只假设其 85%),因此需要做的是了解 xtab 为何做出错误的假设(除了谨慎并将所有内容放大 10%)

正面和反面的计算结果完全错误。计算如下:

\setbox\@tempboxa=\vbox{\@arrayparboxrestore
  \ST@restore
  \expandafter\tabular\expandafter{\ST@tableformat}%
  \@@tablehead\endtabular}%
\ST@headht=\ht\@tempboxa\advance\ST@headht\dp\@tempboxa

这实际上是将头部放入自己的表格中并测量。这个想法不错,但如果标题只是 \midrule(大约一个点高),上述方法将生成一个完整的行高,即 12pt+

如果你用类似的东西代替它,情况会好一点:

\setbox\@tempboxa=\vbox{\@arrayparboxrestore
  \ST@restore
  \expandafter\tabular\expandafter{\ST@tableformat}%
  XXX\\%
  \@@tablehead
  YYY\\\endtabular}%
\ST@headht=\ht\@tempboxa\advance\ST@headht\dp\@tempboxa
\advance\ST@headht-2\ht\strutbox
\advance\ST@headht-2\dp\strutbox

但这并没有考虑到\arraystretch背景中还发生了更多的事情,因此结果仍然给出高端的值。

存在这样的问题:为标题保留了大量的空间,即使没有,也会有 20pt 左右的空间被去掉,并且那部分还会有其他奇怪的部分。

最后至于为什么\vspace会产生这种奇怪的效果:

  • 需要达到的柱高仅计算两次。第一次是在制作第一根柱子之前,第二次是在制作第二根柱子时
  • 假设第一列是“特殊”的,因为它包含 firsthead
  • 这意味着所有后续列都与第二列得到相同的处理

在标准乳胶的双列模式下这甚至都不正确,因为如果该表真的很长,则可能会在稍后插入悬垂图形*,因此图形会缩短第二页(即第 3 列和第 4 列)。

但是对于多列来说,它会失败得更厉害,因为多列之前的任何材料都会缩短前 x 列的空间,从前 x 页的 xtab 角度来看,因此所有页面/列都会缩短。

总之,我认为 xtab 存在很多问题,在我看来,在很多情况下,当不使用多列时,这些问题也应该会出现。也许可以修复所有问题,但这将是一项更艰巨的任务。

相关内容