我正在尝试正确格式化下表:
\documentclass[a4paper,twoside]{report}
\usepackage{array,colortbl,multirow,multicol,booktabs,ctable}
\newcommand{\hdrule}{\midrule[\heavyrulewidth]}
\usepackage[english]{babel}
\usepackage{xunicode}
\usepackage[no-math]{fontspec}
\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{ccccccc>{\itshape}r}
\toprule
a & b & c & d & e & f & g & 1 \\ \hdrule
\multirow{4}{*}{A} & \multirow{4}{*}{B} & \multirow{4}{*}{C} & \multirow{4}{*}{D} & \multirow{2}{*}{E} & F & G & 2 \\ \cmidrule{6-8}
&&&&& H & I & 3 \\ \cmidrule{5-8}
&&&& J & K & L & 4 \\ \cmidrule{5-8}
&&&& M & N & --- & 5 \\ \hdrule
--- & --- & --- & --- & O & P & Q & 6 \\ \bottomrule
\end{tabular}
\end{table}
\end{document}
我使用 包booktabs
来处理水平规则,但似乎它会弄乱 计算出的垂直居中multirow
。例如,ABC 和 D 应该与分隔线 2 和 3 的规则对齐,而 E 应该与分隔线 1 和 2 的规则对齐。相反,它略高一些。
有没有办法解决?
答案1
为了微调垂直位置,您可以使用第二个可选参数\multirow
:
\documentclass[a4paper,twoside]{report}
\usepackage{array,colortbl,multirow,multicol,booktabs,ctable}
\newcommand{\hdrule}{\midrule[\heavyrulewidth]}
\usepackage[english]{babel}
\usepackage{xunicode}
\usepackage[no-math]{fontspec}
%\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{ccccccc>{\itshape}r}
\toprule
a & b & c & d & e & f & g & 0 \\ \hdrule
\multirow{5}{*}[-2pt]{A} & \multirow{5}{*}[-2pt]{B} & \multirow{5}{*}[-2pt]{C} & \multirow{5}{*}[-2pt]{D} & \multirow{2}{*}[-3pt]{E} & F & G & 1 \\ \cmidrule{6-8}
&&&&& H & I & 2 \\ \cmidrule{5-8}
&&&& J & K & L & 3 \\ \cmidrule{5-8}
&&&& M & N & --- & 4 \\ \hdrule
--- & --- & --- & --- & O & P & Q & 5 \\ \bottomrule
\end{tabular}
\end{table}
\end{document}
我注释掉了该行\setmainfont
只是因为我没有那个字体。
答案2
您可以使用 做您想做的事情{NiceTabular}
(nicematrix
≥ 4.0,2020-05-08)。您无需进行任何调整,因为nicematrix
考虑了行的实际高度,而multirow
仅使用 标准值 进行计算\baselineskip
。
\documentclass{article}
\usepackage{nicematrix}
\usepackage{booktabs}
\newcommand{\hdrule}{\midrule[\heavyrulewidth]}
\begin{document}
\begin{table}[ht]
\centering
\begin{NiceTabular}{*{7}{C}>{\itshape}R}
\toprule
a & b & c & d & e & f & g & 1 \\ \hdrule
\Block{4-1}{A} & \Block{4-1}{B} & \Block{4-1}{C} & \Block{4-1}{D} & \Block{2-1}{E} & F & G & 2 \\ \cmidrule{6-8}
&&&&& H & I & 3 \\ \cmidrule{5-8}
&&&& J & K & L & 4 \\ \cmidrule{5-8}
&&&& M & N & --- & 5 \\ \hdrule
--- & --- & --- & --- & O & P & Q & 6 \\ \bottomrule
\end{NiceTabular}
\end{table}
\end{document}
答案3
补充说明:你\usepackage{ctable}
,但你不使用它。这里有一个替代的、更干净的方法来做到这一点(这里你不需要 array、colortbl、multicol、booktabs、babel 和 xunicode):
%!xelatex
\documentclass[a5paper,twoside]{report}
\usepackage{multirow,ctable}
\usepackage[no-math]{fontspec}
\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
\begin{document}
\ctable[pos = ht,caption = ctable version]{ccccccc>{\itshape}r}{}{\FL
a & b & c & d & e & f & g & 0 \ML
\multirow{5}{*}[-2pt]{A} & \multirow{5}{*}[-2pt]{B} & \multirow{5}{*}[-2pt]{C} & \multirow{5}{*}[-2pt]{D} & \multirow{2}{*}[-3pt]{E} & F & G & 1 \NN \cmidrule{6-8}
&&&&& H & I & 2 \NN \cmidrule{5-8}
&&&& J & K & L & 3 \NN \cmidrule{5-8}
&&&& M & N & --- & 4 \ML[\heavyrulewidth]
--- & --- & --- & --- & O & P & Q & 5 \LL
}
\end{document}