我有很长的表格,需要为其生成 LaTeX。为了减少页数,我将它们分散到多个列中。
奇怪的是,xtabular 会匹配不同页面上表格的高度。我更希望它们填满每页上的所有可用空间。
此行为在multicol
和multicol*
环境中均持续存在。
另外,第一页的第一列很短,但我不太关心这个。
平均能量损失
\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 存在很多问题,在我看来,在很多情况下,当不使用多列时,这些问题也应该会出现。也许可以修复所有问题,但这将是一项更艰巨的任务。