使用 m{} 将表格列的单元格居中

使用 m{} 将表格列的单元格居中

我想使用表格列出一些标题,这些标题可能很长或包含换行符。第一列是第二列内容的索引或键,所以我想(垂直)将其居中(我将添加 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 中,小页面下面没有足够的空间)。 非垂直居中第一列的 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}

看起来像这样。

现在垂直居中的第一列的 MWE

\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指令可以解决这个问题,但它不够优雅。

相关内容