
Рассмотрим пример, где я пытаюсь провести вертикальную линию через часть таблицы:
\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
Внутри быть не может \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
ошибку и игнорирует ее.
Макрос \multicoumn
LaTeX расширяется до первого элемента \omit
, потому что пользователь хочет опустить здесь преамбулу-постамбулу. Например, r
в преамбуле LaTeX таблица преобразуется в преамбулу низкого уровня для, \halign
но пользователь пишет \multicolumn{2}{c}
, т. е c
. нет r
. Более того, если есть, 2
то пользователь хочет охватить два столбца, и макрос выдает \span
примитив (но это сейчас не важно). Макрос LaTeX \mutlirow
создает \vbox
, это означает, что если \multirow
это первый объект в элементе таблицы, то он не расширяется до, \omit
и преамбула обычно используется. Но вы написали \multispan
после \multirow
, т. е. внутри \vbox
. \multispan
Макрос расширяется до, \omit
но это недопустимое место для использования \omit
. Вы получаете ошибку.