Перейти к содержимому
Topos Uranos

Краткое содержание

Этот урок распространяет удобочитаемую таблицу из предыдущего урока на случаи, с которыми простая сетка не справляется. В нём объясняется, как объединять ячейки по горизонтали с помощью \multicolumn, чтобы сгруппировать заголовки под частичной линейкой и чтобы изменить выравнивание одной ячейки, и выводится, куда уходит лишняя ширина группового заголовка; как объединять ячейки по вертикали с помощью \multirow и когда этого лучше избегать; сравниваются три способа дать таблице ширину строки (tabularx с его столбцом X, tabular* с \extracolsep и масштабирование с помощью \resizebox, которое не рекомендуется); набираются многостраничные таблицы с помощью longtable, с повторяющейся шапкой и нужными ей проходами; показывается поворот страницы для очень широких таблиц; таблицы порождаются из файла данных с помощью csvsimple и pgfplotstable, а сам файл создаётся окружением filecontents; в качестве современной альтернативы показывается tabularray; наконец, разбираются типичные ошибки по настоящим журналам.

Цели обучения

  1. Строить групповые заголовки с помощью \multicolumn и \cmidrule, подсчитывать ячейки каждой строки и предсказывать результат, когда счёт не сходится.
  2. Выбирать между \multirow и пустой ячейкой в традиции booktabs, обосновывая выбор удобством чтения.
  3. Подгонять таблицу под ширину строки с помощью tabularx или tabular* и объяснять, почему таблицу не масштабируют с помощью \resizebox.
  4. Набирать с помощью longtable многостраничную таблицу с собственными шапкой и концевиком, понимать её предупреждения и знать, почему её нельзя помещать внутрь плавающего объекта.
  5. Порождать таблицу из файла данных и объяснять, что даёт единственный источник данных.

Ячейки на несколько столбцов

Команда \multicolumn{n}{выравнивание}{текст} занимает место n соседних ячеек строки и заменяет их одной, с выравниванием, указанным во втором аргументе, который записывается так же, как в преамбуле таблицы (l, c, r, p{…}, а также @{}). Отсюда следует правило подсчёта, которое автор должен проверять в каждой строке: сумма простых ячеек и ширин, объявленных в каждом \multicolumn, должна быть не больше числа столбцов в преамбуле.

Изменение выравнивания одной ячейки

Самое скромное применение \multicolumn охватывает один столбец: \multicolumn{1}{c}{…} ничего не объединяет, но задаёт этой ячейке выравнивание, отличное от выравнивания её столбца. Так центрируют заголовок столбца чисел, выровненных по правому краю, или выравнивают по правому краю подпись итоговой строки, которая должна стоять рядом со своим числом.

ПримерСмета проекта
Код LaTeX
\documentclass{article}\usepackage{fontspec}\usepackage[russian]{babel}\babelfont{rm}{Noto Serif}\usepackage{booktabs}\begin{document}\begin{tabular}{llr}\topruleСтатья & Описание & \multicolumn{1}{c}{Сумма} \\\midruleПоездки   & Две поездки в архив       & 1\,200 \\Материалы & Бумага и внешние диски    &    300 \\Услуги    & Оцифровка фондов          &    850 \\\midrule\multicolumn{2}{r}{Итого} & 2\,350 \\\bottomrule\end{tabular}\end{document}
Результат
Результат

Заголовок «Сумма» центрирован над столбцом, который по-прежнему выровнен по правому краю, а подпись «Итого», охватывающая два первых столбца, выровнена по правому краю, рядом со своим числом.

Групповые заголовки

Когда несколько столбцов относятся к одной категории, таблица выигрывает от двухуровневого заголовка: сверху название группы, охватывающее её столбцы; под ним название каждого столбца. Между уровнями booktabs предлагает частичную линейку \cmidrule{2-3}, которая подчёркивает только столбцы со 2-го по 3-й; с опциями (lr), \cmidrule(lr){2-3}, линейка немного укорачивается слева и справа, так что две соседние линейки не соприкасаются и глаз видит две группы.

ПримерРезультаты исследования по группам
Код LaTeX
\documentclass{article}\usepackage{fontspec}\usepackage[russian]{babel}\babelfont{rm}{Noto Serif}\usepackage{booktabs}\begin{document}\begin{tabular}{lrrrr}\toprule& \multicolumn{2}{c}{Контрольная группа}& \multicolumn{2}{c}{Экспериментальная группа} \\\cmidrule(lr){2-3} \cmidrule(lr){4-5}Замер & Среднее & Ст. откл. & Среднее & Ст. откл. \\\midruleНачальный & 52,1 & 8,3 & 51,7 & 7,9 \\Итоговый  & 54,0 & 8,1 & 61,2 & 7,4 \\\bottomrule\end{tabular}\end{document}
Результат
Результат

В первой строке одна пустая ячейка (начальный &) и две ячейки по два столбца: один плюс два плюс два, пять, как в преамбуле. Обратите внимание, что столбец стандартного отклонения экспериментальной группы шире, чем у контрольной.

Куда уходит лишняя ширина

Разница в ширине в предыдущем примере не случайна. Если текст \multicolumn шире суммы охватываемых им столбцов, таблица должна расшириться, и движок отдаёт весь избыток последнему из этих столбцов; остальные сохраняют свою естественную ширину. «Экспериментальная группа» шире, чем «Среднее» и «Ст. откл.» вместе, и разницу получает второй из них. Если заголовок намного длиннее своих данных, эффект перестаёт быть незаметным.

ПримерСлишком длинный заголовок
Код LaTeX
\documentclass{article}\usepackage{fontspec}\usepackage[russian]{babel}\babelfont{rm}{Noto Serif}\usepackage{booktabs}\begin{document}\begin{tabular}{lrr}\toprule& \multicolumn{2}{c}{Экспериментальная группа после вмешательства} \\\cmidrule(lr){2-3}Замер & Среднее & Ст. откл. \\\midruleНачальный & 51,7 & 7,9 \\Итоговый  & 61,2 & 7,4 \\\bottomrule\end{tabular}\end{document}
Результат
Результат

Среднее значение оказывается далеко от своего отклонения, их разделяет пробел, который ничего не означает. Исправление здесь не типографское, а редакторское: короткий заголовок («Экспериментальная») и пояснение в подписи к таблице или в тексте.