自动平衡表格列吗?

自动平衡表格列吗?

如何平衡此类声明的列:

\begin{tabularx}{\linewidth}{
  >{\hsize=0.4\hsize}X% 10% of 4\hsize
  >{\hsize=1.6\hsize}X% 30% of 4\hsize
  >{\hsize=0.4\hsize}X% 10% of 4\hsize
  >{\hsize=1.6\hsize}X% 30% of 4\hsize
  }
\end{tabularx}

显然,这些值0.4必须1.6在构建时自动调整......

例子:

     .--------- Same width ---------------.
     |                                    |
<----+--->                            <---+---->    
┌────────┬────────────────────────────┬────────┬───────────────────────────┐
│ A      │ B                          │ A      │ B                         │
├────────┼────────────────────────────┼────────┼───────────────────────────┤
│ 132132 │ Sed rutrum elit quis neque │ 42     │ Cras porta                │
└────────┴────────────────────────────┴────────┴───────────────────────────┘
         <------------+--------------->        <-------------+------------->
                      |                                      |
                      '------------- Same width -------------'

其中奇数列有大小A,偶数列有大小B?这样,我保证第 1 列和第 3 列始终具有相同的大小,而第 2 列和第 4 列在空间中均匀分布。

换句话说,列的最小宽度确定如下:

min_widths[0] = min_widths[2] = max(map(width, columns[0] + columns[2]))
min_widths[1] = min_widths[3] = max(map(width, columns[1] + columns[3]))

然后一切都伸展到适合\linewidth

if sum(min_widths) > \linewidth: 
    % Attempts to wrap some text and reduce the column sizes
else: 
    widths = map(lambda x: x * (\linewidth / sum(min_widths), min_widths)

该特征的良好参数为:

- Column alignment: left, center, right, raggedleft, raggedright
- Maximum width: e.g. 10em
- Minimum width: e.g. 0em
- Desired width ratio: 1
- Automatic wrapping: yes, no

答案1

这是一个{NiceTabular}具有nicematrix(≥ 6.25a) 的解决方案。在该环境中,您有一个键,要求除列(与 的列类似)columns-width=auto之外的所有列都具有相同的宽度。XXtabularx

\documentclass{article}
\usepackage{nicematrix}
\usepackage{lipsum} % for dummy text

\begin{document}

\lipsum[1]
\begin{center}
\begin{NiceTabular}{lXlX}[columns-width=auto,hvlines]
A & B & A & B \\
132132 & Sed rutrum elit quis neque & 42 & Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna
fringilla ultrices. 
\end{NiceTabular}
\end{center}
\lipsum[2]

\end{document}

上述代码的输出

答案2

编辑 20190807在答案的最后,我附上了我推荐的代码,这是 Zarko 和我的答案的融合。

您可能必须tabular使用整数,linewidth方法是将 -列的宽度计算p{}为 的分数linewidth。只需确保总列宽累加到 即可linewidth。您必须减去正确的tabcolseps 数量,即每列两个(四列共八个)。如果您有垂直标尺,您还必须减去正确的arrayrulewidths 数量。

我已经“改进”了前面的例子。如果你看一下 -column 的定义A,它现在显示为:

\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/2-1.5\tabcolsep\relax}}
  1. 如果您喜欢居中或右对齐的列,您可以更改\RaggedRight\Centering\RaggedLeft
  2. 如果您需要总宽度小于完整 的表格linewidth,则将其更改(1\linewidth)为正确的分数。例如,如果您需要 80% 的表格linewidth,则使用(0.8\linewidth)
  3. 公式25/100/2是 -列的相对宽度A,这里是 25%。这个数字是要设置为使 的总和为newcolumntype100。因此,B-列使用。最后一位数字是-或-列75/100的数量。AB
  4. 如果删除左右边距 ( @{}),则要减去的 s 数量tabcolsep将比 s 总数少 2 个tabcolsept。如果有四列,则必须减去六列;如果有六列,则必须减去十列。ETC。公式为-(2\tabcolsep-(\tabcolsep/<no. col.type>))。如果您有三A列,则必须减去-(2\tabcolsep-(\tabcolsep/3))
  5. 如果你使用垂直线,你也必须正确分配数量arrayruleswidth。我把这个留给你作为练习。

上面,我假设您将使用相同数量的每种列类型(ABAB、ABBA、ABBBAAETC.)。在自动计算中,你必须考虑到列类型的数量不一定是相同的(你可能有 ABBAA、ABABA、ETC)。因此,您很容易得到一个非常复杂的软件包。可能最好使用计算器或笔和纸来固定列宽。显然,这比在 LaTeX 中编程要快得多。

注意! 我强调这一点,tabularxtabulary已为您完成所有计算。不过,请查看tabularx手册中的第 4.3 节。

下面我附上了一个包含六列的表格的代码:

在此处输入图片描述

\documentclass{article}
\usepackage{array, booktabs, ragged2e}

\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\newcolumntype{B}{>{\Centering\arraybackslash}p{\dimexpr(1\textwidth)*75/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\usepackage{showframe}

\renewcommand*\ShowFrameColor{\color{red}}
\renewcommand*\ShowFrameLinethickness{.4pt}

\setlength{\tabcolsep}{2pt}

\begin{document}
{\centering
\begin{tabular}{@{}ABABBA@{}}

\toprule
A   &    B  &   A   &   B &   A   &   B\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text  & Wide centered column, which has lots of text & Short left alig\-ned column  \\
\bottomrule

\end{tabular}%
}
\end{document}

推荐示例代码

\documentclass{article}
\usepackage{booktabs, ragged2e}
\usepackage{tabularx} 
\newcolumntype{D}{>{\small\RaggedRight\arraybackslash\hsize=0.4\hsize}X}
\newcolumntype{E}{>{\small\Centering\arraybackslash\hsize=1.6\hsize}X}
\setlength{\tabcolsep}{1.5pt}

\begin{document}

\noindent\begin{tabularx}{\linewidth}{@{}DEDEED@{}}
\toprule
D   &    E  &   D   &   E  &   E   &   D\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text  & Wide centered column, which has lots of text & Short left alig\-ned column  \\
\bottomrule
\end{tabularx}
\end{document}

答案3

据我理解,表格的宽度应等于文本的宽度。所以,我看不出有什么优势(可能是因为我休假?)为什么不是tabularx按照我在下面的问题评论中所建议的方式使用:

\documentclass{article} 
\usepackage{tabularx} 

\begin{document}
    \begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{2}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} } 
    \hline 
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx 
    & xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\ 
    \hline 
\end{tabularx}
\caption{Four column}
    \end{table}
    \begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{3}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} }
    \hline 
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx 
    & xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx 
        & xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\
    \hline 
\end{tabularx}
\caption{Sixt column}
    \end{table}
\end{document}

在此处输入图片描述

(红线表示文本边框)

相关内容