使用表格进行拉伸*

使用表格进行拉伸*

我在这里找到了这个解决方案来均匀地拉伸空间之间环境中的所有列tabular*

\documentclass[fontsize=11pt, paper=a4, DIV=9]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{siunitx}
\usepackage{booktabs}

\begin{document}

\begin{center}
\begin{tabular*}{\linewidth}{@{\extracolsep{\stretch{1}}}S[table-format=2.0]S[table-format=33.0]@{}}
\toprule
{$x$} & {$y$} \\
\midrule
1 & 64 \\
2 & 20736 \\
3 & 16777216 \\
4 & 25600000000 \\
5 & 63403380965376 \\
6 & 232218265089212416 \\
7 & 1180591620717411303424 \\
8 & 7958661109946400884391936 \\
9 & 68719476736000000000000000000 \\
10 & 739696442014594807059393047166976 \\
\bottomrule
\end{tabular*}
\end{center}

\end{document}

如何实现剩余空间均匀分布在第一列之前,在所有列之间和最后一列之后

附录

我希望避免使用虚拟列,以便能够轻松地将复杂表格复制粘贴到其他文档中。我倾向于使用tabular*oder tabularx,当且仅当未拉伸的宽度tabular接近\textwidth时。在我看来,在这些情况下,如果拉伸仅发生在第一列之前或仅发生在最后一列之后或仅发生在列之间,看起来并不好看。

(这个问题可能以前被问过,但是我没能找到解决方案。)

答案1

\extracolsep添加之间柱子,而不是外侧。

您可以在任一侧添加虚拟列,但我发现结果不是最优的。

\documentclass[fontsize=11pt, paper=a4, DIV=9]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{siunitx}
\usepackage{booktabs}

\begin{document}

\begin{center}
\begin{tabular*}{\linewidth}{
  @{\extracolsep{\fill}}
  c
  S[table-format=2.0]
  S[table-format=33.0]
  c
  @{}
}
\toprule
& {$x$} & {$y$} & \\
\midrule
& 1 & 64 & \\
& 2 & 20736 & \\
& 3 & 16777216 & \\
& 4 & 25600000000 & \\
& 5 & 63403380965376 & \\
& 6 & 232218265089212416 & \\
& 7 & 1180591620717411303424 & \\
& 8 & 7958661109946400884391936 & \\
& 9 & 68719476736000000000000000000 & \\
& 10 & 739696442014594807059393047166976 & \\
\bottomrule
\end{tabular*}
\end{center}

\end{document}

在此处输入图片描述

表格应该有其自然宽度,例外情况是表格的宽度与行宽相差不大。但无论如何,两列表格都不应该被拉伸。

在此处输入图片描述

在这种情况下,文本宽度为 398.33862pt,表格的自然宽度为 221.87434pt,仅为 56%。


没有虚拟列的(半)自动解决方案:

\documentclass[fontsize=11pt, paper=a4, DIV=9]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{siunitx}
\usepackage{booktabs}
\usepackage{environ}

\newsavebox{\tabplusbox}
\newlength{\tabpluswd}
\NewEnviron{tabular+}[3][\linewidth]
 {%
  \setlength{\tabcolsep}{0pt}%
  \sbox\tabplusbox{\begin{tabular}{@{}#3@{}}\BODY\end{tabular}}%
  \setlength{\tabpluswd}{\dimexpr(#1-\wd\tabplusbox)/\numexpr#2+1\relax}%
  \begin{tabular*}{\textwidth}{
    @{\extracolsep{\fill}\hspace{\tabpluswd}}
    #3
    @{\hspace{\tabpluswd}}
  }
  \BODY
  \end{tabular*}%
}

\begin{document}

\begin{center}

\begin{tabular+}{2}{
  S[table-format=2.0]
  S[table-format=33.0]
}
\toprule
{$x$} & {$y$} \\
\midrule
1 & 64 \\
2 & 20736 \\
3 & 16777216 \\
4 & 25600000000 \\
5 & 63403380965376 \\
6 & 232218265089212416 \\
7 & 1180591620717411303424 \\
8 & 7958661109946400884391936 \\
9 & 68719476736000000000000000000 \\
10 & 739696442014594807059393047166976 \\
\bottomrule
\end{tabular+}
\end{center}

\end{document}

您必须传递列数(可以从说明符中进行解析,但这会很麻烦)。

诀窍是测量表格的自然宽度,然后通过减去和除以列数加一来计算要插入的列间空间量。然后我们可以在两边插入计算出的填充量并计算正确的值\extracolsep

相关内容