LINUX.ORG.RU

LaTeX и многостраничная таблица

 ,


1

2

Всем доброго дня! Возникла задача спроектировать генератор отчетов на базе Latex. Отчет состоит из многостраничной таблицы, в колонках которой присутствуют объединенные строки, причем число объединенных строк может превышать число строк отображаемых на одной странице. И в связи с этим необходимо на новой странице, помимо заголовков колонок, дублировать текст с объединенных строк предыдущей страницы. Для формирования таблицы использую пакет longtable. Вот мой код:

\documentclass[10pt,a4paper]{report}
\usepackage{graphicx}
\usepackage[russian]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{multirow}
\usepackage{array}
\usepackage{pbox}
\usepackage{longtable}
\usepackage[left=2.00cm, right=1.00cm, top=2.00cm, bottom=2.00cm]{geometry}

\begin{document}
 \begin{longtable}[t]{|p{3.5cm}|c|c|c|c|}
   \caption{Таблица\label{simple}}\\ \hline
   \bf Колонка 1 & \bf Колонка 2 & \bf Колонка 3 & \bf Колонка 4 & \bf Колонка 5 \\ \hline 
   \endfirsthead		
   \caption[]{(Продолжение)} \\
   \hline
   \bf Колонка 1 & \bf Колонка 2 & \bf Колонка 3 & \bf Колонка 4 & \bf Колонка 5 \\ \hline
   \endhead
   \hline
   \multicolumn  {5}{|c|}{\bf Продолжение$\ldots$}\\ \hline 
   \endfoot
   \multicolumn {5}{|c|}{\bf Конец}\\ \hline
   \endlastfoot	

   % Начало Блока 1
   \multirow{6}*{\parbox[b][6em][t]{\textwidth}{Объединение строк}} 
   & текст & текст & текст & текст \\ \cline{2-5}
   & текст & текст & текст & текст \\ \cline{2-5}
   & текст & текст & текст & текст \\ \cline{2-5}
   & текст & текст & текст & текст \\ \cline{2-5}
   & текст & текст & текст & текст \\ \cline{2-5}
   & текст & текст & текст & текст \\ \hline
   % Конец блока 1	
	
   % ... Повторить блок 1 11 раз ... 			
		
 \end{longtable}
\end{document}

Вот картинка, как хочется сделать http://itmages.ru/image/view/3412454/b725a59f

Проблема в том, что никак не могу сообразить каким образом можно это реализовать. Гугление результатов не дало. Может кто подскажет куда копнуть? Прошу сильно не пинать, с LaTeX познакомился всего неделю назад.

IMHO придётся лезть в код longtable и не факт что что-то выйдет или городить команду с чем-то вроде, что если страница переведена, то добавить ещё один parbox (https://www.ctan.org/pkg/afterpage) — расставлять по месту разрывов вручную.

Я не встречал подобных специфичных задач и решений.

Evgueni ★★★★★ ()
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от Evgueni

Можно и по-другому сделать: вставлять то, что не должно разрываться, блоками. Т.е. внутрь longtable пихать таблицы.

В этом случае разрывы будут лишь там, где надо. Но по высоте — да, таблица будет занимать разный размер.

anonymous ()
Ответ на: комментарий от anonymous

Это тоже вариант. Наверное более правильный если хочется автоматизации.

Evgueni ★★★★★ ()
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от Evgueni

С \afterpage не получилось, вставляет только на следующую страницу после окончания таблицы. \pagebreak не подходит, потому что объединенная ячейка может содержать строки двух и более страниц, в примере я показал объединения всего из 6 строк. Evgueni, не подскажешь можно ли как-нибудь определять момент когда происходит переход на следующую страницу? Думаю наваять макрос и проверять сменилась ли страница.

Coxwain ()
Ответ на: комментарий от Coxwain

Проще пропатчить исходник longtable.sty, чтобы при разрыве нужный текст вставлялся.

anonymous ()
Ответ на: комментарий от Coxwain

Я не TeXник — я пользователь. Тут нужно с кодом разбираться. Ну и решение с запретом разрыва внутри такого рода объектов (запихать минитабличку в minipage) я думаю будет более правильным если нужна автоматизация.

Evgueni ★★★★★ ()
Последнее исправление: Evgueni (всего исправлений: 1)

Evgueni прав.

Проблема ваша не является в полной мере «проблемой». Дело в том, что такая бяка заложена в код и WYSIWYG-процессоров (Microsoft Word & LibreOffice Writer). Правило у них простое: если в таблице суммарное пространство между страницами поделено в некотором соотношении (20 к 80, или как у вас 15 к 85). То по правилам внутренней логики система будет перераспределять текст таким образом, чтобы у вас была «зацепка» строки, т.е. чтобы вы часть информации видели уже из небольшого блока таблицы, а ее «продолжение» как бы продолжается уже на следующей странице.

Так что тут только вариант колхозить, или перенести всю таблицу на новую страницу, и так делать с каждой таблицей (1 лиcт = 1 таблица).

PS. sudo cast Eddy_Em

bookman900 ★★★★★ ()
Последнее исправление: bookman900 (всего исправлений: 1)
Ответ на: комментарий от bookman900

sudo cast Eddy_Em

Я теперь только из-под анонимуса. И уже предлагал переделать исходники longtable как вариант решения.

anonymous ()
Ответ на: комментарий от Coxwain

Не дочитал сообщение до конца.

Если это «безобразие» тянется более страницы, то IMHO нужно разбивать таблицу на несколько таблиц и правую колонку выносить в заголовок, а список таблиц с указанием страниц выводить в начале документа. Таблицы по жизни — это гадость, так что не нужно делать их ещё более уродливыми, чем они могли бы быть.

Evgueni ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.