
Considere este exemplo em que estou tentando desenhar uma linha vertical em parte da tabela:
\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}
Ao executá-lo, recebo:
! Misplaced \omit.
\multispan ->\omit
\@multispan
l.12 ...x[origin=c]{90}{\footnotesize Predicted}}}
?
Se eu apenas clicar Enter
e seguir em frente, isso produzirá esta bela tabela:
que se parece quase, mas não exatamente com o que eu quero. (Parece que a largura da linha vertical é muito grossa), mas por que toda essa omissão? Por que isso está aí? E como posso consertar isso?
Responder1
Você não pode ter \multicolumn
dentro \multirow
. Só que o contrário.
Acrescento uma realização diferente da tabela que não exige que os leitores inclinem a cabeça.
A largura das regras tabular
(aquelas inseridas por meio de |
caracteres) é \arrayrulewidth
. Para \cmidrule
, booktabs
usa \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}
Responder2
As tabelas são criadas em TeX (normalmente) por \halign
primitivo. Esta primitiva tem (grosso modo) a seguinte sintaxe
\halign { premable1 # postamble1 & preamble2 # postamble2 \cr
data11 & data12 \cr
data21 & data22 \cr
}
Este pseudoexemplo acima cria uma tabela:
preamble1 data11 postamble1 preamble2 data12 postamble2
preamble1 data21 postamble1 preamble2 data22 postamble2
Às vezes, os usuários desejam omitir o preâmbulo-postâmbulo para itens individuais na tabela (ou mais itens lado a lado na tabela). O TeX está pronto para atender à solicitação se a parte de dados do item da tabela começar com o \omit
primitivo. O TeX começa a ler a parte dos dados em um modo especial onde expande o fluxo de entrada e ignora espaços. Se o primeiro não-espaço após a expansão for \omit
, então o preâmbulo e o pós-âmbulo serão omitidos. Caso contrário, o TeX retorna ao preâmbulo, expande-o e segue com a leitura dos dados do item. Se a primitiva \omit não for o primeiro objeto do item, então o TeX imprime \omit
um erro mal colocado e o ignora.
A \multicoumn
macro LaTeX se expande para o primeiro item \omit
, porque o usuário deseja omitir o pramble-postamble aqui. Por exemplo, r
no LaTeX, o preâmbulo da tabela é transformado em preâmbulo de baixo nível para \halign
mas o usuário escreve \multicolumn{2}{c}
, ou seja c
, não r
. Além disso, se houver, 2
o usuário deseja abranger duas colunas e a macro emite \span
primitivo (mas isso não é importante por enquanto). A macro LaTeX \mutlirow
cria um \vbox
, significa que se \multirow
for o primeiro objeto no item da tabela, ele não se expande para \omit
e o preâmbulo é normalmente usado. Mas você escreveu \multispan
depois \multirow
, ou seja, dentro de um \vbox
. A \multispan
macro se expande para, \omit
mas este não é um local permitido para uso \omit
. Você recebe o erro.