我想在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}