Набор таблиц в LaTeX,
как уже говорилось,
дело не простое, а набор сколько-нибудь продвинутых таблиц - скажем
так, удовольствие ниже среднего. Тем не менее, ЛаТеХ позволяет тонко
настраивать вид таблицы и добиваться, хотя и ценой некоторых умственных
усилий, весьма навороченных результатов.
Немного накопленных трюков и кульбитов описаны в этом посте.
Этот пост является продолжением
эпической серии о наборе диплома в латехе и конкретно темы
набора таблиц.
Чтобы не перегружать старый пост ещё больше, найденные трюки по работе с
таблицами вынесены в новый пост, а старый - изрядно переработан.
Объединение строк и столбцов в таблицах LaTeX
Создание
навороченных таблиц часто требует объединять столбцы и строки, особенно при группировке сходных данных. Для этого можно использовать команды
\multicolumn и
\multirow, а так же некоторые другие трюки, о которых ниже.
Напомню, что
\multicolumn{2}{|c|}{Результаты
измерений} означает, что мы объединяем 2 (два) столбца в таблице,
получившаяся ячейка будет центрирована и нарисованы вертикальные линии.
Таблицы с объединением столбцов в LaTeX
Для того, чтобы несколько столбцов объединить в одну, можно воспользоваться командами
\cline, \raisebox и
\multicolumn одновременно. Здесь
\multicolumn служит для объединения двух колонок в одну,
\cline прочерчивает линию в строках, а \raisebox поднимает текст к середине объединённой строки.
Вот код таблицы:
\begin{table}[H]
\caption{\label{tab:bolts} Нестандартные болты для левой резьбы.}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
& \multicolumn{2}{c|}{Диаметр} \\
\cline{2-3}
\raisebox{1.5ex}[0cm][0cm]{Нестандартные болты}
& Норма & Разброс \\
\hline
Размеры & 10 мм & 1 мм \\
\hline
\end{tabular}
\end{center}
\end{table}
В документе это будет выглядеть так (обратите внимание на первую колонку):
Для этой таблицы использован трюк с
\multicolumn для объединения двух ячеек в одну,
\cline{2-3} для прочерчивания горизонтальной линии в таблице от второй колонки до третьей, и \raisebox для вставки надписи
Нестандартные болты.
Таблицы с объединением строк в LaTeX
Если нужна таблица, в которой несколько строк объединены, можно использовать пакет
multirow, добавив
\usepackage{multirow} в преамбулу документа. Это позволит создать строки, простирающиеся на несколько колонок командой:
\multirow{объединить Х строк}{ширина}{содержимое}
Предыдущий пример можно переиначить вот так:
\begin{table}[H]
\caption{\label{tab:bolts} Нестандартные болты для левой резьбы.}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\multirow{3}{*}{Размеры нестандартных болтов} & \multicolumn{2}{c|}{Диаметр} \\
\cline{2-3}
& Норма & Разброс \\
\cline{2-3}
& 10 мм & 1 мм \\
\hline
\end{tabular}
\end{center}
\end{table}
В документе такая таблица будет выглядеть так:
Объединение строк и столбцов вместе плюс использование hhline
Пример с texexchange, который мне нравится, иллюстрирует применение описанных выше команд:
\begin{table}[ph]
\centering
\begin{tabular}{c|c|c|c|c}
\hline
\multirow{2}{*}{Raaa (k)} & \multicolumn{4}{c}{C ()} \\
\hhline{~----}
& 3.3 & 2.5 & 1 & 0.5 \\
\hline
\multirow{2}{*}{Raaa (k)} & \multicolumn{2}{c|}{\multirow{2}{*}{this}} & 0.5 & 0.6\\
\hhline{~~~--} & \multicolumn{2}{c|}{} & 0.7 & 1.2 \\
\hline
\end{tabular}
\caption{R, C ripple size}
\label{T:peak}
\end{table}
В документе выглядит так:
Здесь нужно отметить применение команды
\hhline из одноимённого пакета
hhline, которая рисует линии в таблицах, подобно обычной
\hline. Особенность
\hhline в том, что можно прочерчивать невидимые линии (~) и обычные (-) вот так:
\hhline{~----}
В данном случае будет нарисовано пять линий в таблице, первая будет пустая. В общем это аналог
\cline{2-5}, только более удобный.
Надеюсь, что с такими таблицами вы будете встречаться так же редко, как и с такими экзотическими болтами.
Раскраска ячеек таблиц в LaTeX
Кто сказал, что таблицы в LaTeX унылы и безжизненны? Хотя часто раскраска таблицы не одобряется, иногда,
особенно в презентациях, выделение ячеек таблицы цветом помогает быстрее понять материал.
Для раскраски ячеек нам понадобятся пакеты
\usepackage{color,colortbl}
и в преамбуле определяем цвета, которые нам нужны:
\definecolor{darkishgreen}{RGB}{39,203,22}
\definecolor{LightCyan}{rgb}{0.88,1,1}
\definecolor{Gray}{gray}{0.9}
\definecolor{lightRed}{RGB}{230,170,150}
\definecolor{modRed}{RGB}{230,82,90}
\definecolor{strongRed}{RGB}{230,6,6}
Теперь нужно сделать отдельный тип цветных колонок для таблицы. Для
этого в документе, уже после
\begin{
document}, создаём новые команды в
виде:
\newcolumntype{g}{>{\columncolor{Gray}}c}
и
\newcolumntype{d}{>{\columncolor{darkishgreen}}c}
Это позволит нам раскрашивать колонки. Для раскраски строк воспользуемся командой
\rowcolor{цвет} из пакета
colortbl. Можно раскрасить отдельно ячейку с помощью команды
\cellcolor{Gray} которую помещаем в раскрашиваемую ячейку.
А теперь всё вместе:
\newcolumntype{g}{>{\columncolor{Gray}}c}
\newcolumntype{d}{>{\columncolor{darkishgreen}}c}
\begin{tabular}{|c||c||g||d|d|d|}
\hline
Signal & \cellcolor{Gray} Device & \multicolumn{4}{|c|}{Computation time, s}\\
\cline{3-6}
Strength & \cellcolor{Gray} size &Dantzig- &Branch and & Active &Projected\\
& &Wolfe &Bound &Set &Gradients\\
\rowcolor{lightRed}
\hline
Weak & 7x7 &400 &230 &200 &58\\ \cline{3-6}
\rowcolor{lightRed}
(0\% constr.) & 10x10 &1000 &840 &500 &135 \\ \cline{3-6}
\hline
\rowcolor{modRed}
Moderate & 7x7 &640 &380 &270 &54\\ \cline{3-6}
\rowcolor{modRed}
(5\% constr.) & 10x10 &3120 &1200 &700 &110 \\ \cline{3-6}
\hline
\rowcolor{strongRed}
Strong & 7x7 &1400 &290 &350 &55\\ \cline{3-6}
\rowcolor{strongRed}
(20\% constr.) & 10x10 &15320 &810 &960 &120 \\ \cline{3-6}
\hline \hline
\end{tabular}
В документе такая таблица выглядит вот так:
Здесь ещё можно отметить использование || в качестве двойного разделителя колонок.
Изменение размеров строк и столбцов в ЛаТеХ таблице
Переменная
\arraystretch отвечает за расстояние между строками а
переменная
\tabcolsep соответственно за расстояние между столбцами.
В примере ниже мы сделаем столбцы и строки пошире:
\renewcommand{\arraystretch}{1.8} %% increase table row spacing
\renewcommand{\tabcolsep}{1cm} %% increase table column spacing
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
Расширение краёв: & \textbf{1,0-1,4} & размер ФРТ \\
\hline
Аподизация: & \textbf{0,25-0,30} & размер ФРТ \\
\hline
Сглаживания краёв: & \textbf{0,25-0,50}& размер ФРТ \\
\hline
\end{tabular}
\end{center}
В документе это будет выглядеть так:
Изменение высоты одной строки в таблице
Иногда требуется сделать одну из строк в таблице побольше, не задевая все остальные. Здесь поможет трюк с
командой rule: команда вставит невидимую горизонтальную линию заданной ширины и толщины:
\rule[высота подъёма линейки]{ширина}{толщина}
Это не единственный манёвр, который позволяет увеличить расстояние
между строками: можно в конце строки, после
\\ вставить
[1cm], увеличив
размер строки соответственно.
В данном примере мы расширим первую строку в таблице с помощью
\rule{0cm}{2cm} и вторую с помощью [1cm] следующим образом:
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\rule{0cm}{2cm}
Расширение краёв: & \textbf{1,0-1,4} & размер ФРТ \\
\hline
Аподизация: & \textbf{0,25-0,30} & размер ФРТ \\ [1cm]
\hline
Сглаживания краёв: & \textbf{0,25-0,50}& размер ФРТ \\
\hline
\end{tabular}
\end{center}
Так выглядит таблица в документе:
Ещё немного о трюках с таблицами можно почерпнуть
там.
Книжные таблицы в LaTeX: booktabs
По умолчанию таблицы, набранные в латехе, смотрятся неплохо, хотя им
недостаёт "книжного" вида. Например, первая и последняя линия в таблице
обычно жирнее, чтобы показать начало и конец таблицы.
Если вам хочется набирать
таблицы "как у больших дядь в книжках", можно воспользоваться пакетом
booktabs. Подключив в преамбуле документа
\usepackage{booktabs} мы сразу же имеем возможность набирать красивые таблицы.
"Большие дяди" стараются сделать таблицы проще, с комфортным для глаз
расстояниями между строками, и почти никогда не используют вертикальные
разделители.
Вот код для такой таблицы:
\begin{tabular}{llr}
\toprule %%% верхняя линейка
\multicolumn{2}{c}{Постобработка} \
\cmidrule(r){1-2}
Вид & Описание & Время выполнения, сек. \
\midrule %%% тонкий разделитель
Расширение краёв & холодный старт & 12 \
& горячий старт & 8 \
Аподизация & симметричная & 90 \
Сглаживания краёв & по Гауссу & 33 \
\bottomrule %%% верхняя линейка
\end{tabular}
Вот как выглядит такая таблица:
Когда столбцов в таблице слишком много...
Чтобы проще было задавать число колонок таблицы, особенно если их
много, можно использовать конструкцию вида
\begin{
tabular}{l*{
X}{l}},
где
X это число колонок.
Вот пример такой таблицы с
10 колонками:
\begin{tabular}{l*{10}{l}}
\hline
Расширение краёв: & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
Аподизация: & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
Сглаживания краёв: & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 \\
\hline
\end{tabular}
А вот как она выглядит в готовом документе:
Стоит отметить
пакет siunitx, который предоставляет возможность выравнивания по десятичной точке или запятой. Также можно посмотреть на
пакет array, предоставляющий расширенные версии окружений tabular и array (например, вертикально центрированные колонки и возможность определять новые типы колонок).
Ссылки
Эти трюки позволят создать весьма навороченные таблицы без необходимости перечитывать томик квантовой физики.
Конечно, есть ещё много пакетов по работе с таблицами, например
ltxtable - это longtable и tabularx, который стоит использовать для
создания больших и сложных таблиц с разделением по страницам, с кучей
текста в ячейках. Многостраничные таблицы так же может создавать пакет
supertab.
Cтоит упомянуть
пакет
slashbox, который позволяет создавать
ячейки, разделенные по диагонали.
Стоит ещё отметить
хороший туториал по таблицам, который включает
\multirow и
\multicol. Поборники русского стиля оформления таблиц могут заинтересоваться
постом по ссылке.