如何平衡此类声明的列:
\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
之外的所有列都具有相同的宽度。X
X
tabularx
\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
。您必须减去正确的tabcolsep
s 数量,即每列两个(四列共八个)。如果您有垂直标尺,您还必须减去正确的arrayrulewidth
s 数量。
我已经“改进”了前面的例子。如果你看一下 -column 的定义A
,它现在显示为:
\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/2-1.5\tabcolsep\relax}}
- 如果您喜欢居中或右对齐的列,您可以更改
\RaggedRight
为\Centering
或\RaggedLeft
。 - 如果您需要总宽度小于完整 的表格
linewidth
,则将其更改(1\linewidth)
为正确的分数。例如,如果您需要 80% 的表格linewidth
,则使用(0.8\linewidth)
。 - 公式
25/100/2
是 -列的相对宽度A
,这里是 25%。这个数字是要设置为使 的总和为newcolumntype
100。因此,B
-列使用。最后一位数字是-或-列75/100
的数量。A
B
- 如果删除左右边距 (
@{}
),则要减去的 s 数量tabcolsep
将比 s 总数少 2 个tabcolsept
。如果有四列,则必须减去六列;如果有六列,则必须减去十列。ETC。公式为-(2\tabcolsep-(\tabcolsep/<no. col.type>))
。如果您有三A
列,则必须减去-(2\tabcolsep-(\tabcolsep/3))
。 - 如果你使用垂直线,你也必须正确分配数量
arrayruleswidth
。我把这个留给你作为练习。
上面,我假设您将使用相同数量的每种列类型(ABAB、ABBA、ABBBAAETC.)。在自动计算中,你必须考虑到列类型的数量不一定是相同的(你可能有 ABBAA、ABABA、ETC)。因此,您很容易得到一个非常复杂的软件包。可能最好使用计算器或笔和纸来固定列宽。显然,这比在 LaTeX 中编程要快得多。
注意! 我强调这一点,tabularx
并tabulary
已为您完成所有计算。不过,请查看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}
(红线表示文本边框)