Более тонкая настройка
Режимы, задаваемые командами \sloppy и \fussy, представляют собой две крайности. Здесь мы расскажем вам о более аккуратных способах управления разбиением на строки.
Параметр \hfuzz. Если вы получаете слишком много сообщений о переполнениях, можно попросить TeX вообще не считать слишком длинными те строки, которые выдаются за край не очень сильно. Для этих целей предусмотрен параметр \hfuzz. Например, команда
\hfuzz=2.5pt
указывает, что как overfull будут восприниматься лишь те строки, которые выступают за край более, чем на два с половиной пункта. В обычном режиме значение параметра \hfuzz равно одной десятой пункта.
Если \hfuzz равен примерно пункта, то получается приемлемый для ординарных изданий результат. Дело в том, что на фоне идеально выровненных абзацев одна выдающаяся на пункта строка смотрится хуже, чем длинный текст, где все абзацы выровнены не идеально, а "с точностью до пункта".
Мера разреженности строки. Как вы помните, в сообщении TeX'а о разреженной строке фигурирует такая мера разреженности строки, как "badness". Посмотрите, как выглядят на печати разреженные строки с различными значениями этой меры:
У последней из наших строк значение badness равно 10000. Если растянуть пробелы в строке еще сильнее, то badness уже не увеличится, а останется равной 10000: с точки зрения TeX'а, такие разреженные строки настолько плохи, что нет смысла делать различие между ними.
Для интересующихся объясним подробнее, как вычисляется badness. Как мы уже говорили в разд. "Промежутки между предложениями", промежутки между словами в тексте не фиксированы, а могут растягиваться или сжиматься. Каковы эти пробелы и насколько они могут растягиваться, зависит от шрифта (для примера: у основного шрифта кегля 10 обычный промежуток между словами равен примерно пункта, а его растяжимость составляет пункта; промежуток же между предложениями в этом шрифте равен пункта и имеет растяжимость в пунктов)1). Когда TeX растягивает строку с целью выравнивания, он находит сумму "пределов растяжимости" всех промежутков — это "предел растяжимости" строки — и вычисляет, насколько требуемая длина строки больше " естественной" (определяемой размерами слов и нерастянутых промежутков между словами)- это "требуемое растяжение" строки. Отношение "требуемого растяжения" к "пределу растяжимости" строки определяет, насколько разреженной получится строка. Традиционно это отношение обозначается буквой . Практически в качестве меры разреженности используется не само число , а число --- это и есть badness. Если даже окажется, что , badness все равно будет считаться равной : строки, для которых отношение больше или равно (примерно при этом значении получается ), рассматриваются TeX'ом как одинаково плохие.
В том счастливом случае, когда требуемая длина строки совпадает с естественной, мера разреженности равна нулю; если мера разреженности не превосходит , то растяжение строки не превосходило предела; на самом деле даже строки, мера разреженности которых не превосходит , выглядят всё еще хорошо, хотя они уже и рассматриваются TeX'ом как слегка разреженные: TeX старается, чтобы такая "слегка разреженная" строка не попалась в абзаце рядом со строкой, в которой промежутки между словами сжимались. Сообщения об underfull'е появляются, когда badness превосходит 1000.
Теперь мы можем объяснить точный смысл параметра \emergencystretch. Если при верстке абзаца не удалось избежать переполнения, то — при условии, что значение \emergencystretch отлично от нуля, — TeX делает еще одну попытку, при которой в процессе перебора вариантов разбиения абзаца на строки (и вычислений соответствующих значений badness) к "пределу растяжимости" каждой из строк прибавляется значение \emergencystretch.
Параметр\tolerance. Теперь в нашем распоряжении есть все необходимые понятия, чтобы объяснить, как TeX выбирает между разреженной строкой и переполнением.
При разбиении абзаца на строки TeX никогда не создает строки, мера разреженности (badness) которых больше, чем значение TeX'овского параметра, называемого \tolerance. При невозможности удовлетворить этому условию создаются строки, выходящие за край: возникает overfull. С другой стороны, если мера разреженности строки не превосходит значения \tolerance, то будет создана именно столь разреженная строка, но не overfull.
В отличие от некоторых других систем компьютерной верстки, TeX никогда не растягивает и не сжимает отдельное слово.
В стандартном режиме значение параметра \tolerance равно . Если установить значение \tolerance равным , т.е. максимально возможному, то может получиться так, что одна из строк абзаца окажется совершенно ужасной: TeX вложит в нее "всю разреженность", чтобы не увеличивать то число, которое TeX минимизирует при переборе различных вариантов разбиения абзаца на строки (грубо говоря, это число тем больше, чем больше разреженных строк). Поэтому разумным решением во многих случаях будет увеличить значение \tolerance, но не до максимума, а до более разумной величины (скажем, 300 или 400). После этого TeX, с одной стороны, получит большую свободу действий, а с другой — не сможет создавать абзацы, в которых все строки, кроме одной, приемлемы, а одна разрежена до безобразия.
В частности, именно так работает команда \sloppy: она устанавливает \tolerance=9999, а не 10000 (так что сколь угодно разреженные строки все-таки не допускаются) и при этом задает значение \emergencystretch , равное 3em (так что при необходимости растянуть строки TeX может равномерно распределить дополнительную растяжимость по всему абзацу).
Увеличить значение \tolerance можно "глобально", во всем документе, дав в преамбуле команду наподобие
\tolerance=400
или же "локально", дав аналогичную команду внутри группы, содержащей данный абзац. В последнем случае не забывайте, что закрывающая группу фигурная скобка должна идти после пустой строки, завершающей абзац (см. выше обсуждение команд \sloppy и \raggedright ).
Как менять длину абзаца. Иногда абзац не помещается на полосу из-за того, что он на строку-другую длиннее, чем нужно, и хочется его укоротить. Команда
looseness=-1
побуждает TeX стараться, чтобы абзац занял на одну строку меньше, чем при оптимальной верстке. Если абзац короткий (скажем, занимает всего две строки), то из этого, конечно, ничего не получится. Если же абзац достаточно длинный, то у TeX'овского алгоритма обычно хватает гибкости, чтобы достигнуть этой цели.
Можно присвоить параметру \looseness и значение ; в этом случае TeX будет стараться сделать абзац короче на две строки (если не выйдет, то хоть на одну, а если и это не выходит, то оставит все как есть). Можно также присваивать \looseness положительные значения — в этом случае TeX будет стараться делать абзацы, которые содержат больше строк, нежели оптимальные.
По умолчанию значение параметра \looseness равно, естественно, нулю, и по окончании верстки каждого абзаца этот параметр также устанавливается в нуль. Тем самым нет нужды заботиться о том, чтобы значение \looseness менялось внутри группы, и бессмысленно присваивать этому параметру какое-то значение в преамбуле (оно забудется после первого же абзаца текста). Для каждого абзаца, для которого это вообще нужно, значение \looseness надо устанавливать заново.