自动将窄表格分成两列的方法?

自动将窄表格分成两列的方法?

有没有一种简单的方法可以将狭长的表格分成两列(或更多列)(即无需手动重新排列列)?

在下面的例子中,您可以看到有很多浪费的空间,因为有一张长桌子,旁边有很多空白(并且\twocolumn没有像我希望的那样工作......):

\documentclass{article}

\begin{document}

\begin{table}
  \centering
  \twocolumn
  \begin{tabular}{cc}
    \hline
    thing & mapsto \\
    \hline
    foo 0 & bar 2 \\
    foo 1 & bar 3 \\
    foo 2 & bar 4 \\
    foo 3 & bar 5 \\
    foo 4 & bar 6 \\
    foo 5 & bar 7 \\
    foo 6 & bar 8 \\
    foo 7 & bar 9 \\
    foo 8 & bar 10 \\
    foo 9 & bar 11 \\
    foo 10 & bar 12 \\
    foo 11 & bar 13 \\
    foo 12 & bar 14 \\
    foo 13 & bar 15 \\
    foo 14 & bar 16 \\
    foo 15 & bar 17 \\
    foo 16 & bar 18 \\
    foo 17 & bar 19 \\
    foo 18 & bar 20 \\
    foo 19 & bar 21 \\
    \hline
  \end{tabular}
  \caption{What is this?}
  \onecolumn
\end{table}

Pellentesque sed posuere magna. Ut pellentesque dictum posuere. Mauris at justo ipsum. Maecenas sit amet neque erat, nec euismod nisi. Nullam posuere convallis massa vel luctus. Etiam vestibulum semper lectus, sed ultrices leo aliquet sit amet. Vestibulum in lorem vitae magna scelerisque porttitor ut volutpat dui. Nulla risus felis, molestie et tincidunt sit amet, ullamcorper vestibulum erat. Pellentesque bibendum porttitor velit, at tempor erat sollicitudin at. Sed nec nunc lacus. Sed sollicitudin sollicitudin risus sit amet mollis. Nam posuere tincidunt lacus, ut placerat arcu pharetra at. Proin tempus, orci sed consequat consequat, nulla augue tempus augue, vel fermentum mi augue eget odio.

\end{document}

因此,最终结果应该类似于我手动将上表更改为以下内容所获得的结果:

  \begin{tabular}{ccp{1em}cc}
    \hline
    thing & mapsto && thing & mapsto \\
    \hline
    foo 0 & bar 2 && foo 10 & bar 12 \\
    foo 1 & bar 3 && foo 11 & bar 13 \\
    ...

我正在使用,booktabs所以如果潜在的解决方案与此包兼容就好了。(相关问题是表格的两列布局我从哪里得到这个想法\twocolumn

答案1

pgfplotstable可以做这样的安排。

的目的pgfplotstable是加载(大型)数据文件并对其进行处理。其典型用例是后处理和漂亮地打印数值表。

但是,它也能将巨大的列分成两列(或三列或其他);它也能处理非数字数据。它接受 CSV 文件或以 和 分隔的文件&\\但是,它不是表格:它需要“原始数据”和生成合适的表格。

虽然它可以轻松处理动态平衡多列的任务,但您需要学习如何重新插入“旧”的格式指令,如\hlines 或\multicolumns。您还必须学习如何分配列显示名称、如何添加任何垂直线等。它可以做所有这些事情,只是因为该工具的用例不同(它假设没有表格,只有数据文件)而有所不同。

以下是示例。我随意为上一段中提出的一些问题添加了示例答案:

在此处输入图片描述

\documentclass{standalone}

\usepackage{pgfplotstable}
\usepackage{booktabs}

\begin{document}

\pgfplotstabletypeset[
    every head row/.style={before row=\toprule,after row=\midrule},
    every last row/.style={after row=\bottomrule},
    col sep=ampersand,
    row sep=\\,
    %
    columns={thing,mapsto,thing,mapsto},
    display columns/0/.style={
        % first part of 2 of `thing':
        select equal part entry of={0}{2},
        string type,
            % column display name:
        column name={thing (1/2)},
        column type={r}, % ... and type
    },
    display columns/1/.style={
        % first part of 2 of `mapsto':
        select equal part entry of={0}{2},
        string type,
        column name={thing (2/2)},
        column type={l|},
    },
    display columns/2/.style={select equal part entry of={1}{2},string type},% second part of 2 of `thing'
    display columns/3/.style={select equal part entry of={1}{2},string type},% second part of 2 of `maps'
]{
    thing & mapsto \\
    foo 0 & bar 2 \\
    foo 1 & bar 3 \\
    foo 2 & bar 4 \\
    foo 3 & bar 5 \\
    foo 4 & bar 6 \\
    foo 5 & bar 7 \\
    foo 6 & bar 8 \\
    foo 7 & bar 9 \\
    foo 8 & bar 10 \\
    foo 9 & bar 11 \\
    foo 10 & bar 12 \\
    foo 11 & bar 13 \\
    foo 12 & bar 14 \\
    foo 13 & bar 15 \\
    foo 14 & bar 16 \\
    foo 15 & bar 17 \\
    foo 16 & bar 18 \\
    foo 17 & bar 19 \\
    foo 18 & bar 20 \\
    foo 19 & bar 21 \\
}
\end{document}

http://pgfplots.sourceforge.net/pgfplotstable.pdf

答案2

一种方法是使用 Will Robertson 的包收集表格主体environ,然后使用 LaTeX3 代码重新组织行。

首先使用 分离行并将其存储到“序列变量”(在其他语言中称为列表)中\seq_set_split:Nnn。由于表以 结尾\\,因此生成的序列以空项结尾。序列的第一项(表的第一行)是标题,我们将不得不重复它。我们可以从序列中“弹出”第一行并将其存储在 中\l_DT_header_tl以供以后重用。然后弹出下一个L/2序列中的项目,并将它们存储到另一个序列中,其中大号是初始序列的长度(表中的行数)。我们现在有两个序列,一个contents_A保存表的前半部分,contents另一个保存表的后半部分。

这里有一些神奇的函数(它只存在于两个序列中,否则我们需要做更多的工作),\seq_mapthread_function:NNN它允许我们并行地从两个序列中获取项目,从而并排排版它们:\DT_one_row:nn从每个序列中获取一个项目并扩展到结果的一行,#1&&#2\\

\documentclass{article}
\usepackage{booktabs}
\usepackage{environ}
\usepackage{expl3}
\ExplSyntaxOn
\seq_new:N \l_DT_contents_seq
\seq_new:N \l_DT_contents_A_seq
\tl_new:N \l_DT_header_tl
\cs_generate_variant:Nn \seq_set_split:Nnn { NnV }
\NewEnviron{dbltbl}[2]
  {
    % Separate the rows.
    \seq_set_split:NnV \l_DT_contents_seq { \\ } \BODY

    % Extract the header.
    \seq_pop_left:NN \l_DT_contents_seq \l_DT_header_tl

    % Split the table between "contents_A" and "contents".
    \seq_clear:N \l_DT_contents_A_seq
    \prg_replicate:nn
      { \int_div_truncate:nn { \seq_length:N \l_DT_contents_seq } {2} }
      {
        \seq_pop:NN \l_DT_contents_seq \l_tmpa_tl
        \seq_put_right:NV \l_DT_contents_A_seq \l_tmpa_tl
      }

    % Typeset.
    \begin{tabular}{#1p{#2}#1}
      \toprule
      \l_DT_header_tl && \l_DT_header_tl \\
      \midrule
      \seq_mapthread_function:NNN
        \l_DT_contents_A_seq
        \l_DT_contents_seq
        \DT_one_row:nn
      \bottomrule
    \end{tabular}
  }
\cs_new:Npn \DT_one_row:nn #1#2 { #1 && #2 \\ }
\ExplSyntaxOff

\begin{document}

\begin{table}
  \centering
  \begin{dbltbl}{cc}{1em}
    thing & mapsto \\
    foo 0 & bar 2 \\
    foo 1 & bar 3 \\
    foo 2 & bar 4 \\
    foo 3 & bar 5 \\
    foo 4 & bar 6 \\
    foo 5 & bar 7 \\
    foo 6 & bar 8 \\
    foo 7 & bar 9 \\
    foo 8 & bar 10 \\
    foo 9 & bar 11 \\
    foo 10 & bar 12 \\
    foo 11 & bar 13 \\
    foo 12 & bar 14 \\
    foo 13 & bar 15 \\
    foo 14 & bar 16 \\
    foo 15 & bar 17 \\
    foo 16 & bar 18 \\
    foo 17 & bar 19 \\
    foo 18 & bar 20 \\
    foo 19 & bar 21 \\
  \end{dbltbl}
  \caption{What is this?}
\end{table}

Pellentesque sed posuere magna. Ut pellentesque dictum posuere. Mauris at justo ipsum. Maecenas sit amet neque erat, nec euismod nisi. Nullam posuere convallis massa vel luctus. Etiam vestibulum semper lectus, sed ultrices leo aliquet sit amet. Vestibulum in lorem vitae magna scelerisque porttitor ut volutpat dui. Nulla risus felis, molestie et tincidunt sit amet, ullamcorper vestibulum erat. Pellentesque bibendum porttitor velit, at tempor erat sollicitudin at. Sed nec nunc lacus. Sed sollicitudin sollicitudin risus sit amet mollis. Nam posuere tincidunt lacus, ut placerat arcu pharetra at. Proin tempus, orci sed consequat consequat, nulla augue tempus augue, vel fermentum mi augue eget odio.

\end{document}

相关内容