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

Блоки и клей

Растяжимые интервалы

До сих пор шла речь о важных, но непринципиальных различиях между TeX'овским \hbox и LaTeX'овским \mbox. Теперь поговорим о дополнительных возможностях, предоставляемых TeX'овской командой.

Команда \hbox "в чистом виде" создает блок, ширина которого равна естественной длине текста, являющегося ее аргументом. Кроме этого, она может создавать блоки любой заданной ширины. Для этого нужно сказать

\hbox to {ширина}{текст}

Здесь {ширина}должна быть выражена в воспринимаемых TeX'ом единицах длины: это может быть, например, 20pt, или 2.3cm, или, например, 0.12\textwidth - параметр со значением длины (возможно, с коэффициентом) тоже годится. Между to и обозначением ширины, а также между обозначением ширины и открывающей фигурной скобкой могут быть пробелы - TeX их проигнорирует2Пустых строк, однако, быть не должно.. Наконец, отсутствие backslash в слове to не является опечаткой: это не команда, а одно из "ключевых слов" TeX'а (подобно ключевым словам plus и minus, с которыми мы вскоре снова встретимся, или width и height, с которыми мы уже встречались в разделе, посвященном линейкам). Давайте опробуем эту новую возможность команды \hbox:

\hbox to 3cm {Два слова}
\hbox to 3cm {Два слова}

Если вы опробовали этот пример на вашем компьютере, то заметили, что на экране появилось сообщение

Underfull \hbox

Дело в том, что пробел между словами "Два" и " слова" не может растянуться настолько, чтобы наш блок имел ширину три сантиметра; в ситуациях, когда пробел насильно заставляют растянуться больше, чем положено, возникает сообщение об Underfull'е, как это было объяснено в разд. 3.6.6.

Можно, однако, заставить TeX создать блок требуемой ширины " без скандала". Для этого в том промежутке, который мы хотим растянуть, надо поставить команду \hfil:

\hbox {Два слова}\\
\hbox {Два \hfil слова}\\
\hbox to 2cm {Два \hfil слова}\\
\hbox to 3cm {Два \hfil слова}\\
\hbox to 4cm {Два \hfil слова}
\hbox {Два слова}\\
\hbox {Два \hfil слова}\\
\hbox to 2cm {Два \hfil слова}\\
\hbox to 3cm {Два \hfil слова}\\
\hbox to 4cm {Два \hfil слова}

Если мы не указываем явно ширину блока, а предоставляем TeX'у создать блок "естественной" ширины, то команда \hfil никакого действия не оказывает; если промежуток для достижения требуемой ширины надо растянуть, то растяжение на требуемое расстояние будет проведено в том месте, где стоит команда \hfil.

Если в аргументе команды \hbox присутствует не одна команда \hfil, а несколько, то растяжение произойдет на месте каждой из этих команд, причем размер этого растяжения будет распределен между командами \hfil равномерно: если необходимо превысить естественную ширину блока на 5 \,см, а в аргументе команды \hbox стоят два \hfil, то на месте каждого из них будет добавлен пробел в 2{,}5 см. Вот пример с несколькими \hfil:

\hbox to 4cm{Раз \hfil два \hfil три}
\hbox to 4cm
{Раз \hfil два \hfil три}

В частности, если \hfil стоит справа или слева от текста, то весь текст будет прижат влево или вправо, поскольку \hfil отмечает то единственное место, в котором интервалы могут растягиваться; если же две команды \hfil стоят по обе стороны от текста, то текст внутри блока будет центрирован, поскольку дополнительное растяжение поделится между двумя \hfil поровну:

\hbox to 0.7\textwidth
{Слева\hfil}
\hbox to 0.7\textwidth
{\hfil Справа}
\hbox to 0.7\textwidth
{\hfil В центре\hfil}
\hbox to 0.7\textwidth
{Слева\hfil}
\hbox to 0.7\textwidth
{\hfil Справа}
\hbox to 0.7\textwidth
{\hfil В центре\hfil}

Можно считать, что на месте каждого \hfil в строку вставляется пружина; все эти пружины имеют одинаковую жесткость, в свободном состоянии все они имеют нулевую ширину, и все эти пружины могут сколь угодно широко растягиваться.

Наряду с \hfil существует команда \hfill, также задающая бесконечно растяжимые пробелы, причем эта растяжимость "в бесконечное число раз больше", чем у пробелов, задаваемых \hfil. Если в аргументе команды \hbox присутствуют \hfil и \hfill совместно, то все растяжения происходят только за счет "более растяжимых" \hfill:

\hbox to 4cm{\hfil Слово\hfil}\\
\hbox to 4cm{\hfill Слово\hfil}\\
\hbox to 4cm{\hfil Слово\hfill}
\hbox to 4cm{\hfil Слово\hfil}\\
\hbox to 4cm{\hfill Слово\hfil}\\
\hbox to 4cm{\hfil Слово\hfill}

Лидеры

В оглавлении к этой книге (и ко многим другим тоже) место между названием раздела и номером страницы заполняется рядом из точек. Это можно сделать с помощью LaTeX'овской команда \dotfill. Она работает так же, как и \hfill, с той разницей, что пробел, образующийся в результате действия этой команды, заполняется точками:

\hbox to 3cm{А\dotfill Б}
\hbox to 3cm{А\dotfill Б}

Кроме этого, есть LaTeX'овская команда \hrulefill, которая также действует аналогично команде \hfill и при этом заполняет пробел линейкой:

\hbox to 5cm{1\hrulefill
2\hrulefill 3}
\hbox to 5cm{1\hrulefill
2\hrulefill 3}

В TeXнической терминологии такие заполнители называют лидерами (leaders).

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

\hbox to 5cm{1\leaders
\hbox{Ъ}\hfil 2}
\hbox to 5cm{1\leaders
\hbox{Ъ}\hfil 2}

Если бы мы хотели, чтоб буквы Ъ шли не вплотную, можно было бы, например, вместо "Ъ" написать так:

\hbox to 2em{\hfil Ъ\hfil}

В общем случае применяйте команду \leaders так:

\leaders $\langle$
\textit{блок}$\rangle$ $\langle\mbox{\cs(hfil)
\textit{или} \cs(hfill)}\rangle$

Здесь \langle блок\rangle - это любая TeX'овская команда для генерации блока, например, \hbox, с которой мы уже познакомились, или \vbox или \copy, о которых еще пойдет речь. Команды LaTeX'а ( \mbox, \makebox, \parbox и т.п.) применять в этом контексте нельзя; если, тем не менее, хочется воспользоваться их возможностями, то их надо " спрятать" в \hbox, написав, например,

\hbox{\makebox[3em][r]{...}}

Между командой для генерации блока и командой \hfil или \hfill может быть пробел (например, конец строки). Команда \leaders работает так: выделяется столько свободного места, сколько получилось бы, если бы стояло просто \hfil или \hfill, а затем это место заполняется идущими вплотную друг к другу копиями \langle блок\rangle столько раз, сколько этот блок поместится по ширине на выделенное место (если ширина свободного места меньше ширины блока, то ни разу).

С помощью команды \leaders можно также изменить толщину линейки, заполняющей свободное место. Именно, команда \hrulefill является по существу сокращением от

\leaders\hrule\hfill

Если же мы скажем, например,

\leaders\hrule height 1pt \hfill

то линейка будет иметь толщину 1 пункт, вместо принятых по умолчанию 0.4 пункта. Можно также написать \hfil вместо \hfill, с очевидными последствиями.

Василий Майоров
Василий Майоров
Даврон Юсупалиев
Даврон Юсупалиев
Андрей Лучицкий
Андрей Лучицкий
Россия
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002