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

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

До сих пор мы говорили, что в преамбуле каждая колонка таблицы может обозначаться символом l, c, r или "p{...}" , а по краям или между колонками могут еще стоять вертикальные черточки \|, обозначающие разделительные вертикальные линейки. Это, однако, не вся правда. В качестве разделителя колонок (а также с краев) в преамбуле может быть использовано еще и так называемое "at- выражение"1Мы выбрали для него такое название, поскольку официально символ @ называется " коммерческое at"; неофициально этот символ называют самыми разными именами, от "собаки" до "блямбы".: символ @, непосредственно после которого в фигурных скобках записан какой-то текст, возможно, с 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}.

Теперь разберем обещанный пример, в котором приходится менять заданное по умолчанию расстояние между колонками. Посмотрите на такую формулу:

\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}

Она была создана с помощью следующих 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. В ней первые три колонки отведены под слагаемые, наподобие x^2, {}+2x или {}-12 ; пятая колонка предназначена для делителя и частного ( x+5 и x-3 ), а вертикальная черточка в преамбуле перед буквой r, задающей пятую колонку — для вертикального отрезка, входящего в состав "уголка". С другой стороны, в четвертой колонке нет вообще никакого текста: между третьим и четвертым знаками & ни в одной строке ничего не написано. Эту пустую колонку мы создали для того, чтобы вертикальный отрезок не пошел ниже, чем нужно: без нее с преамбулой rrr|r вертикальный отрезок относился бы к четвертой колонке, и в результате третья строка закончилась бы вертикальным отрезком, что нам совсем ни к чему.

Осталось заметить, что пары долларов, ограничивающие выключную формулу, заодно ограничивают и группу, так что по окончании формулы закончится и группа, и старое значение \arraycolsep восстановится автоматически.

Наш последний пример использования окружения {tabular} связан с проблемой, с которой мы столкнулись на ранее: как ликвидировать разрыв в вертикальных линейках, получающийся, если в линованной таблице написать две команды \hline подряд? Первое, что приходит в голову, — создать еще одну графу в таблице, в которой поместить только невидимую линейку высотой, скажем, 2 пункта; казалось бы, тогда горизонтальные линейки будут на расстоянии 2 пункта друг от дружки, а вертикальные линейки не будут прерываться. Результат, однако, получается совершенно неудовлетворительный:

\begin{tabular}{|c|c|}
\hline
Северо-Запад & Северо-Восток\\
\hline \rule{0pt}{2pt}&\\
\hline
Юго-Запад & Юго-Восток\\
\hline
\end{tabular}
\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, мы будем обсуждать в "Создание новых команд" , а пока давайте воспринимать этот рецепт догматически. Скажем только, что, во-первых, если эта команда была дана внутри группы, то по выходе из группы ее действие отменяется, и, во-вторых, в явном виде восстановление режима, когда в каждую строку таблицы вставляется \strut, достигается с помощью команды

\renewcommand{\arraystretch}{1}

Теперь уже легко добиться желаемого эффекта; надо только не забыть поставить в нужные строки команду \strut в явном виде, коль скоро автоматически это теперь не делается. Итак, таблица

{\renewcommand{\arraystretch}{0}%
\begin{tabular}{|c|c|}
\hline \strut Северо-Запад & Северо-Восток\\
\hline \rule{0pt}{2pt}&\\
\hline \strut Юго-Запад & Юго-Восток\\
\hline
\end{tabular}%
}

набирается следующим образом:

{\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 'а в строки таблицы, но и изменять его высоту. Например, если мы хотим, чтобы размер этой линейки увеличился (во всех строках) в 3.7 раза, можно написать:

\renewcommand{\arraystretch}{3.7}

(вместо десятичной точки можно поставить и десятичную запятую).

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