Клей
Выше мы рассмотрели команды \hfil и \hfill, которые действуют подобно вставленным в строку пружинам. Можно вставлять в строку пружины с самыми разнообразными свойствами, указав LaTeX'овской команде \hspace аргумент, содержащий plus- или minus-компоненту (в разд.3.9.4 мы упоминали об этой возможности, но в тот момент у нас еще не было серьезных примеров). Именно, если вы скажете
\hspace{"$x$ plus $y$ minus $z$"}где
, и - длины, то вставите в текст пружину, которая в свободном состоянии имеет длину , может увеличивать свою длину на и уменьшать свою длину на (в отличие от пружин, встречающихся в жизни, может выполняться неравенство , и, того пуще, длины и могут быть отрицательными, но мы не будем объяснять, как TeX поведет себя в столь странной ситуации).3) Здесь plus и minus - это, как мы помним, очередные ключевые слова TeX'а, наподобие to, width и height. Если мы создаем блок естественной ширины, то команда \hspace с таким аргументом создаст пробел размером ; если же мы в команде \hbox попросим TeX создать блок, ширина которого отличается от естественной, то для достижения требуемой ширины размеры пробелов будут изменяться. В TeXнической терминологии эти "пружины" называются клеем (Дональд Кнут отмечает, что название "клей" неудачно, но менять его поздно, поскольку оно, по его словам, "уже прилипло"). Длины и , указанные после ключевых слов plus и minus, называются plus- и minus- компонентами клея. Длина называется естественным размером клея. С этой точки зрения команда \hfil также помещает в строку клей - с бесконечной растяжимостью и нулевым естественным размером.Опишем более точно, как именно растягивается или сжимается клей при выполнении команды \hbox to ... Для простоты предположим дополнительно, что plus- и minus- компоненты клея всюду неотрицательны и что в строке отсутствует клей с бесконечной растяжимостью или сжимаемостью (в частности, в строке нет \hfil'ов или \hfill'ов; про клей с бесконечной сжимаемостью речь пойдет ниже).
В этом случае TeX вычисляет "естественную ширину" блока, складывающуюся из ширин составляющих его элементов и естественных размеров клея, и сравнивает ее с требуемой шириной блока, указанной в команде \hbox после ключевого слова to. Если эти две ширины совпали, то все пробелы будут иметь естественный размер. Если требуемая ширина больше естественной, то TeX вычисляет, насколько больше, после чего "разверстывает" эту добавку между всеми пробелами пропорционально величинам plus - компонент клея в этих пробелах.
Вот пример. Предположим, мы создаем блок с помощью команды
\hbox to $a$ {А\hspace{0pt plus 2em}% Б\hspace{1cm plus 1em minus 2mm}В} где величина
В приведенном примере оба пробела в блоке были созданы вручную командой \hspace; если же в аргументе команды \hbox присутствуют пробелы, то следует учесть, что эти пробелы также, как мы объясняли ранее, обладают растяжимостью и сжимаемостью, которая также берется в расчет.
В случае, когда пробелы надо растягивать и требуемое растяжение блока больше, чем сумма plus - компонент всех элементов клея, на экран и в log -файл выдается знакомое вам сообщение Underfull \hbox; если пробелы надо уменьшать и величина, на которую надо уменьшить ширину блока, меньше, чем сумма minus - компонент всех элементов клея, то выдается не менее знакомое сообщение Overfull \hbox.
Все сказанное относилось к случаю, когда бесконечно растяжимого клея в аргументе команды \hbox нет.
Если же таковой присутствует (например, есть команда \hfil) и пробелы надо растягивать, то растяжимость клея с конечными значениями plus -компонент утрачивается: соответствующие интервалы будут иметь естественный размер (что бы ни было написано в аргументе команды \hspace после plus), а все растяжения будут происходить только за счет команд \hfil. При этом сообщение об Underfull'е выдаваться не будет, как бы ни растянулись пробелы. Аналогично, если пробелы надо ужимать и присутствует клей с бесконечной сжимаемостью, все уменьшения пробелов произойдут только за его счет и никогда не будет выдано сообщения об Overfull'е.
Если в аргументе команды \hbox присутствуют команды \hfil и \hfill совместно, то при необходимости растягивать пробелы учитывается только \hfill, в то время как "в бесконечное число раз менее растяжимый" \hfil в расчет не берется (не говоря уж о клее с конечной растяжимостью):
| \hbox to 4cm{\hfil Блоки и клей\hfil} \hbox to 4cm{\hfil Блоки и клей\hfill} \hbox to 4cm{\hfill Блоки и клей\hfill} |