我有一张包含多行和多列的表格,其中有一列名称较长,需要换行。但是,生成的表格留下了不需要的空格:
% \usepackage{amssymb}
% \usepackage{array}
% \newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
% \def\toprule{\specialrule{1.5pt}{0pt}{0pt}}
% \def\botrule{\toprule}
% \def\headerrule{\hline\hline}
% \def\midrule{\specialrule{0.5pt}{0pt}{0pt}}
\begin{table}
\centering
\begin{tabular}{C{2cm}|C{1cm}|C{1cm}|C{1cm}|C{2cm}|C{4cm}}
\toprule
Column A & \multicolumn{3}{c|}{Column B} & Column C is a very long name & Column D \\
\cline{2-4}
& B1 & B2 & B3 & & \\
\headerrule
blah & \checkmark & \checkmark & \checkmark & blah & blah \\
\midrule
\multirow{2}{*}{blahs} & -- & \multirow{2}{*}{\checkmark} & --
& \multirow{2}{*}{blahs}
& \checkmark\\ \cline{6-6}
& & & & & -- \\ \cline{6-6}
\midrule
blah & \checkmark & -- & \checkmark & blah & blah \\
\botrule
\end{tabular}
\end{table}
当我尝试指定单个多列时,它不遵守 2cm 限制(黄色突出显示),水平居中混乱(蓝色圆圈),并且产生不一致的垂直居中(红色圆圈)。我该如何解决这些问题?
\begin{tabular}{C{2cm}|C{1cm}|C{1cm}|C{1cm}|C{2cm}|C{4cm}}
\toprule
\multicolumn{1}{c|}{Column A} & \multicolumn{3}{c|}{Column B}
& \multicolumn{1}{c|}{Column C is a very long name}
& \multicolumn{1}{c}{Column D} \\
\cline{2-4}
& B1 & B2 & B3 & & \\
\headerrule
blah & \checkmark & \checkmark & \checkmark & blah & blah \\
\midrule
\multirow{2}{*}{blahs} & -- & \multirow{2}{*}{\checkmark} & --
& \multirow{2}{*}{blahs}
& \checkmark\\ \cline{6-6}
& & & & & -- \\ \cline{6-6}
\midrule
blah & \checkmark & -- & \checkmark & blah & blah \\
\botrule
\end{tabular}
编辑:使用 Booktabs 包寻找解决方案
答案1
- 如果您考虑一下我对您上一个问题的回答,您就会避免您的问题。
- 由于您没有提供完整的小文档,因此的定义
C{...}
未知。如果它基于p{...}
列类型,则不应该发生这种情况。 multirow
如果我的猜测正确的话,看起来两个表格是相同的,但是单元格的使用方式不同。
编辑:
- 以下是表格的两个示例:
- 首先:
- 在表格序言中定义了水平线
- 列宽属于
X
已定义的类型
- 第二 :
- 对于水平线,使用
booktabs
包中定义的规则,并将其插入表中,就像您在代码片段中所做的那样 - 列的宽度是用长度定义的,就像代码片段中那样(而不是用
C
列(其定义未知)来Q
定义列类型说明符,它是在tabularray
- 列宽属于
X
具有定义宽度比率的类型
- 对于水平线,使用
- 除了显示的示例之外,您还可以对两个表进行某种组合。例如,在第一个表中使用第二个表中的列规范,反之亦然,在第二个表中使用第一个表中的列规范:
\documentclass{article}
\usepackage[margin=40mm, % just gueesed
showframe % remove in real document
]{geometry}
\usepackage[skip=1ex,
font=sf, labelfont=bf,
singlelinecheck=false]{caption}
\usepackage{tabularray}
\UseTblrLibrary{booktabs}
\usepackage{dingbat}
\newcommand\cm{\checkmark}
\begin{document}
\begin{table}[ht]
\centering
\sffamily
\caption{CAPTION.}
%%%% first table
\begin{tblr}{hline{1,Z}=1pt,
hline{2,4-Z}=solid,
hline{3} = {1}{-}{},
hline{3} = {2}{-}{},
vline{2-Y} = solid,
colspec={X[2, c] *{3}{X[c]} X[2,c] X[4,c]},
vspan=even
}
\SetCell[r=2]{h} Column A
& \SetCell[c=3]{c} Column B
& & & \SetCell[r=2]{h} Column C is a very long name
& \SetCell[r=2]{h} Column D \\
& B1 & B2 & B3 & & \\
blah & \cm & \cm & \cm & blah & blah \\
\SetCell[r=2]{m} blah
& \SetCell[r=2]{m} --
& \SetCell[r=2]{m} \cm
& \SetCell[r=2]{m} --
&\SetCell[r=2]{m} blah
& \cm \\
& & & & & blah \\
blah & \cm & -- & \cm & blah & blah \\
\end{tblr}
%%%% second table
\bigskip
\begin{tblr}{vline{2-Y} = solid,
colspec={Q[c, wd=2cm] *{3}{Q[c, wd=1cm]} Q[c, wd=2cm] Q[c, wd=4cm]},
vspan=even
}
\toprule
\SetCell[r=2]{h} Column A
& \SetCell[c=3]{c} Column B
& & & \SetCell[r=2]{h} Column C is a very long name
& \SetCell[r=2]{h} Column D \\
\midrule
& B1 & B2 & B3 & & \\
\midrule
\midrule
blah & \cm & \cm & \cm & blah & blah \\
\midrule
\SetCell[r=2]{m} blah
& \SetCell[r=2]{m} --
& \SetCell[r=2]{m} \cm
& \SetCell[r=2]{m} --
&\SetCell[r=2]{m} blah
& \cm \\
\midrule
& & & & & blah \\
\midrule
blah & \cm & -- & \cm & blah & blah \\
\bottomrule
\end{tblr}
\end{table}
\end{document}