我想格式化一个表格,其中第一列只有一行文本,垂直居中,行数可变。目前,我使用并IfEqCase
仅在满足某些条件时在第一列添加条目。只要我有固定的行数,并且该数字是奇数(否则,条目将不会垂直居中),这种方法就有效:
\documentclass[11pt]{article}
\usepackage{multirow}
\usepackage{xstring}
\newcommand{\gridsize}[1]{\ensuremath{#1 \times #1}}
\newcommand{\addrowmpi}[4]{%
\IfEqCase{#1}{%
{1} {&} %
{2} {\gridsize{#2} &} %
{4} {&} %
}
#3 & #4 \%}
\begin{document}
\begin{table}[ht]
\caption{Multi-row table}
\begin{center}
\begin{tabular}{ccc}
\hline
\addrowmpi{1}{512}{462.7}{100} \\
\addrowmpi{2}{512}{231.4}{50}\\
\addrowmpi{4}{512}{115.7}{25}\\
\hline
\end{tabular}
\end{center}
\label{tab:multicol}
\end{table}
\end{document}
结果如下:
但我希望行数可变,理想情况下的格式类似于addrowmpi
。第一列条目应在行间垂直居中。
有没有办法可以使用multirow
行数可变的环境?
答案1
通过嵌套表格,我基本上可以实现我想要的功能。下面是我想出的代码(比上面的代码略有简化):
\documentclass[11pt]{article}
\usepackage{array}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}m{#1}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}m{#1}}
\newenvironment{timingtable}
{\begin{tabular}{R{30pt}|R{30pt}|R{30pt}}}
{\end{tabular}}
\newcommand{\addrow}[3]{#1 & #2 & #3 \%}
\setlength{\tabcolsep}{10pt}
\begin{document}
% Actual width of each column is 30 + 2*tabcolsep
\begin{table}[ht]
\caption{Multi-row table}
\begin{center}
\begin{tabular}{|C{20pt}|@{}p{150pt}@{}|}
\hline
512 &
\begin{timingtable}
\addrow{462.7}{222.0}{100} \\
\addrow{231.4}{111.0}{50} \\
\addrow{154.2}{74.0}{33} \\
\addrow{115.7}{37.0}{25} \\
\end{timingtable} \\
\hline
\end{tabular}
\end{center}
\label{tab:multicol}
\end{table}
\end{document}
第一列的宽度为 20 + 2*tabcolsep = 40pt,符合预期。嵌套表格中的每一列的宽度为 30+2*tabcolsep = 50。@{}
外部 tabular 命令抑制了tabcolsep
嵌套表格周围添加的额外空间,导致嵌套表格的第一列和最后一列太宽。