使用多行和书形标签进行垂直对齐

使用多行和书形标签进行垂直对齐

我正在尝试正确格式化下表:

\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}

相关内容