В этом разделе мы приведем
В этом разделе мы приведем различные примеры верстки сложных таблиц с помощью LaTeX'а. По ходу дела будет рассказано и о некоторых изысканных возможностях окружений {tabular} и {array}, о которых до сих пор речи не было. Кое-где в этом разделе мы будем предполагать, что читатель знаком со средствами математического набора, описанными в лекции 2.
Наш первый пример — таблица французских притяжательных местоимений, взятая из русско-французского словаря акад. Л.В.Щербы (табл. 2),
(2) |
Рассмотрим теперь, как устроена вторая графа (начинающаяся с местоимения "мой"). Текст
образует в нашей таблице одну "запись" (часть таблицы, расположенную на пересечении графы и колонки).
Чтобы получить фигурную скобку требуемого (и неизвестного нам заранее) размера, мы воспользовались командами \left и \right, применяемыми при наборе формул . Так как эти команды вне формул использовать нельзя, нам пришлось оформить этот фрагмент текста как формулу. Между \left\{ и \right. стоит, как водится, та формула, по размеру которой получается фигурная скобка, заданная командой \left\{ — в нашем случае эта "формула" является фрагментом текста, задаваемым с помощью еще одного окружения {tabular} (с преамбулой l). Команды \\, завершающие первые три графы основной части таблицы, имеют необязательные аргументы, задающие дополнительные вертикальные пробелы после этих граф (иначе фигурные скобки будут упираться друг в друга и портить вид таблицы).
К местоимению "свой" в последней строке таблицы дана сноска. Знак сноски реализован нами опять же как математическая формула — верхний индекс 1 к "пустой формуле"; текст сноски реализован как графа таблицы, охватывающая все три колонки (с помощью команды \multicolumn. Команда \footnotesize задает размер шрифта, используемый в обычных сносках. Линия, отделяющая сноску от остальной части таблицы, реализована с помощью команды \cline. Наконец, посмотрим, как задана цифра 1 в самом тексте сноски. Вместо ожидаемого написано вот что:
$^1$\rule{0pt}{11pt}| Как объясняется в разд. 3.10, команда \rule задает в данном случае невидимый символ, занимающий по вертикали 11 пунктов и не занимающий места по горизонтали. Мы поставили этот невидимый символ в качестве подпорки: без нее горизонтальная черта соприкасалась бы с цифрой 1.
Вся таблица в целом набрана мелким шрифтом (иначе она не помещалась на страницу).
Следующий пример (табл. 3 ) — расписание работы одной химчистки.
(3) |
\begin{tabular}{lr@{--}l@{\qquad Обед\quad}r@{--}l} Понедельник & $8^{30}$ & 15 & 11 & 12 \\ Вторник & 12 & 19 & 15 & 16 \\ Среда & 10 & 17 & $12^{30}$ &$13^{15}$ \\ Четверг & 9 & 17 & 12 & 13 \\ Пятница & 11 & 16 & &\\ Суббота & 8 & 14 & 11 & 12\\ \end{tabular} В преамбуле тут используется конструкция, с которой мы пока не встречались.
Объясним, что она делает.
До сих пор мы говорили, что в преамбуле каждая колонка таблицы может обозначаться символом l, c, r или "p{...}" , а по краям или между колонками могут еще стоять вертикальные черточки \|, обозначающие разделительные вертикальные линейки. Это, однако, не вся правда. В качестве разделителя колонок (а также с краев) в преамбуле может быть использовано еще и так называемое "at-выражение"1): символ @, непосредственно после которого в фигурных скобках записан какой-то текст, возможно, с TeX'овскими командами. В таблице этот текст будет вставлен между соответствующими колонками во всех строках (если, разумеется, формат какой-то графы таблицы не был изменен командой \multicolumn). Мы использовали at-выражение трижды: два раза для вставки тире и один раз - для слова "Обед". А зачем же нам понадобились команды \qquad и \quad вокруг этого слова? Дело в том, что между колонками, разделенными at-выражением, не вставляется дополнительный интервал, которым LaTeX разделяет колонки в таблицах, созданных с помощью окружений {tabular} или {array}: именно поэтому тире между часом открытия химчистки и часом ее закрытия плотно прилегает к обоим числам. Слово "Обед", однако же, совсем не должно вплотную прилегать к началу обеденного перерыва, поэтому промежуток нужно создать самому, и проще это сделать один раз внутри все того же at-выражения, чем писать \quad для каждого рабочего дня.
Иногда at-выражение имеет смысл применять даже в виде @{}: между колонками при этом ничего не вставится, но зато дополнительный интервал между колонками, разделенными этим выражением, будет подавлен. Если написать @{} в преамбуле перед символом, обозначающим первую колонку, или после символа, обозначающего последнюю колонку, то будет подавлен дополнительный интервал, вставляемый перед первой или после последней колонки (это может помочь, если таблица немного не помещается на страницу по ширине).
Иногда интервал между колонками, автоматически устанавливаемый окружением {tabular} или {array}, является неудачным (ниже мы разберем соответствующий пример).
В этом случае можно самостоятельно установить для него подходящее значение. Для этого надо присвоить новое значение параметру \tabcolsep для окружения {tabular} или \arraycolsep для окружения {array} (см.выше по поводу параметров). По обе стороны от каждой колонки таблицы добавляется пробел размером \tabcolsep (соответственно \arraycolsep). Стало быть, значение этих параметров — половина расстояния между соседними колонками.
Наряду с расстоянием между колонками можно менять толщину линеек в линованных таблицах (обозначается \arrayrulewidth; относится этот параметр как к {array}, так и к {tabular}), а также расстояние между соседними линейками - это расстояние обозначается \doublerulesep, и оно также относится в равной мере к {array} и к {tabular}.
Теперь разберем обещанный пример, в котором приходится менять заданное по умолчанию расстояние между колонками. Посмотрите на такую формулу:
Она была создана с помощью следующих LaTeX'овских команд:
$$ \arraycolsep=0.05em \begin{array}{rrr@{\,}r|r} x^2&{}+2x&,{}-12&&\,x+5\\ \cline{5-5} x^2&{}+5x&&&\,x-3\\ \cline{1-2} &{}-3x&{}-12\\ &{}-3x&{}-15\\ \cline{2-3} &&3 \end{array} $$ Сразу же скажем, зачем нам понадобилось менять \arraycolsep: без этого интервалы между слагаемыми в каждой строке выходили непомерно большими. А теперь разберем исходный текст подробнее. Начнем с преамбулы rrr@{\,}r|r. В ней первые три колонки отведены под слагаемые, наподобие , или ; пятая колонка предназначена для делителя и частного ( и ), а вертикальная черточка в преамбуле перед буквой r, задающей пятую колонку — для вертикального отрезка, входящего в состав "уголка". С другой стороны, в четвертой колонке нет вообще никакого текста: между третьим и четвертым знаками & ни в одной строке ничего не написано. Эту пустую колонку мы создали для того, чтобы вертикальный отрезок не пошел ниже, чем нужно: без нее с преамбулой rrr|r вертикальный отрезок относился бы к четвертой колонке, и в результате третья строка закончилась бы вертикальным отрезком, что нам совсем ни к чему.
Осталось заметить, что пары долларов, ограничивающие выключную формулу, заодно ограничивают и группу, так что по окончании формулы закончится и группа, и старое значение \arraycolsep восстановится автоматически.
Наш последний пример использования окружения {tabular} связан с проблемой, с которой мы столкнулись на ранее: как ликвидировать разрыв в вертикальных линейках, получающийся, если в линованной таблице написать две команды \hline подряд? Первое, что приходит в голову, — создать еще одну графу в таблице, в которой поместить только невидимую линейку высотой, скажем, 2 пункта; казалось бы, тогда горизонтальные линейки будут на расстоянии 2 пункта друг от дружки, а вертикальные линейки не будут прерываться. Результат, однако, получается совершенно неудовлетворительный:
\begin{tabular}{|c|c|} \hline Северо-Запад & Северо-Восток\\ \hline \rule{0pt}{2pt}&\\ \hline Юго-Запад & Юго-Восток\\ \hline \end{tabular} Чтобы понять, в чем тут дело, нам придется обсудить, каким образом LaTeX собирает таблицу из отдельных строк.
Таблицы, созданные с помощью окружения {tabular} или {array}, собираются из строк, которые вплотную приставляются друг к другу. При этом, чтобы расстояния между строками были одинаковыми, в каждую строку предварительно вставляется невидимая линейка (именно, линейка, создаваемая командой \strut). Из-за этой линейки расстояние между горизонтальными отрезками оказалось слишком большим, а наша линейка высотой в 2 пункта LaTeX'у не помогла: ведь \strut все равно выше! Чтобы обойти эту трудность, в LaTeX'е предусмотрен способ отменить автоматическую постановку \strut'ов во всех строках таблицы. Именно, для этого надо написать (не внутри окружения {tabular} или {array}!) так:
\renewcommand{\arraystretch}{0} Что такое \renewcommand, мы будем обсуждать в лекции 7 , а пока давайте воспринимать этот рецепт догматически. Скажем только, что, во-первых, если эта команда была дана внутри группы, то по выходе из группы ее действие отменяется, и, во-вторых, в явном виде восстановление режима, когда в каждую строку таблицы вставляется \strut, достигается с помощью команды
\renewcommand{\arraystretch}{1} Теперь уже легко добиться желаемого эффекта; надо только не забыть поставить в нужные строки команду \strut в явном виде, коль скоро автоматически это теперь не делается. Итак, таблица
набирается следующим образом:
{\renewcommand{\arraystretch}{0}% \begin{tabular}{|c|c|} \hline \strut Северо-Запад & Северо-Восток\\ \hline \rule{0pt}{2pt}&\\ \hline \strut Юго-Запад & Юго-Восток\\ \hline \end{tabular}% } Знаки процента в конце некоторых строк мы поставили, чтобы концы этих строк не воспринимались как пробелы (на самом деле в данной ситуации вреда от пробелов не было бы). Закрывающая фигурная скобка в последней строке закрывает группу, из которой была дана команда \renewcommand.
Если граф в таблице много, то, возможно, вам не захочется много раз писать \strut. В этом случае можно включить эту команду в преамбулу с помощью at-выражения. Возможный вариант такой:
{\renewcommand{\arraystretch}{0}% \begin{tabular}{|@{\strut\hspace{\tabcolsep}}c|c|} \hline Северо-Запад & Северо-Восток\\ \hline \multicolumn{1}{|c|}{\rule{0pt}{2pt}}&\\ \hline Юго-Запад & Юго-Восток\\ \hline \end{tabular} } Если бы в аргументе at-выражения не был указан горизонтальный пробел размером \tabcolsep, то левая вертикальная линейка была бы напечатана вплотную к тексту (потому что at-выражение подавляет автоматически вставляемый горизонтальный пробел); заметим также, что теперь, когда \strut включен в at-выражение, нам пришлось воспользоваться командой \multicolumn, чтобы этот \strut не попал и в ту строку, где мы так старались от него избавиться.
Описанный способ набрать таблицу с удвоенной горизонтальной линейкой — не единственный. Если подключить описываемый в следующем разделе стилевой пакет hhline, то можно это сделать, и не играя с командой \arraystretch.
Можно не только отменять автоматическое добавление \strut'а в строки таблицы, но и изменять его высоту. Например, если мы хотим, чтобы размер этой линейки увеличился (во всех строках) в раза, можно написать:
\renewcommand{\arraystretch}{3.7} (вместо десятичной точки можно поставить и десятичную запятую).