我想使用表格列出一些标题,这些标题可能很长或包含换行符。第一列是第二列内容的索引或键,所以我想(垂直)将其居中(我将添加 s\midrule
以提高可读性)。为了实现居中,我包含了array
-package 及其列定义m{2.5em}
。其余两列也有固定宽度。但是 - 如下面的 MWE 所示 - 第一列以某种方式垂直放置在顶部或底部,但没有居中。
\documentclass[a4paper,div=calc]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{array,booktabs,calc}
\begin{document}
\begin{tabular}{>{\raggedleft}m{2.5em}b{.5\textwidth-6\tabcolsep-8em}p{5.5em}}%
\toprule\textbf{\#}&\textbf{Name}&\textbf{Notes}\\\midrule%
A &
Lorem ipsum dolor sit amet, consectetur adipisici elit&\\
B & \begin{minipage}[t]{.5\textwidth-6\tabcolsep-8em}
An\\even\\higher\\row\\with\\linebreaks
\end{minipage}&\\
2 & Short Entry &
\\\bottomrule
\end{tabular}
\end{document}
它看起来是这样的,正如你所看到的,第一列不是垂直居中(我知道在这个快速 MWE 中,小页面下面没有足够的空间)。
有任何想法吗?
答案1
使用tabularx
重新定义的X
列类型,那么您不需要calc
包:
\documentclass[a4paper,div=calc]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{booktabs,tabularx}
\renewcommand\tabularxcolumn[1]{m{#1}}
\begin{document}
\begin{tabularx}{0.5\linewidth}{>{\raggedleft}m{2.5em} X m{5.5em}}%
\toprule\textbf{\#}&\textbf{Name}&\textbf{Notes}\\\midrule%
A & Lorem ipsum dolor sit amet, consectetur adipisici elit&\\
B & An\newline even\newline higher\newline
row\newline with\newline linebreaks & \\
2 & Short Entry &
\\\bottomrule
\end{tabularx}
\end{document}
答案2
egreg 在对原始问题的评论中提到的一个解决方案是,封装内容并计算用于迷你页面的高度。我将其调整到我的 MWE 中,它看起来像这样
\documentclass[a4paper,div=calc]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{array,booktabs,calc}
\newcommand{\finalcell}[1]{%
\begingroup\sbox0{\begin{minipage}{.5\textwidth-6\tabcolsep-8em}%
\raggedright#1\end{minipage}}%
\xdef\finalheight{\the\dimexpr\ht0+\dp0+\smallskipamount\relax}%
\endgroup
\vspace{.5\cmidrulesep}
\begin{minipage}[t][\finalheight][t]{.5\textwidth-6\tabcolsep-8em}\raggedright#1\end{minipage}%&
}
\begin{document}
\begin{tabular}{>{\raggedleft}m{2.5em}m{.5\textwidth-6\tabcolsep-8em}m{5.5em}}%
\toprule\textbf{\#}&\textbf{Name}&\textbf{Notes}\\\midrule%
A & \finalcell{Lorem ipsum dolor sit amet, consectetur adipisici elit}&\\\addlinespace[3\cmidrulesep]
B & \finalcell{An\\even\\higher\\row\\with\\linebreaks}&\\\addlinespace[3\cmidrulesep]
2 & \finalcell{Short Entry} &
\\\bottomrule
\end{tabular}
\end{document}
看起来像这样。
我\addlinespace
在行尾另外添加了 s,我认为,可以通过在开始表格之前增加 booktabs 表格的行距来优化。
答案3
应用这个问题的答案对于原始示例,这里有一个可以给出改进结果的方法。
\documentclass[a4paper,div=calc]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{array,booktabs,calc}
\newdimen{\lcellwd}
\newcommand{\lcell}[2][\lcellwd]{%
$\vcenter{\hsize#1\baselineskip11pt\vspace*{3pt}\raggedright#2\strut\par}$}
\setlength{\extrarowheight}{1pt}
\begin{document}
\setlength{\lcellwd}{.5\textwidth-6\tabcolsep-8em}
\begin{tabular}{>{\raggedleft}m{2.5em}b{.5\textwidth-6\tabcolsep-8em}p{5.5em}}%
\toprule\textbf{\#}&\textbf{Name}&\textbf{Notes}\\\midrule%
A &
\lcell{Lorem ipsum dolor sit amet, consectetur adipisici elit}&\\
B & \lcell{%
An\\even\\higher\\row\\with\\linebreaks}&\\
2 & Short Entry\strut &
\\\bottomrule
\end{tabular}
\end{document}
编辑:通过将指令移动到定义\baselineskip
之前,可以引入一个可以从外部设置的变量:\par
\lcell
\newlength{\lcbaseline}
\setlength{\lcbaseline}{11pt}
\newcommand{\lcell}[2][\lcellwd]{%
$\vcenter{\hsize#1\vspace*{3pt}\raggedright#2\strut\baselineskip\lcbaseline\par}$}
这将调整连续文本的基线,如组“A”中所示,因为当前有效的基线是在段落“换行”时使用的。但是,当\\
使用时它会崩溃,我还没有弄清楚\\
当前基线值在哪里“冻结”。使用\break
而不是\\
确实会产生调整后的基线,但它不是很有弹性;在两个地方包括该\baselineskip
指令可以解决这个问题,但它不够优雅。