Неправильное отображение multirow
В таблице понадобилась ячейка, которая объединяет несколько строк в одном столбце, за это отвечает пакет multirow, и вроде синтаксис простой, но я не могу добиться нормального отображения текста. Текст выезжает за ячейку - либо по вертикали, либо по горизонтали.
Сначала я думал, что у пакета несовместимость с xltabular, но похожее поведение наблюдается и в longtable и в обычном tabular (у которых в документации multirow, вроде как заявлена совместимость).
Минимальный код:
\documentclass[fontsize=14bp,a4paper,numbers=noenddot]{scrreprt}
% Подключение пакетов
\usepackage{polyglossia} %для русского языка
\usepackage{cmap} % поиск в PDF
\usepackage[left=25mm, right=15mm, top=20mm, bottom=20mm, footskip=10mm]{geometry} %задаёт поля документа
\usepackage{amsmath} %пакет мат. формул
\usepackage{ulem} %пакет для подчёркиваний
\usepackage{graphicx} %пакет для вставки рисунков
\usepackage{float} %плавающие объекты
\usepackage{caption} %заголовки плавающих объектов
\usepackage{longtable} %таблицы на несколько листов
\usepackage{xltabular}
\usepackage{array} %для таблиц
\usepackage{multirow} %объединение строк
% Установка параметров для документа
\setdefaultlanguage[forceheadingpunctuation=false]{russian} % устанавливает главный язык документа, опция - убирает последнюю точку в нумерации заголовков
\setotherlanguage{english} %% объявляет второй язык документа
\pagestyle{plain} %номера страниц будут печататься снизу и при этом колонтитулов не будет
\setmainfont{Liberation Serif}
\setsansfont{Liberation Sans}
\setmonofont{Liberation Mono}
\frenchspacing %после знаков препинания пробелы не увеличиваются (по умолчанию эти пробелы увеличиваются в соответствии с англо-саксонской традицией)
% Команды для документа
%===================================================
\newcommand{\eng}[1]{\textlang{english}{\textit{#1}}} %весь английский язык - курсивом
%нумерация вложенных списков
\renewcommand{\labelenumi}{\arabic{enumi})}
\renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii})}
%переопределение символа списков
\renewcommand\labelitemi{--}
\begin{document}
\begin{xltabular}{\linewidth}{|>{\centering\arraybackslash\hspace{0pt}}p{0.15\linewidth}|>{\centering\arraybackslash}p{0.07\linewidth}|>{\centering\arraybackslash}X|>{\centering\arraybackslash}X|>{\centering\arraybackslash}X|}
\caption{Размещение объектов \label{Object-location-rules}} \\
\hline
\textbf{Объект} & \textbf{Поле} & \textbf{Допустимое кол-во объектов в одной клетке} & \textbf{Минимальное расстояние между клетками с объектом (кол-во клеток)} & \textbf{Максимальное кол-во объектов на поле} \\ \hline
\endfirsthead
\multicolumn{5}{r}{Продолжение таблицы \thetable} \\
\hline
\textbf{Объект} & \textbf{Поле} & \textbf{Допустимое кол-во объектов в одной клетке} & \textbf{Минимальное расстояние между клетками с объектом (кол-во клеток)} & \textbf{Максимальное кол-во объектов на поле} \\ \hline
\endhead
\multicolumn{5}{r}{Продолжение таблицы на следующей странице}
\endfoot
\hline
\endlastfoot
\multirow{2}{\linewidth}{Банановая пальма, кокосовая пальма, финиковая пальма}
& \eng{D} & 1 & 0 & 96 \\
\cline{2-5}
& \eng{O} & 3 & 0 & 48 \\
\hline
Нефть & \eng{D} ИЛИ \eng{O} & 1 & - & 1 \\
\end{xltabular}
\begin{longtable}{|>{\centering\arraybackslash\hspace{0pt}}p{0.15\linewidth}|>{\centering\arraybackslash}p{0.07\linewidth}|>{\centering\arraybackslash}p{0.26\linewidth}|>{\centering\arraybackslash}p{0.26\linewidth}|>{\centering\arraybackslash}p{0.26\linewidth}|}
\caption{Размещение объектов \label{Object-location-rules2}} \\
\hline
\textbf{Объект} & \textbf{Поле} & \textbf{Допустимое кол-во объектов в одной клетке} & \textbf{Минимальное расстояние между клетками с объектом (кол-во клеток)} & \textbf{Максимальное кол-во объектов на поле} \\ \hline
\endfirsthead
\multicolumn{5}{r}{Продолжение таблицы \thetable} \\
\hline
\textbf{Объект} & \textbf{Поле} & \textbf{Допустимое кол-во объектов в одной клетке} & \textbf{Минимальное расстояние между клетками с объектом (кол-во клеток)} & \textbf{Максимальное кол-во объектов на поле} \\ \hline
\endhead
\multicolumn{5}{r}{Продолжение таблицы на следующей странице}
\endfoot
\hline
\endlastfoot
\multirow{2}{*}{Банановая пальма, кокосовая пальма, финиковая пальма}
& \eng{D} & 1 & 0 & 96 \\
\cline{2-5}
& \eng{O} & 3 & 0 & 48 \\
\hline
Нефть & \eng{D} ИЛИ \eng{O} & 1 & - & 1 \\
\end{longtable}
\noindent
\begin{tabular}{|>{\centering\arraybackslash\hspace{0pt}}p{0.15\linewidth}|>{\centering\arraybackslash}p{0.07\linewidth}|>{\centering\arraybackslash}p{0.26\linewidth}|>{\centering\arraybackslash}p{0.26\linewidth}|>{\centering\arraybackslash}p{0.26\linewidth}|}
\hline
\multirow{2}{\textwidth}{Банановая пальма, кокосовая пальма, финиковая пальма}
& \eng{D} & 1 & 0 & 96 \\
\cline{2-5}
& \eng{O} & 3 & 0 & 48 \\
\hline
Нефть & \eng{D} ИЛИ \eng{O} & 1 & - & 1 \\
\end{tabular}
\end{document}
Результат отображения следующий:

Не могу понять, в чём проблема. То ли пакет с чем-то не совместим, то ли я где-то невнимательно ознакомился с документацией...
Дистрибутив: TeXLive
Компилятор: XeLaTeX
P.S. Знаю, что можно отказаться от multirow в пользу команды cline, но страдает равномерное распределение текста по ячейке. Да и просто хочется сделать красиво =)
Ответы (1 шт):
Я на всякий случай напишу, что я тоже могу поведение команды \multirow понимать не совсем верно :-), но... Скорее всего, Вы невнимательно ознакомились с документацией. Вы хотите от команды \multirow чего-то, что ей не свойственно - если я правильно понимаю, Вы хотите, чтобы она Вам автоматически увеличивала высоту строк. А она занимается тем, что просто накладывается на нижние или верхние строки, она их не заменяет и не раздвигает. Если в этих ячейках окажется текст, то она просто нарисует свой текст поверху. Заботиться о том, чтобы "захваченных" строк хватало должны Вы сами. (В пользу этого объяснения могу еще сказать, что latex не может знать, высоту какой из строк он должен для Вас увеличить.)
Правда, пакет multirow даёт в помощь кое-какие средства, чтобы Вам было удобнее бороться с высотой строк. Но об этом чуть ниже.
Теперь немного про ошибки. (Кстати, у меня почему-то Ваш пример отказался добровольно компилироваться (TeXLive 2021, MS Win10), поэтому я повыбрасывал кучу лишнего, чтобы получить работающий пример.) По горизонтали текст вылезает за границы именно потому, что Вы его сами попросили так делать: в двух случаях задали размер ширины ячейки на длину строки (\multirow{2}{\linewidth}{...} и \multirow{2}{\textwidth}{...}), а в одном случае перевели ячейку из типа парбокса (p{}) в однострочный вариант (с типом столбцов l,c или r): \multirow{2}{*}{...} - об этом поведении спецификатора * сказано в документации. Ну а в оставшемся варианте, как я уже писал, latex все сделал правильно, это просто Вы его не поняли.
Таким образом, Вам осталось только вручную увеличить высоту тех двух строк, на которые наезжает \multirow. Если делать это через команду \\[30pt],то получится вариант, когда содержимое строк будет по вертикали располагаться ближе к верху ячеек и смотрится это не очень хорошо. И чтобы хоть как-то сохранить презентабельность таких строк (которым приходится соседствовать с многострочными ячейками) автор пакета multirow сделал еще один пакет: bigstrut. Он позволяет увеличивать высоты таких строк на заданную величину (задается командой типа: \setlength{\bigstrutjot}{20pt}). Но это как бы решает проблему внешнего вида только для тех строк, которые перекрываются ячейками с \multirow. Но у Вас еще есть строки (там где про нефть) - там выравнивание будет по верху ячеек.. и как правильнее оформить такой вариант я не могу сказать. Возможно, для такой строки тоже нужно использовать \multirow и добавить строк.
В общем, я немного порезал исходный пример, оставил только longtable (просто так получилось :-) ), изменил размеры таблицы и получилось примерно так:
\documentclass[fontsize=14bp,a4paper]{scrreprt}
% Подключение пакетов
\usepackage[utf8]{inputenc} % Кодировка исходного текста
\usepackage{polyglossia} %для русского языка
\usepackage[T2A]{fontenc} %внутренняя кодировка
\usepackage[left=25mm, right=15mm, top=20mm, bottom=20mm, footskip=10mm]{geometry} %задаёт поля документа
\usepackage{tabularx}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{bigstrut}
\setdefaultlanguage{russian}
\setotherlanguage{english} %% объявляет второй язык документа
\setmainfont{Arial}
% Команды для документа
%===================================================
\newcommand{\eng}[1]{\textlang{english}{\textit{#1}}} %весь английский язык - курсивом
\newcolumntype{P}[1]{>{\centering\arraybackslash}p{#1}}
\begin{document}
\setlength{\extrarowheight}{4pt} % это чтобы верхняя часть строки не "прилипала" к горизонтальным линиям
\setlength{\bigstrutjot}{20pt}
\begin{longtable}{|P{0.15\textwidth}|P{0.07\textwidth}|P{0.24\textwidth}|P{0.24\textwidth}|P{0.24\textwidth}|}
\caption{Размещение объектов \label{Object-location-rules2}} \\
\hline
\textbf{Объект} & \textbf{Поле} & \textbf{Допустимое кол-во объектов в одной клетке} & \textbf{Минимальное расстояние между клетками с объектом (кол-во клеток)} & \textbf{Максимальное кол-во объектов на поле} \\ \hline
\endfirsthead
\multicolumn{5}{r}{Продолжение таблицы \thetable} \\
\hline
\textbf{Объект} & \textbf{Поле} & \textbf{Допустимое кол-во объектов в одной клетке} & \textbf{Минимальное расстояние между клетками с объектом (кол-во клеток)} & \textbf{Максимальное кол-во объектов на поле} \\ \hline
\endhead
\multicolumn{5}{r}{Продолжение таблицы на следующей странице}
\endfoot
\hline
\endlastfoot
\multirow{2}[t2]{0.15\textwidth}[-7pt]{Банановая пальма, кокосовая пальма, финиковая пальма}
& \eng{D} \bigstrut & 1 & 0 & 96 \\
\cline{2-5}
& \eng{O} \bigstrut & 3 & 0 & 48 \\
\hline
& \multirow{3}{0.07\textwidth}{\centering \eng{D} ИЛИ \eng{O}} & & & \\
Нефть & & 1 & - & 1 \\
& & & &
\end{longtable}
\end{document}
Из мелочей, еще я объявил новый тип столбцов P, чтобы не загромождать и без того сложный заголовок таблицы.
Вообще, оформление таблиц в техе (и всех его наследниках), особенно с такими командами как multirow очень сложная тема, которая требует много ручной подгонки.
Ну и на всякий случай оставлю источники:
- Официальный мануал по Multirow - здесь стоит обратить внимание на страницы: 6-8,10,11-17. На стр. 15 прямо Ваш случай.
- LaTeX Table Hints and Tips - здесь интересны по теме страницы 10, 11. Хотя можно и всю статью прочитать, она весьма интересная.
