我正在尝试使用 tabularx 创建一个表格,以便将表格拉伸到整个页面宽度。通常,它不需要整个宽度,但如果是这样,我更喜欢它。在我的表格中,我有一些多行单元格,因此我\cline{2-9}
在某些时候使用 \hline 而不是 \hline。最后,我想让我的单元格内容居中。但是,我似乎无法将所有这些方面结合起来。
如果我使用\begin{tabularx}{\textwidth}{llXXXXXXX} %\textwidth or \linewith leads to the same result
拉伸,但单元格值的居中却不起作用,正如本例所示
如果我尝试\begin{tabularx}{\textwidth}{llccccccc}
居中工作,但 \cline 和 \hline 出了问题
精简代码:
\begin{table}[H]
\centering
\begin{threeparttable} %because I'm using footnotes
\caption{some caption}
\label{tab:some table}
\begin{tabularx}{\textwidth}{llccccccc}
\toprule
& &\multicolumn{7}{c}{some ID} \\
& &1 &2 &3 &4 &5 &6 &7 \\ \midrule
\multirow{2}{*}{This is} &a test &$\sim$ &2 &+ &+ &+ &+ &+ \\ \cline{2-9}
¬ a test &+ &10 &+ &+ &+ &+ &-- \\ \hline
\end{tabularx}
\end{threeparttable}
\end{table}
有人能帮我解决这个问题吗?太好了!
PS:我也在Reddit但还没有收到答复。如果找到了可行的解决方案,我会告诉你。
答案1
这里有四种制作表格的方法。
最重要的是:你有至少指定一X
列tabularx
。但您实际上并不需要它,如表 2 所示。
另一方面,这\multirow
对清晰度没有任何帮助,恰恰相反,见表 3(其中左右填充也被删除)。
我会简单地使用自然宽度,除非最终尺寸与全局文本宽度没有太大差别。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tabularx,booktabs,multirow,array}
\begin{document}
\begin{table}
\centering
\caption{The table with \texttt{tabularx}}
\begin{tabularx}{\textwidth}{XX*{7}{c}}
\toprule
& &\multicolumn{7}{c}{some ID} \\
& &1 &2 &3 &4 &5 &6 &7 \\ \midrule
\multirow{2}{*}{This is} &a test &$\sim$ &2 &+ &+ &+ &+ &+ \\ \cmidrule{2-9}
¬ a test &+ &10 &+ &+ &+ &+ &-- \\ \bottomrule
\end{tabularx}
\bigskip
\caption{The table with \texttt{tabular*}}
\begin{tabular*}{\textwidth}{
@{\extracolsep{\fill}\hspace{\tabcolsep}}
ll
>{$}c<{$}
@{\extracolsep{0pt}\hspace{2\tabcolsep}}
*{6}{>{$}c<{$}}
}
\toprule
& &\multicolumn{7}{c}{some ID} \\
& &1 &2 &3 &4 &5 &6 &7 \\ \midrule
\multirow{2}{*}{This is} & a test & \sim & 2 & + & + & + &+ & + \\
\cmidrule{2-9}
& not a test & + & 10 & + & + & + &+ & - \\
\bottomrule
\end{tabular*}
\bigskip
\caption{The table with \texttt{tabular*} and no \texttt{\string\multirow}}
\begin{tabular*}{\textwidth}{
@{\extracolsep{\fill}}
ll
>{$}c<{$}
@{\extracolsep{0pt}\hspace{2\tabcolsep}}
*{6}{>{$}c<{$}}
@{}
}
\toprule
& &\multicolumn{7}{c}{some ID} \\
\cmidrule(l){3-9}
& &1 &2 &3 &4 &5 &6 &7 \\ \midrule
This is & a test & \sim & 2 & + & + & + &+ & + \\
\cmidrule(l){2-9}
& not a test & + & 10 & + & + & + &+ & - \\
\bottomrule
\end{tabular*}
\bigskip
\caption{The table as I would do}
\begin{tabular}{
@{}
ll
*{7}{>{$}c<{$}}
@{}
}
\toprule
& &\multicolumn{7}{c}{some ID} \\
\cmidrule(l){3-9}
& &1 &2 &3 &4 &5 &6 &7 \\ \midrule
This is & a test & \sim & 2 & + & + & + &+ & + \\
\cmidrule(l){2-9}
& not a test & + & 10 & + & + & + &+ & - \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案2
正如评论中所建议的那样,我添加了以下列类型
\newcolumntype{Z}{>{\centering\arraybackslash}X}
这样内容就居中了。然后我ccccccc
用*{7}{Z}
(语法定义 7 个连续的Z
类型列)更改了列。
我还添加了\otoprule
分隔符,以便\toprule
标题行之间的线条粗细相同但间距相等:
\newcommand{\otoprule}{\midrule[\heavyrulewidth]}
MWE 如下:
\documentclass{article}
\usepackage{tabularx}
\usepackage{threeparttable}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}
\newcolumntype{Z}{>{\centering\arraybackslash}X}
\newcommand{\otoprule}{\midrule[\heavyrulewidth]}
\begin{table}
\centering
\begin{threeparttable} %because I'm using footnotes
\caption{some caption}
\label{tab:sometable}
\begin{tabularx}{\textwidth}{ll*{7}{Z}}
\toprule
& & \multicolumn{7}{c}{some ID} \\
& & 1 & 2 & 3 & 4 & 5 & 6 & 7 \\ \midrule
\multirow{2}{*}{This is} & a test & $\sim$ & 2 & + & + & + & + & + \\ \cline{2-9}
& not a test & + & 10 & + & + & + & + & -- \\ \hline
\end{tabularx}
\end{threeparttable}
\end{table}
\end{document}