Опубликован: 07.02.2007 | Доступ: свободный | Студентов: 4012 / 1340 | Оценка: 4.56 / 3.95 | Длительность: 23:09:00
Специальности: Художник
Лекция 6:

Печать текста с выравниванием

Пересечения линеек

Возможностей окружения {array} вполне хватает для печати простейших линованных таблиц, но в более сложных случаях возникают проблемы. Если подключить стилевой пакет {hhline}, работа с линованными таблицами облегчается.

Итак, предположим, что этот пакет подключен. Тогда для задания горизонтальных линеек становится доступной, наряду с уже известными \hline и \cline, новая команда \hhline, в аргументе которой описывается как сама линейка, так и ее пересечения с вертикальными линейками. Вот первый пример ее использования:

\begin{tabular}{|c|cc|c|}
\hline А & Б & В & Г\\
\hhline{|=|~~|-|}
Д & Е & Ж & З\\ \hline
\end{tabular}
\begin{tabular}{|c|cc|c|}
\hline А & Б & В & Г\\
\hhline{|=|~~|-|}
Д & Е & Ж & З\\ \hline
\end{tabular}

Аргумент команды \hhline устроен следующим образом. Во-первых, в нем сказано, что на территории первой колонки линейка должна быть двойной (символ =), на территории второй и третьей колонок линейки не должно быть вовсе (символ ~ - "тильда"), а на территории четвертой колонки линейка должна быть одинарной (символ -). Если в таблице n колонок, то в аргументе \hhline должны присутствовать n символов -, = или ~, имеющих тот же смысл, что и выше.

Между этими символами, описывающими поведение линейки внутри колонок, расположены символы, описывающие пересечения горизонтальной линейки с вертикальными. В нашем примере это были вертикальные черточки |; кроме них, для задания информации о пересечениях линеек можно использовать символы :, #, а также буквы t и b. Какие именно пересечения линеек можно получить с их помощью, видно из следующей таблицы:

\begin{center}
\begin{tabular}{@{}lcccccc@{}}
На печати & \TT & \TTa & \TTT, \TTTu, \TTTl & \XX &\XXa&\XXX,
\XXXu, \XXXl
\\
В аргументе \cs(hhline) & \ttfamily |- & \ttfamily -| & \ttfamily
-|- & \ttfamily |= & \ttfamily =| & \ttfamily =|=\\[4pt]
На печати & \YY & \YYa & \YYY, \YYYu, \YYYl & \LL & \LLa
& \LLL\\
В аргументе \cs(hhline) & \ttfamily := & \ttfamily =: & \ttfamily
=:=
      & \ttfamily ||- & \ttfamily -|| & \ttfamily -||- \\[4pt]
На печати & \ZZ & \ZZa & \ZZZ & \UU & \UUa
    & \UUU, \UUUu, \UUUl\\
В аргументе \cs(hhline) & \ttfamily |:= & \ttfamily =:| &\ttfamily
     =::= & \ttfamily \char`\#= & \ttfamily =\char`\# & \ttfamily
=\char`\#=\\[4pt]
На печати & \WW & \RR & \QQ & \PP & \ZZZu & \ZZZl \\
В аргументе \cs(hhline) & \ttfamily|t:= & \ttfamily |b:=
                & \ttfamily =:t| & \ttfamily =:b| & \ttfamily =:t:=
                & \ttfamily =:b:=
\end{tabular}
\end{center}

Вот пример таблицы, в которой используются эти возможности команды \hhline:

\begin{tabular}{||cc||cc||}
\hhline{|t:==:t:==:t|}
1 & 2 & 3 & 4\\
5 & 6 & 7 & 8\\
\hhline{#==::==||}
А & Б & В & Г\\
\hhline{||--||~~}
Д & Е & Ж & З\\
\hhline{|b:==:b:==:b|}
\end{tabular}
\begin{tabular}{||cc||cc||}
\hhline{|t:==:t:==:t|}
1 &2 &3 &4\\5 &6 &7 &8\\
\hhline{#==::==||}
А & Б & В & Г\\
\hhline{||--||~~}
Д & Е & Ж & З\\
\hhline{|b:==:b:==:b|}
\end{tabular}

Подчеркнем, что команда \hhline обрабатывает пересечения линеек независимо от того, какие вертикальные линейки заданы в преамбуле. Забота о том, чтобы аргумент \hhline был согласован с преамбулой, лежит на вас.

Таблицы, простирающиеся на несколько страниц

Как уже отмечалось, окружения {array} и {tabular} рассматриваются LaTeX'ом как одна большая буква, и потому не разбивается по страницам. Можно, однако, создавать таблицы, в которых и разбиение на страницы, и определение ширины колонок происходит автоматически. Для этого надо подключить стилевой пакет {longtable} и использовать окружение {longtable}. Как и окружение {tabular}, оно принимает один обязательный параметр — преамбулу (устроенную точно так же, как у {tabular} ); внутри окружения действуют в точности те же правила записи текста, что и в окружении {tabular} (в частности, допустимы команды \hline, \cline и \multicolumn ). Разница с окружением {array} в том, что получаемая при этом таблица может занимать несколько страниц и иметь произвольную длину.

Опишем теперь некоторые особенности окружения {longtable}, связанные с разбиением на страницы.

Во-первых, после первого запуска LaTeX'а колонки таблицы, определенной как {longtable}, могут оказаться невыровненными (это связано с тем, что при первом проходе LaTeX читает такую таблицу не целиком, а по кускам, и выравнивает эти куски независимо друг от друга). Чтобы добиться выравнивания, надо запустить LaTeX еще раз-другой (если есть необходимость в повторном запуске, об этом будет выдано предупреждение).

Во-вторых, вы имеете возможность сделать так, чтобы заголовок таблицы повторялся на каждой новой странице, на которой таблица продолжается. Для этого надо оформить заголовок в виде строки или группы строк (и/или команд \hline ), и при этом последнюю из этих строк надо завершить не командой \\, а командой \endhead. Обычно, впрочем, повторяющийся заголовок не идентичен тому, который ставят в самом начале таблицы. Отдельный заголовок для начала таблицы также оформляют в виде одной или нескольких строк, последняя из которых завершается командой \endfirsthead. Кроме того, можно предусмотреть специальную группу строк, которая будет ставиться на каждой странице внизу таблицы — для этого надо записать строку или группу строк, завершив последнюю из них не командой \\, как обычно, а командой \endfoot. Можно также предусмотреть отдельную группу строк, которая ставится внизу таблицы только на последней из занимаемых таблицей страниц. Для этого надо вместо \endfoot написать \endlastfoot. Группы строк, завершающиеся командами \endhead, \endfirsthead, \endfoot или \endlastfoot, должны стоять в начале окружения {longtable}. Вот пример использования этих средств:


Этой таблице соответствовал такой исходный текст:

\begin{longtable}{|l|l|l|l|}
\multicolumn{4}{c}{Итоги собачьей выставки}\\
\hline
Кличка & Пол & Порода & Оценка\\
\hline
1&2&3&4\\
\hline\endfirsthead
\hline
1 amp; 2 & 3 & 4\\
\hline\endhead
\hline
\multicolumn{4}{c}{\textit{Продолжение на следующей странице}}
\endfoot
\hline\endlastfoot
Алекс & кобель & миттельшнауцер & отл.\\
...
Эмир & кобель & эрдельтерьер & оч. хор.\\
\end{longtable}

В таблице, оформленной с помощью {longtable}, можно явно указать место разрыва страницы с помощью \newpage (а также \pagebreak в окружении {longtable} или \nopagebreak ). Эти команды должны следовать непосредственно после \\ (можно с новой строки).

При пользовании пакетом {longtable} предусмотрена возможность автоматической нумерации таблиц, созданных окружением {longtable}. Для этого используется та же команда \caption, в окружении {longtable} } что и в окружениях {table} или {picture}, но пользоваться ей надо чуть по-другому: после этой команды необходимо поставить \\, \endhead или \endfirsthead (или \endfoot, \ldots ).

При этом автоматически нумеруемые таблицы можно обычным образом метить с помощью \label (и потом ссылаться на эти места с помощью \ref ), но необходимо соблюдать два ограничения:

  • метку нельзя ставить в строки, которые появятся на печати более одного раза (благодаря повторению заголовков на других страницах);
  • с команды \label не должна начинаться ни одна графа таблицы.

На автоматически нумерующийся заголовок выделяется по умолчанию 4 дюйма. Чтобы изменить этот размер, надо присвоить соответствующее значение параметру \LTcapwidth.

В отличие от окружения {tabular}, таблица в окружении {longtable} не рассматривается как одна большая буква, а сразу располагается между абзацами, по умолчанию - по центру. Чтобы таблица была прижата к правому краю, надо указать у окружения {longtable} необязательный аргумент r (в квадратных скобках, между \begin{longtable} и преамбулой); необязательный аргумент l даст таблицу, прижатую влево.

Нина Казачек
Нина Казачек
Василий Майоров
Василий Майоров