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

Набор текста

Абзацы

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

Overfull и underfull

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

Если это удается, то получается аккуратный абзац, но нам сейчас интереснее, что происходит в том случае, когда это не удается.

Прежде всего заметим, что "предел сжимаемости" строки не превышается TeX'ом ни при каких условиях2Если не предпринимать для этого специальных усилий. ; что бы ни было, строки не станут более тесными, чем им позволяют параметры шрифта. Поэтому строки, которые не удалось ужать, остаются чересчур длинными (при этом, естественно, они выходят на поля документа). С другой стороны, предел растяжимости, за неимением лучшего, может быть превышен. При этом получается то, что полиграфисты называют жидкими, или разреженными строками:

\begin{flushleft}
\tolerance=10000\hbadness=10000
\leavevmode
\hbox to .6\hsize{Весьма и весьма разреженная строка.}
\end{flushleft}

О каждой из этих двух неприятностей TeX сообщает в процессе трансляции (эти сообщения появляются на экране и, кроме того, записываются в log-файл - специальный файл с тем же именем, что у файла, который обрабатывался системой, и расширением log).

Предположим, вы получили строку, выходящую на поля (в нашем примере она отмечена черным прямоугольником):

\par\nopagebreak\smallskip\moveright 2em\vbox{
\typeout{Не обращай внимания на следующий Overfull!}
\hyphenation{если}\fussy\tolerance=100
\advance\hsize-4.9em\overfullrule 2pt
Еще одно правило относительно увеличения пробелов: если
пробел задан как неразрывный, то он не
увеличивается, невзирая ни на какие предшествующие знаки
препинания.
\typeout{}
}
\typeout{А теперь снова следи за Overfull'ами!}
\smallskip\hyphenation{ес-ли} % восстановим...</p>

При этом выдается на экран и записывается в файл с расширением log сообщение наподобие такого:

Overfull \hbox (3.2673pt too wide) in paragraph at lines 8--13
[]\OT1/cmr/m/n/10.95 Еще од-но пра-ви-ло от-но-си-тель-но
уве-ли-че-ния про-бе-лов: если
 []

Давайте разберем, что в нем написано. Сначала идет надпись "Overfull\hbox", указывающая, что произошло " переполнение" (overfull) строки. В скобках указано, на какое именно расстояние строка выходит за край: на 3.2673 пункта. (Напомним, что пункт примерно равен одной трети миллиметра). Далее сказано, что переполнение произошло при верстке абзаца (слова "in paragraph"), а затем указаны номера строк исходного файла, в которых был записан этот абзац.

Наконец, в этом сообщении приведен фрагмент неудачной строки вблизи ее конца (конца не в исходном тексте, а на печати){Загадочный набор символов, предшествующий фрагменту строки, характеризует текущий шрифт;}. Обратите внимание, что в некоторые слова вставлены дефисы: они показывают те места, в которых TeX в принципе мог бы сделать переносы. Если вглядеться повнимательнее, то станет ясна и причина катастрофы: в слове "если", которым заканчивается строка, дефиса не стоит вообще; значит, программа не смогла найти подходящего места для переноса и оказалась перед неприятным выбором: либо перенести это "если" целиком на другую строку (что, видимо, вызвало бы проблемы в других местах), либо оставить его на этой строке и создать overfull. Выбрано было второе (ниже мы объясним, как можно в какой-то мере управлять этим выбором).

Сообщения о разреженных строках выглядят так:

Underfull \hbox (badness 1142) in paragraph at lines 885--892
[]\OT1/cmr/m/n/10.95 Некоторым со-че-та-ни-ям атри-бу-тов
ни-ка-ко-го ре-аль-но-го шриф-та
 []

Главных элементов в этих сообщениях три:

  • само слово Underfull, указывающее, что речь идет о разреженной строке;
  • указание на строки исходного текста, в которых находится абзац с разреженной строкой (в нашем случае 885-892);
  • численная характеристика того, насколько разрежена строка (по-английски это число называется badness). В нашем случае это число равно 1142; вскоре мы обсудим, что оно значит.

Итак, мы выяснили, какие могут быть неприятности при верстке абзацев и как TeX о них сообщает. Вся оставшаяся часть этого раздела посвящена тому, как с этими неприятностями бороться.

Борьба с переносами

Вероятно, читатель был шокирован тем, что в нашем примере с overfull'ом TeX не смог найти, где сделать перенос в слове " если". Дело, в частности, в том, что обычно TeX не делает переносов, при которых от слова отрываются две последние буквы. Это соответствует нормам английской орфографии, но для русского языка такое ограничение неуместно. Поэтому при работе с русскими текстами можно (и нужно) установить такой режим, в котором перенос двух последних букв допустим. Устанавливается этот режим с помощью изменения параметра \righthyphenmin. Значение этого параметра — целое число, равное наименьшему количеству букв в слове, которые можно переносить на следующую строку. Стало быть, если написать в файле

\righthyphenmin=2

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

\righthyphenmin=3

дабы не сделать неверных переносов в английских словах3Сказанное в этом абзаце относится к вариантам русификации, где русские и английские слова включены в общую таблицу переносов (такова, например, русификация, использованная при подготовке этой книги и описанная в приложении babel. В других случаях могут потребоваться явные команды переключения языков (которые могут также заодно менять \righthyphenmin).

Общее облегчение режима переносов с помощью \righthyphenmin может, тем не менее, не помочь преодолеть встретившийся вам overfull: не исключено, что TeX действительно не знает, как перенести какое-то слово. Таких слов не очень много, но они встречаются. Кроме того, TeX не делает автоматических переносов в словах, содержащих диакритические знаки (например, если в слове указано ударение или если буква ё задана в тексте как \"е )4Если вы пользуетесь пакетом babel вместе с так называемыми EC-шрифтами и соответствующими "форматными файлами", то слова с диакритическими знаками иногда могут переноситься., а также в словах, в которых присутствуют наряду с буквами цифры, знаки препинания (не в конце слова) и т.п. Далее, если в слове присутствует дефис, то TeX сможет сделать в нем перенос только на месте этого дефиса, но так, что "{генерал-" останется в конце строки, а "губернатор" начнет следующую строку). Что делать в таких случаях, когда автоматически вставляемых TeX'ом переносов не хватает?

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

Пусть, однако, улучшать изложение дальше некуда, а абзац все равно получается неудачный. Что еще можно сделать, чтобы избавиться от переполнения?

Если TeX не может перенести слово, перенос которого по правилам русского языка возможен, то есть два способа указать TeX'у на это обстоятельство.

Во-первых, существует "одноразовый" способ указать TeX'у места переносов в слове. Это делается с помощью команды \- таким, например, образом:

тво\-р\'ог

Команда \- означает, что данное слово можно переносить в тех и только тех местах, где стоят знаки \- (хотя бы и вопреки тому, что диктует TeX'овский алгоритм переноса). Она годится для любых слов (с диакритическими знаками, цифрами и т.д.). Однако при этом TeX не запоминает, какие слова и в каких местах позволила ему перенести команда \-. Если, например, то же слово "творог" встретится в тексте еще раз, места переносов придется указывать заново.

Во-вторых, если слово-исключение встречается в тексте неоднократно, имеет смысл указать это TeX'у "раз и навсегда" (в пределах данного документа). Для этого предназначена команда \hyphenation. В качестве ее аргумента указываются слово или слова, в которых дефисами обозначены разрешенные места переносов. Например:

hyphenation{вклю-чен об-ласть}"

Теперь слова "включен" и "область" всегда будут переноситься так, как было указано (хотя бы и вопреки тому, что диктует алгоритм переноса). Если в слове, указанном в качестве аргумента команды \hyphenation, дефисов не поставить, то это будет означать, что переносить его вообще нельзя. Разумное место для команды \hyphenation — преамбула документа.

Слова, указанные в аргументе команды \hyphenation, должны быть разделены пробелами (конец строки — тоже пробел, так что слова можно располагать и в нескольких строках). Пустой строки в аргументе \hyphenation быть не должно. В качестве аргумента команды \hyphenation нельзя указывать слова с диакритическими знаками или небуквенными символами.

Слова в исходном тексте, в которые вставлены \-, будут переноситься именно там, где указано этими командами, невзирая на то, что говорит команда \hyphenation.

Иногда в тексте встречаются пары слов, объединенные знаком /,. По общим TeX'овским правилам такое "слово" перенесено быть не может. Если вместо символа / использовать команду \slash, то станет возможен перенос, при котором на одной строке останется первое слово и символ /, а на второй строке — второе слово:

Перенаправление ввода\slash вывода &
одна из характерных черт систем типа
UNIX\slash Linux
.
Перенаправление ввода\slash 
вывода —
одна из характерных черт 
систем типа UNIX\slash Linux.

Бывают случаи, когда избавиться от переполнения не помогают даже идеально расставленные переносы: например, если в конец строки попадает слово, которое переносить нельзя (скажем, " гвоздь"), или не допускающая переноса математическая формула. Что делать в таких случаях, рассказано в последующих разделах.

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