考虑这个例子,我试图在表格的一部分上画一条垂直线:
\documentclass{memoir}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{graphicx}
\begin{document}
\begin{tabular}{lrrrr}
\toprule
& & \multicolumn{3}{c}{Actual} \\
\cmidrule(lr){3-5}
& & Melanoma & Carcinoma & Normal \\
\multirow{3}{*}{\multicolumn{1}{l|}{\rotatebox[origin=c]{90}{\footnotesize Predicted}}}
& Melanoma & 30 & 2 & 0 \\
& Carcinoma & 5 & 28 & 0 \\
& Normal & 0 & 5 & 35 \\
\bottomrule
\end{tabular}
\end{document}
运行它时我得到:
! Misplaced \omit.
\multispan ->\omit
\@multispan
l.12 ...x[origin=c]{90}{\footnotesize Predicted}}}
?
如果我只是点击Enter
并继续,它就会产生这个漂亮的表格:
这看起来几乎是我想要的,但又不完全是。(似乎垂直线太粗了)但省略的内容是什么?为什么会这样?我该如何修复它?
答案1
你不能拥有\multicolumn
inside \multirow
。只能反过来。
我添加了表格的不同实现,不需要读者倾斜头部。
tabular
中的规则(通过字符插入的规则)的宽度|
为\arrayrulewidth
。对于\cmidrule
,booktabs
使用\cmidrulewidth
。
\documentclass{memoir}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage{siunitx} % for the second realization
\setlength{\arrayrulewidth}{\cmidrulewidth}% for the first realization
\begin{document}
\begin{tabular}{lrrrr}
\toprule
& & \multicolumn{3}{c}{Actual} \\
\cmidrule(lr){3-5}
& & Melanoma & Carcinoma & Normal \\
\multicolumn{1}{l|}{\multirow{3}{*}{\rotatebox[origin=c]{90}{\footnotesize Predicted}}}
& Melanoma & 30 & 2 & 0 \\
\multicolumn{1}{l|}{}
& Carcinoma & 5 & 28 & 0 \\
\multicolumn{1}{l|}{}
& Normal & 0 & 5 & 35 \\
\bottomrule
\end{tabular}
\bigskip
\begin{tabular}{
@{}
l
*{3}{S[table-format=2.0]}
@{}
}
\toprule
Predicted & \multicolumn{3}{c}{Actual} \\
\cmidrule(l){2-4}
& {Melanoma} & {Carcinoma} & {Normal} \\
\midrule
Melanoma & 30 & 2 & 0 \\
Carcinoma & 5 & 28 & 0 \\
Normal & 0 & 5 & 35 \\
\bottomrule
\end{tabular}
\end{document}
答案2
在 TeX 中,表格通常由原\halign
语创建。该原语(粗略地说)具有以下语法
\halign { premable1 # postamble1 & preamble2 # postamble2 \cr
data11 & data12 \cr
data21 & data22 \cr
}
上面的伪示例创建了一个表:
preamble1 data11 postamble1 preamble2 data12 postamble2
preamble1 data21 postamble1 preamble2 data22 postamble2
有时用户想要省略表中单个项目(或表中并排的多个项目)的前后文。如果表项目的数据部分以基元开头,TeX 便可满足该请求\omit
。TeX 开始以一种特殊模式读取数据部分,在该模式下,它会扩展输入流并忽略空格。如果扩展后的第一个非空格是\omit
,则省略前后文。否则 TeX 返回到前文,对其进行扩展,然后读取项目的数据。如果 \omit 基元不是项目的第一个对象,则 TeX 会打印放错位置的\omit
错误并忽略它。
LaTeX\multicoumn
宏扩展为第一项\omit
,因为用户想在此处省略前言-后言。例如,r
在 LaTeX 中,表格的前言被转换为的低级前言,\halign
但用户写入\multicolumn{2}{c}
,即c
没有r
。此外,如果有,2
则用户想要跨越两列,并且宏发出\span
原语(但现在并不重要)。LaTeX 宏\mutlirow
创建一个\vbox
,这意味着如果\multirow
是表格项目中的第一个对象,那么它不会扩展为,并且可以正常使用前言。但是您在之后\omit
写入,即在里面。宏扩展为但这不是允许使用的地方。您会收到错误。\multispan
\multirow
\vbox
\multispan
\omit
\omit