在 LaTeX 中平衡多列内的长表

在 LaTeX 中平衡多列内的长表

我想在 multicols 环境中放入一些更长的表格数据,同时保持其平衡能力。我尝试使用 supertabular 的技巧将其重新定义\newpagecolumnbreak。但这并不好,因为列没有正确平衡。最后我最终使用了\halign

\documentclass[11pt, a4paper]{article}
\usepackage[margin=3cm]{geometry}
\usepackage{supertabular}
\usepackage{multicol}

\def\shortlipsum{\par Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.\par}

\newcounter{entryno}
\setcounter{entryno}{1}
\def\tabline{Test & \the\value{entryno} & Description\addtocounter{entryno}{1}\\}
\def\tablines{\tabline\tabline\tabline\tabline\tabline}
\def\mybreak{\hrule width \columnwidth height 0pt \columnbreak}

\begin{document}
\begin{multicols}{2}
\shortlipsum
\medskip

% % This doesn't balance the columns. Whole table ends up in the left column (it fits)
% \begingroup\let\newpage\mybreak
% \noindent\begin{supertabular*}{\columnwidth}{@{\indent}l l l}
% \tablines\tablines\tablines\tablines\tablines\tablines
% \end{supertabular*}
% \endgroup

\begingroup\let\\\cr
\noindent\halign{\indent#\quad&#\quad&#\hfil\cr
\tablines\tablines\tablines\tablines\tablines\tablines}
\endgroup

\medskip
\shortlipsum
\end{multicols}
\shortlipsum
\end{document}

结果

我想知道我是否是唯一一个使用\halign这个方法实现此结果的人。另一方面,supertabular它却让我的右列几乎为空。你会如何解决这个问题?

答案1

如果您不想longtable在平衡分页位置的同时向表中添加页眉和页脚multicol(这需要弗兰克和我的合作:-)那么如果您首先误longtable以为它multicol根本不存在,multicol 将平衡来自 longtable 的输出。

我添加了一些规则,只是为了显示乳胶表格功能可以工作,而这对于裸机来说比较难做到\halign

在此处输入图片描述

\documentclass[11pt, a4paper]{article}
\usepackage[margin=3cm]{geometry}
\usepackage{longtable}
\usepackage{multicol}

\newsavebox\ltmcbox

\def\shortlipsum{\par Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.\par}

\newcounter{entryno}
\setcounter{entryno}{1}
\def\tabline{Test & \the\value{entryno} & Description\addtocounter{entryno}{1}\\}
\def\tablines{\tabline\tabline\tabline\tabline\tabline}


\begin{document}





\begin{multicols}{2}
\shortlipsum
\medskip

\setbox\ltmcbox\vbox{
\makeatletter\col@number\@ne
\begin{longtable}{|l|l|l|}
\tablines\tablines\tablines\tablines\tablines\tablines
\end{longtable}
\unskip
\unpenalty
\unpenalty}

\unvbox\ltmcbox




\medskip
\shortlipsum
\end{multicols}
\shortlipsum
\end{document}

答案2

诸如longtablesupertabular或比后者更好的软件包xtab旨在克服 TeX 引擎的“限制”:必须完全读取表格材料才能找到列宽。对于大型表格,这很容易导致内存问题。

不幸的是,longtable与环境不兼容multicols,而正如您所发现的,supertabular(和xtab)不会在各个页面上保持相同的列宽。使用tabular是不可能的,因为它的实现将材料锁定在一个框中内部\mathon\mathoff物品,因此牢不可破。

对于可以确定列宽的简单表格,可以使用tabbing跨页和跨列拆分:

\begin{tabbing}
Test \quad\= 99\quad\=\kill
Test \> \hfil 1  \> Description ... \\
...
Test \> \hfil 30 \> Description ...
\end{tabbing}

对于更复杂的表格,我担心较低级别\halign目前可以提供更灵活的解决方案。

答案3

这是一个环境定义,它允许您在多列环境中设置长表(使用环境multicols或传统\twocolumn声明)。它还与 vanilla 兼容, longtable但也与以下软件包兼容tabu(用于增加/缩小段落列等功能)、ltxtable 等。

请注意,某些longtable功能(如分页符/分栏符处的页眉和页脚)将不存在,但它大多作品。

\newsavebox\ltmcbox
\newenvironment{fakelongtable}
        {\setbox\ltmcbox\vbox\bgroup
        \csname @twocolumnfalse\endcsname
        \csname col@number\endcsname\csname @ne\endcsname}
        {\unskip\unpenalty\unpenalty\egroup\unvbox\ltmcbox}

使用示例:

\begin{fakelongtable}
    \begin{longtable}{|l|l|l|}
        \tablines\tablines\tablines\tablines\tablines\tablines
    \end{longtable}
\end{fakelongtable}

相关内容