
Betrachten Sie dieses Beispiel, in dem ich versuche, eine vertikale Linie durch einen Teil der Tabelle zu zeichnen:
\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}
Beim Ausführen erhalte ich:
! Misplaced \omit.
\multispan ->\omit
\@multispan
l.12 ...x[origin=c]{90}{\footnotesize Predicted}}}
?
Wenn ich einfach klicke Enter
und weitermache, wird diese nette Tabelle erstellt:
das sieht fast, aber nicht ganz so aus, wie ich es möchte. (Die vertikale Linienbreite scheint zu dick zu sein), aber was hat es mit dem Auslassen auf sich? Warum ist das da? Und wie kann ich es beheben?
Antwort1
Du kannst nicht \multicolumn
drinnen sein \multirow
. Nur andersherum.
Ich füge eine andere Realisierung der Tabelle hinzu, bei der die Leser ihren Kopf nicht neigen müssen.
Die Breite der Regeln in tabular
(die über |
Zeichen eingefügt werden) beträgt \arrayrulewidth
. \cmidrule
Für booktabs
verwendet \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}
Antwort2
Die Tabellen werden in TeX (typischerweise) durch Primitive erstellt \halign
. Dieses Primitiv hat (grob gesagt) folgende Syntax
\halign { premable1 # postamble1 & preamble2 # postamble2 \cr
data11 & data12 \cr
data21 & data22 \cr
}
Das obige Pseudobeispiel erstellt eine Tabelle:
preamble1 data11 postamble1 preamble2 data12 postamble2
preamble1 data21 postamble1 preamble2 data22 postamble2
Manchmal möchten Benutzer die Präambel-Postambel für einzelne Elemente in der Tabelle (oder mehrere Elemente nebeneinander in der Tabelle) weglassen. TeX ist bereit, dieser Anforderung nachzukommen, wenn der Datenteil des Tabellenelements mit dem \omit
Primitiv beginnt. TeX beginnt das Lesen des Datenteils in einem speziellen Modus, in dem es den Eingabestrom erweitert und Leerzeichen ignoriert. Wenn das erste Nicht-Leerzeichen nach der Erweiterung ist \omit
, werden Präambel-Postambel weggelassen. Andernfalls kehrt TeX zur Präambel zurück, erweitert sie und liest dann die Daten des Elements. Wenn das \omit-Primitiv nicht das erste Objekt des Elements ist, druckt TeX den \omit
Fehler „falsch platziert“ und ignoriert ihn.
Das \multicoumn
LaTeX-Makro wird zum ersten Element erweitert \omit
, weil der Benutzer das Präambel-Postambel hier weglassen möchte. Beispielsweise r
wird in LaTeX die Präambel einer Tabelle in eine Low-Level-Präambel für umgewandelt, \halign
aber der Benutzer schreibt \multicolumn{2}{c}
, also c
kein r
. Wenn darüber hinaus eins vorhanden ist, 2
möchte der Benutzer über zwei Spalten gehen und das Makro gibt ein \span
Primitiv aus (aber das ist im Moment nicht wichtig). Das LaTeX-Makro \mutlirow
erstellt ein \vbox
, d. h., wenn \multirow
das erste Objekt im Tabellenelement ist, wird es nicht zu erweitert \omit
und die Präambel wird normalerweise verwendet. Aber Sie haben \multispan
nach geschrieben \multirow
, also innerhalb eines \vbox
. Das \multispan
Makro wird zu erweitert, \omit
aber dies ist kein zulässiger Platz für die Verwendung von \omit
. Sie erhalten die Fehlermeldung.