错位省略是什么意思?

错位省略是什么意思?

考虑这个例子,我试图在表格的一部分上画一条垂直线:

\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

你不能拥有\multicolumninside \multirow。只能反过来。

我添加了表格的不同实现,不需要读者倾斜头部。

tabular中的规则(通过字符插入的规则)的宽度|\arrayrulewidth。对于\cmidrulebooktabs使用\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

相关内容