我将非常感激有关如何将多行文本居中的建议。在下面的 MWE 中,多行文本“spring”并未在其跨越的三行上居中。
\documentclass[10pt,a4paper,twoside,open=right,headinclude,footinclude]{scrreprt}
\usepackage{classicthesis-ldpkg}
\usepackage{multirow}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
\begin{document}
\begin{table}[htbf]
\centering
\begin{tabular}{|M{20mm}|M{20mm}|M{20mm}|} \hline
Type & Specs & Uses\\ \hline
-- & Model 1 & blah blah blah blah blah blah blah blah \\ \hline
\multirow{3}*{spring} & Model 2 & blah blah blah blah blah blah blah blah \\ \cline{2-3}
& Model 3 & blah blah blah blah blah blah blah blah \\ \cline{2-3}
& Model 4 & blah blah blah blah blah blah blah blah \\ \hline
\end{tabular}
\end{table}
\end{document}
但是,在表中的每个条目仅包含一行的简单情况下,多行文本正确居中,如以下 MWE 所示:
\documentclass[10pt,a4paper,twoside,open=right,headinclude,footinclude]{scrreprt}
\usepackage{classicthesis-ldpkg}
\usepackage{multirow}
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
\begin{document}
\begin{table}[htbf]
\centering
\begin{tabular}{|M{20mm}|M{20mm}|M{20mm}|} \hline
Type & Specs & Uses \\ \hline
-- & Model 1 & blah \\ \hline
\multirow{3}*{spring} & Model 2 & blah \\ \cline{2-3}
& Model 3 & blah \\ \cline{2-3}
& Model 4 & blah \\ \hline
\end{tabular}
\end{table}
\end{document}
答案1
我建议您也加载该array
包,因为它将有助于(垂直)居中单元格的内容;事实上,如果您加载了这个包,您multirow
根本不需要担心。
另外,与 egreg 的回答相同,我强烈建议您使用该booktabs
包来获得(更多!)更好的“规则”(水平线)上方和下方的垂直间距,从而使您的表格看起来更加“专业”。在下面的代码和图像中,观察使用命令\cmidrule{1-3}
在整个表格宽度上绘制一条线,其厚度为“cmidrule”,而不是“midrule”。最后,对于表格材料的布局,我建议对第 1 列和第 2 列使用普通的“p”列类型,以使它们的内容左对齐。:-)
\documentclass{scrreprt}
\usepackage{classicthesis} % I don't have "classicthesis-ldpkg" on my system...
\usepackage{array,booktabs}
\newcommand{\bla}{blah blah blah blah blah blah blah blah}
\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{p{20mm}p{20mm}M{20mm}} \toprule
Type & Specs & Uses \\ \midrule
-- & Model 1 & \bla \\ \cmidrule{1-3}
& Model 2 & \bla \\ \cmidrule(l){2-3}
Spring & Model 3 & \bla \\ \cmidrule(l){2-3}
& Model 4 & \bla \\ \bottomrule
\end{tabular}
\end{table}
\end{document}
答案2
这是必须使用 基元 的典型情况。 是\valign
常用基元的转置基元。这意味着数据首先插入到列中,并用 分隔 ,然后这些列并排组合。每个数据项成为其行的最大高度。在此示例中,每个数据项的宽度设置为常量。\halign
\valign
\halign
\cr
LaTeX 表格类包使用\halign
原始包。我不知道
\valign
某些包是否使用了,因为我不了解所有的 LaTeX
包。
尽管如此,我还是能够展示它\valign
在 TeX 原始层面上的工作原理。抱歉,它不是 LaTeX。
\def\setrowparams{\hsize=25mm \leftskip=.5em \rightskip=\leftskip
\emergencystretch=2em \noindent\hfil}
\def\blah{blah blah blah blah blah blah blah blah}
\def\blahh{\blah\ \blah\ \blah\ blah blah blah}
\def\multirow#1#2{\multispan{#1}\hrule\vfil\vbox{\setrowparams\topstrut#2\botstrut}\vfil}
\def\topstrut{\vbox to3ex{}} \def\botstrut{\vtop to2ex{}}
\vbox{\hbox{\vrule
\valign{&\hrule\vfil\vbox{\setrowparams\topstrut#\unskip\botstrut}\vfil\cr
Type & & \multirow3{spring} \cr \noalign{\vrule}
Specs & Model 1 & Model 2 & Model 3 & Model 4 \cr \noalign{\vrule}
Uses & \hfilneg\blah & \hfilneg\blahh & \hfilneg\blah &
\hfilneg\blah \cr
\noalign{\vrule}
}}\hrule}
\end
现在“spring”这个词垂直居中每种情况用 blah blah 填充最后一栏……
LaTeX 如何做到这一点?答案“用 LaTeX 前言和后言包围我的代码”不被接受。
答案3
作为一个在该问题最后一次提出几年后遇到类似问题的人,似乎这里的大多数答案都只是建议在这种情况下有帮助但一般情况下没有用的东西。
在搜索了许多其他问题之后,我发现了这个问题[使用行数超过 1 行的单元格进行多行垂直对齐] 是最有帮助的。不幸的是,答案基本上是“多行本身无法做到这一点,但您可以根据具体情况进行调整。”
我自己对此的观察是,多行不会考虑行之间的额外空间,因为\addlinespace
(我认为这会在和booktabs
周围增加额外的垂直空间,所以会被这些所抛弃)并且表现得好像它跨越的所有行(第一行除外)都是单行(即,如果第二行或后续行跨越多行,则垂直间距将会混乱)。\midrule
\cmidrule
multirow
答案4
可以使用垂直对齐makecell
。它的内容看起来像一个迷你表格,可以\\
根据需要换行。而且,它“玩得很好”booktabs
:
\documentclass{article}
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\usepackage{makecell}% http://ctan.org/pkg/makecell
\newcommand{\bla}{%
\makecell[r]{blah blah\\blah blah blah\\\midrule blah blah\\blah blah}%
}
\begin{document}
\begin{table}[ht]
\centering
\begin{tabular}{p{20mm}p{20mm}c} \toprule
Type & Specs & Uses \\ \midrule
-- & Model 1 & \bla \\ \cmidrule{1-3}
& Model 2 & \bla \\ \cmidrule{2-3}
Spring & Model 3 & \bla \\ \cmidrule{2-3}
& Model 4 & \bla \\ \bottomrule
\end{tabular}
\end{table}
\end{document}