Работа в системе LaTeX
de301fb4

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


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

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



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

текст\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]{текст}
Мы установили нулевое значение абзацного отступа, чтобы все строки, включая первую, начинались с самого начала.


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

У команды \makebox значение ширины блока можно установить равным нулю. Если при этом присутствует необязательный аргумент l, то получится блок нулевой ширины, а текст будет выходить за его пределы вправо (и, стало быть, наложится на последующий текст в строке, если таковой присутствует); если присутствует необязательный аргумент 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]{скоросшиватель}
Командой \width можно пользоваться только внутри необязательного аргумента \makebox (или \framebox — см. ниже). Не пытайтесь пользоваться ею в качестве параметра со значением длины — ничего хорошего из этого не выйдет.


Содержание раздела