
Considere este ejemplo en el que intento dibujar una línea vertical a través de parte de la tabla:
\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}
Al ejecutarlo me sale:
! Misplaced \omit.
\multispan ->\omit
\@multispan
l.12 ...x[origin=c]{90}{\footnotesize Predicted}}}
?
Si simplemente golpeo Enter
y sigo adelante, se produce esta bonita tabla:
que se parece casi, pero no del todo, a lo que quiero. (Parece que el ancho de la línea vertical es demasiado grueso), pero ¿a qué se debe todo esto de omitir? ¿Por qué está eso ahí? ¿Y cómo puedo solucionarlo?
Respuesta1
No puedes tenerlo \multicolumn
dentro \multirow
. Sólo al revés.
Agrego una realización diferente de la mesa que no requiere que los lectores inclinen la cabeza.
El ancho de las reglas en tabular
(aquellas insertadas mediante |
caracteres) es \arrayrulewidth
. Para \cmidrule
, booktabs
usos \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}
Respuesta2
Las tablas se crean en TeX (normalmente) mediante \halign
primitivas. Esta primitiva tiene (en términos generales) la siguiente sintaxis
\halign { premable1 # postamble1 & preamble2 # postamble2 \cr
data11 & data12 \cr
data21 & data22 \cr
}
Este pseudoejemplo anterior crea una tabla:
preamble1 data11 postamble1 preamble2 data12 postamble2
preamble1 data21 postamble1 preamble2 data22 postamble2
A veces los usuarios quieren omitir el preámbulo-postámbulo de un elemento individual de la tabla (o de más elementos uno al lado del otro en la tabla). TeX está listo para cumplir con la solicitud si la parte de datos del elemento de la tabla comienza con la \omit
primitiva. TeX comienza a leer la parte de datos en un modo especial donde expande el flujo de entrada e ignora los espacios. Si el primer no espacio después de la expansión es \omit
, entonces se omiten el preámbulo y el postámbulo. De lo contrario, TeX regresa al preámbulo, lo expande y luego continúa leyendo los datos del elemento. Si la primitiva \omit no es el primer objeto del elemento, entonces TeX imprime \omit
un error fuera de lugar y lo ignora.
La \multicoumn
macro LaTeX se expande al primer elemento \omit
, porque el usuario desea omitir el postámbulo aquí. Por ejemplo, r
en LaTeX el preámbulo de la tabla se transforma en un preámbulo de bajo nivel para \halign
pero el usuario escribe \multicolumn{2}{c}
, es decir c
, no r
. Además, si hay 2
un usuario que desea abarcar dos columnas y la macro emite \span
una primitiva (pero no es importante por ahora). La macro LaTeX \mutlirow
crea un \vbox
, lo que significa que si \multirow
es el primer objeto en el elemento de la tabla, entonces no se expande \omit
y normalmente se usa el premable. Pero has escrito \multispan
después \multirow
, es decir, dentro de un \vbox
. La \multispan
macro se expande \omit
pero no se permite su uso en este lugar \omit
. Obtienes el error.