枚举内的表格:使用 booktabs 的 \toprule 时如何垂直对齐?

枚举内的表格:使用 booktabs 的 \toprule 时如何垂直对齐?

我想在enumerate环境中显示一个表格,使第一行与项目标签对齐。我当前的代码如下:

\documentclass{article}
\usepackage{enumitem}
\usepackage{booktabs}

\setenumerate{listparindent=\parindent, parsep=0pt}

\begin{document}
\begin{enumerate}[align=left, label=\large\sffamily\bfseries \alph*)]
  \item
  \begin{tabular}[t]{cccc}
    \toprule
    $m$ & $P(R=a,M=m)$ & $P(R=b,M=m)$ & $P(R=c,M=m)$ \\
    \midrule
    1 & 0.1 & 0.2 & 0.3 \\
    2 & 0.2 & 0.1 & 0.1 \\
    \bottomrule
  \end{tabular}

  \item
  \( 
    \displaystyle
    P(0) = P(0|B) P(B) + P(0|G) P(G)
  \)
\end{enumerate}
\end{document}

不幸的是(尽管使用了t环境选项tabular),由于命令的原因,对齐并不像预期的那样\toprule。如果我删除它,一切都很好。我该如何解决这个问题?

此外,如何才能使表格在当前行内水平居中?我尝试使用一个浮动表格,用 围绕它\begin{table}\end{table},但这会进一步改变垂直位置。

答案1

您需要强制调整第一行以与标签对齐。下面我介绍了ttabular插入此垂直调整(由常规基线跳跃加上构成\toprule*的所有规则宽度组成)。水平居中是使用方法实现的\hfill<item>\hfill\null。您也可以使用宽度为 的框\linewidth

在此处输入图片描述

\documentclass{article}
\usepackage{enumitem,booktabs}% http://ctan.org/pkg/{enumitem,booktabs}

\setenumerate{listparindent=\parindent, parsep=0pt}

\newenvironment{ttabular}[2][c]
  {\begin{tabular}[#1]{#2}
     \\[\dimexpr-\normalbaselineskip-\abovetopsep-\belowrulesep-\heavyrulewidth]
  }{\end{tabular}}

\begin{document}
\begin{enumerate}[align=left, label=\large\sffamily\bfseries \alph*)]
  \item \hfill%
  \begin{ttabular}[t]{cccc}
    \toprule
    $m$ & $P(R=a,M=m)$ & $P(R=b,M=m)$ & $P(R=c,M=m)$ \\
    \midrule
    1 & 0.1 & 0.2 & 0.3 \\
    2 & 0.2 & 0.1 & 0.1 \\
    \bottomrule
  \end{ttabular}%
  \hfill\null%

  \item
  \( 
    \displaystyle
    P(0) = P(0|B) P(B) + P(0|G) P(G)
  \)
\end{enumerate}
\end{document}

请注意,垂直调整会导致高度tabular升高,这可能会与上方的内容重叠。从这个意义上讲,如果需要,您也必须进行调整以适应这种情况。

*其中一个长度\abovetopsep实际上默认设置为 0pt。

答案2

您可以模拟 的操作array\firsthline但是,表格很可能会与前面的材料发生冲突,而且您无论如何都必须添加一些垂直空间:

\documentclass{article}
\usepackage{lipsum} % just for the example
\usepackage{enumitem}
\usepackage{booktabs}

\makeatletter
\newcommand{\firsttoprule}{%
  \addlinespace[\dimexpr-\aboverulesep-\belowrulesep-\heavyrulewidth-\ht\@arstrutbox]
  \toprule}
\makeatother

\setlist[enumerate]{listparindent=\parindent, parsep=0pt}

\begin{document}
\lipsum*[2]
\begin{enumerate}[
  align=left,
  label=\large\sffamily\bfseries\alph*),
  before=\vspace{1.5ex}
]
\item
  \begin{tabular}[t]{cccc}
  \firsttoprule
  $m$ & $P(R=a,M=m)$ & $P(R=b,M=m)$ & $P(R=c,M=m)$ \\
  \midrule
  1 & 0.1 & 0.2 & 0.3 \\
  2 & 0.2 & 0.1 & 0.1 \\
  \bottomrule
  \end{tabular}

\item
  \( 
    \displaystyle
    P(0) = P(0|B) P(B) + P(0|G) P(G)
  \)
\end{enumerate}
\lipsum[2]
\end{document}

在此处输入图片描述

请注意,这\setenumerate是一个已弃用的命令。

答案3

您也可以adjustbox通过调整垂直对齐来使用该包:

在此处输入图片描述 在此处输入图片描述

\documentclass{article}
\usepackage{enumitem}
\usepackage{booktabs}
\usepackage{adjustbox}

\setlist[enumerate]{listparindent=\parindent, parsep=0pt} % edited as per @egreg comment

\begin{document}
\begin{enumerate}[align=left, label=\large\sffamily\bfseries \alph*)]
  \item
    \begin{adjustbox}{valign=t} % The key value, t, adjusts the vertical alignment
    \makebox[\linewidth]{       % Causes the centering
    \begin{tabular}{cccc}
    %\noalign{\vskip-.85ex}      % Uncomment to see the second output
    \toprule
    $m$ & $P(R=a,M=m)$ & $P(R=b,M=m)$ & $P(R=c,M=m)$ \\
    \midrule
    1 & 0.1 & 0.2 & 0.3 \\
    2 & 0.2 & 0.1 & 0.1 \\
    \bottomrule
  \end{tabular}}
    \end{adjustbox}
  \item
  \( 
    \displaystyle
    P(0) = P(0|B) P(B) + P(0|G) P(G)
  \)
\end{enumerate}
\end{document}

相关内容