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

Блоки и клей

Аннотация: Изучив эту лекцию, Вы узнаете, как выглядит текст с точки зрения LaTeX'а, что представляют собой буквы и строки. Познакомитесь с новыми понятиями: блоками и клеем.

Текст состоит из блоков

Мы уже отмечали, что в процессе набора TeX не принимает во внимание, как буквы будут выглядеть на печати, а лишь учитывает, сколько места надо отвести на каждый символ. Давайте обсудим этот процесс подробнее.

С точки зрения TeX'а, каждая буква представляет собой блок (английский термин: box), т.е. прямоугольник с выделенной точкой отсчета ; горизонтальная прямая, проходящая через точку отсчета, называется базисной линией (английский термин: baseline). Блок характеризуется тремя размерами: шириной, высотой и глубиной. См. рисунок, на котором также изображен блок, соответствующий букве у.


Когда из букв составляются слова (а из слов — строки), блоки, соответствующие отдельным буквам, ставятся рядом так, чтобы их базисные линии были продолжением друг друга. Каждая строка также становится блоком, точка отсчета которого совпадает с точкой отсчета первого из составляющих ее блоков:


Страницы - это тоже блоки, составленные из блоков, соответствующих строкам. Эти блоки ставятся таким образом, чтобы точки отсчета были одна над другой, после чего в качестве точки отсчета и базисной линии полученного блока берутся точка отсчета и базисная линия последнего из добавляемых блоков:


В приведенных выше примерах мы сталкивались с блоками, которые TeX создает автоматически; в настоящей лекции пойдет речь о командах, предназначенных для создания блоков вручную. Сначала мы расскажем, какие средства для этого предоставляет нам LaTeX, а затем рассмотрим некоторые TeX'овские команды, дающие дополнительные возможности.

Команды LaTeX'а для генерации блоков

Блоки из строки

С одной командой для генерации блоков мы уже знакомы: это команда \mbox. Эта команда создает блок из текста, набираемого в одну строку. Полученный блок рассматривается TeX'ом как одна буква:

Проказница мартышка,
\mbox{осел, козел} и
косолапый мишка\ldots
Проказница мартышка,
\mbox{осел, козел} и
косолапый мишка\ldots

В этом примере TeX никогда не разорвет строку между словами "осел" и "козел" и никогда не сделает переносов в этих словах: при верстке абзаца TeX имеет дело не с этими словами по отдельности, а только с блоком, в который входят они оба вместе с пробелом между ними. По той же причине TeX не сможет растянуть или сжать пробел между словами "осел" и "козел" для выравнивания строк в абзаце.

Теперь, когда мы знаем, что такое TeX'овские блоки, можно признаться, что окружения {picture},{tabular} и {array} тоже генерируют блоки, и именно поэтому создаваемый ими текст воспринимается TeX'ом как одна большая буква.

В аргументе команды \mbox может присутствовать все то же, что может быть в обычном тексте в пределах одной строки: математические формулы, команды смены шрифта или присваивания значений каким-то параметрам, команды для генерации блоков (например, тот же \mbox, или даже окружения {picture} или {array} ) и т.д. Запрещены в аргументе команды \mbox пустые строки или команды \par, выключные математические формулы, окружения, определяющие абзацы специального вида (скажем, {itemize} или {center}), команда \\ и тому подобные вещи, "не вписывающиеся в строку". Если в аргументе команды \mbox происходит смена шрифта, изменение каких-то параметров или определение команд, то по выходе из блока все эти изменения забываются, поскольку фигурные скобки, ограничивающие аргумент команды \mbox, ограничивают также и группу (" глобальные" команды вроде \setcounter сохраняют свое действие и по выходе из блока).

Блок, создаваемый командой \mbox, имеет ширину, равную " естественной" длине строки текста, являющегося его аргументом. Можно также создать блок из строки текста, ширина которого отлична от ее естественной длины. Для этого используется команда \makebox. Эта команда имеет один обязательный аргумент, имеющий такой же смысл, как аргумент команды \mbox, и, кроме того, необязательный аргумент — ширину блока, порождаемого командой:

Туда \makebox[5em]{и} обратно
.
Туда \makebox[5em]{и} обратно.

Как видите, необязательный аргумент ставится перед обязательным; длина в нем может быть указана, как обычно, либо в какой-либо из TeX'овских единиц, либо как параметр со значением длины, возможно — с числовым коэффициентом. Сам текст, являющийся обязательным аргументом команды \makebox, размещается по центру в блоке ширины, указанной в необязательном аргументе. Если указать в необязательном аргументе команды \makebox ширину, меньшую естественной длины строки, то текст выйдет за края блока; поскольку место, отводимое TeX'ом блоку, определяется только тем, каковы ширина, высота и глубина блока, а не тем, какие размеры реально имеет текст, содержащийся в блоке, при этом может возникать наложение одного текста на другой. Например, размеры и точка отсчета блока, создаваемого командой \makebox[1.5em]{123456}, выглядят с точки зрения TeX'а так:


Для ясности мы использовали в этом примере крупный шрифт. А вот как такой "выпирающий за края" блок взаимодействует с окружающим текстом:

текст\makebox[1.5em]{123456}текст
текст\makebox[1.5em]{123456}текст

Можно также создать блок заданной ширины, в котором текст будет не центрирован, а прижат к правому или левому краю (полиграфисты говорят: " выключен вправо или влево"). Для этого в команде \makebox предусмотрен второй необязательный аргумент - буква l для текста, выключенного влево, или r для текста, выключенного вправо (можно также указать аргумент c - тогда текст будет центрирован, так же, как если бы второго необязательного аргумента не было). Пример:

\parindent=0pt
\makebox[10em][r]{текст}\\
\makebox[10em][r]{екст}\\
\makebox[10em][r]{кст}\\
\makebox[10em][c]{текст}\\
\makebox[10em][l]{текст}
\parindent=0pt
\makebox[10em][r]{текст}\\
\makebox[10em][r]{екст}\\
\makebox[10em][r]{кст}\\
\makebox[10em][c]{текст}\\
\makebox[10em][l]{текст}

Мы установили нулевое значение абзацного отступа, чтобы все строки, включая первую, начинались с самого начала. Кстати, обратите внимание, что у нас получилась верстка с выравниванием без помощи таких вещей, как tabbing или tabular.

У команды \makebox значение ширины блока можно установить равным нулю. Если при этом присутствует необязательный аргумент l, то получится блок нулевой ширины, а текст будет выходить за его пределы вправо (и, стало быть, наложится на последующий текст в строке, если таковой присутствует); если присутствует необязательный аргумент r, то текст будет выходить влево за пределы блока (и тем самым накладываться на предшествующий текст):

текст\makebox[0pt][l]{???}текст\\
текст\makebox[0pt][r]{???}текст\\
текст\makebox[0pt][l]{???}текст\\
текст\makebox[0pt][r]{???}текст\\

Наряду с r (" прижатый вправо"), l ("прижатый влево") и c ("центрированный"), в качестве второго необязательного аргумента команды \makebox можно использовать и букву s, с которой начинаются английские слова stretched (растянутый) и shrunk (ужатый). Соответственно, при указании такого второго необязательного аргумента текст будет равномерно растянут или сжат до ширины, указанной в первом необязательном аргументе. Если при этом придется превысить предел растяжимости, то появится сообщение Underfull \hbox, а если окажется, что превышен предел сжимаемости, то вы увидите сообщение Overfull \hbox. Чтобы осмысленно применять \makebox с необязательным аргументом s, надо уметь управлять растяжимостью и сжимаемостью промежутков. Как это делать, рассказано в следующем разделе.

До сих пор мы задавали ширину блока в команде \mbox в явном виде. Можно, кроме того, выразить эту ширину через " естественную" ширину текста. Для этого служит команда \width. Вот, например, как сделать, чтобы чтобы ширина блока, получаемого с помощью \makebox, была на 30% больше естественной:

\makebox{скоросшиватель}\\[2pt]
\makebox[1.3\width][r]{скоросшиватель}
\makebox{скоросшиватель}\\[2pt]
\makebox[1.3\width][r]
{скоросшиватель}

Командой \width можно пользоваться только внутри необязательного аргумента \makebox (или \framebox — см. ниже). Не пытайтесь пользоваться ею в качестве параметра со значением длины — ничего хорошего из этого не выйдет.

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