我正在尝试排版一个在第一行有标题的表格(我不是在寻找添加标题的不同/更好的解决方案,而是在寻找对此解决方案的修复。谢谢)。我想通过以下方式实现此目的具有横跨第一行的所有列的多列单元格问题是,如果文本太长,列宽不均匀,最后一列累积了多余的宽度。我希望所有列都是大约宽度相同(虽然我找不到一个像样的资料说它们应该如此),因为第二行的所有文本都是大约相同的宽度。
我觉得这种行为很令人费解,不知道原因是什么。我知道我可以通过手动设置列宽来解决这个问题,但我好奇如何在不这样做的情况下解决这个问题(我不需要或者确实想要列宽相同,但大致与其内容的长度成比例),最好但不一定仅使用表格环境(与我正在使用的文档类存在其他一些冲突)。
我做错了什么或假设错了什么?为什么?
梅威瑟:
\documentclass{article}
\begin{document}
\begin{tabular}{ccccc}
\multicolumn{5}{c}{This is a piece of text. The longer it is, the longer the last column.} \\
1 & 2 & 3 & 4 & 5 \\
\hline
\end{tabular}
\end{document}
结果表。请注意第二行的最后一列如何累积多余的宽度。
答案1
这是原始的一个特征\halign
:
\documentclass{article}
\usepackage{tabularx}
\begin{document}
\centering
\parskip2\baselineskip
\begin{tabular}{*5{c}}
\multicolumn{5}{c}{This is a piece of text. The longer it is, the longer the last column.} \\
1 & 2 & 3 & 4 & 5 \\
\hline
\end{tabular}
\begin{tabular}{*5{c}}
\multicolumn{5}{c}{\makebox[0pt]{This is a piece of text. The longer it is, the longer the last column.}} \\
1 & 2 & 3 & 4 & 5 \\
\hline
\end{tabular}
\begin{tabular*}{\textwidth}{@{\extracolsep{\textwidth minus\textwidth}}*5{c}@{}}
\multicolumn{5}{c}{This is a piece of text. The longer it is, the longer the last column.} \\
1 & 2 & 3 & 4 & 5 \\
\hline
\end{tabular*}
\begin{tabularx}{\textwidth}{*{5}{>{\centering\arraybackslash}X}}
\multicolumn{5}{c}{This is a piece of text. The longer it is, the longer the last column.} \\
1 & 2 & 3 & 4 & 5 \\
\hline
\end{tabularx}
\end{document}
答案2
非常感谢 David,这个答案对我使用 Excel2Latex 有很大帮助。我现在在序言中使用它
\usepackage{tabularx}
\usepackage{array}
\newcommand{\deftab}[2]{\begin{tabularx}{#1}{*{#2}{|>{\centering\arraybackslash}X}|}
然后使用
\deftab{width}{no. of columns}
代替
\begin{tabular}
Excel2Latex 使用的,然后我\end{tabularx}
在表格末尾替换必要的内容。它可以自动修复任何大小的表格中的所有此类问题,并且不会破坏任何格式。
答案3
我提出了一个解决方案,其中表格的大小适合其内容:
\documentclass{article}
\usepackage{array}
\usepackage{booktabs}
\usepackage{threeparttable}
\begin{document}
\newlength\widthSubTabOne
\settowidth\widthSubTabOne{This is a piece of text. The longer}
\newlength\lengthOne
\setlength\lengthOne{\dimexpr(\widthSubTabOne+2\tabcolsep)/5-2\tabcolsep\relax}
\newlength\widthSubTabTwo
\settowidth\widthSubTabTwo{it is, the longer the last column.}
\newlength\lengthTwo
\setlength\lengthTwo{\dimexpr(\widthSubTabTwo+2\tabcolsep)/2-2\tabcolsep\relax}
\begin{table}[h!]
\centering
\begin{threeparttable}
\caption{title}
\begin{tabular}{*{5}{w{c}{\lengthOne}}*{2}{w{c}{\lengthTwo}}}
\toprule
\multicolumn{5}{c}{This is a piece of text. The longer} & \multicolumn{2}{c}{it is, the longer the last column.}\\
\cmidrule(r){1-5} \cmidrule(l){6-7}
a & b\tnote{$\ast$} & c & d & e & f & g\\
\midrule
1 & 2 & 3 & 4 & 5 & 6 & 7\\
\bottomrule
\end{tabular}
\begin{tablenotes}[flushleft]
\setlength\labelsep{0pt}
\item long long long long long long long long long long long long long long long long long long long long long long long long long long long text
\end{tablenotes}
\begin{tablenotes}
\item [$\ast$] abc
\end{tablenotes}
\end{threeparttable}
\end{table}
\end{document}
答案4
LaTeX3 包tabularray
hspan=even
有一个用于均匀分配额外空间的选项:
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{tblr}{
colspec = {|c|c|c|c|c|},
hspan = even, % distribute extra space evenly
cell{1}{1} = {c=5}{c}, % multicolumn
}
\hline
This is a piece of text. The longer it is, the longer the last column. & & & & \\
\hline
1 & 2 & 3 & 4 & 5 \\
\hline
\end{tblr}
\end{document}