Котельников И., Чеботаев П. LaTeX2e по-русски (1185906), страница 23
Текст из файла (страница 23)
. . . . . . . . . . . . . . . . . . . . . точек.Как LATEX делает строкиLATEX имеет простой, но эффективный алгоритм разбиения слов на слоги. Обычно он находит 80–90% всех правильных переносов (см. [2]), что вполне достаточно для практических целей. Осуществляя автоматическое разбиение текста настроки, LATEX хорошо справляется со своей работой. Однако иногда ему всё-такитребуется помощь. Например, он не способен определить логически связанныесочетания слов, которые желательно располагать на одной строке. Скажем, обращение «гр.
Шариков» выглядит странно, если «гр.» заканчивает одну строку, а«Шариков» начинает следующую. Символ ~ (тильда), вставленный между соседними словами, создаёт пробел нормального размера, на котором LATEX никогдане разорвёт строку:1034.4. Как LATEX делает строки\LaTeX~никогда, никогдане~~ра~зор~вёт~~стро~куLATEXникогда,не ра зор вёт стро куникогдаПодобным свойством, как мы знаем, обладает и самый маленький пробел \,.Слово нежелательно переносить по слогам, если оно по сути является символом, как идентификатор в компьютерной программе.
Команда \mbox (раздел 9.1)запрещает LATEX’у переносить её аргумент по частям со строки на строку. В следующем примере LATEX вынужден сделать большие пробелы между словами, таккак он обязан разместить слово «идентификатором» целиком в одной строке:Слово \textsf{FORTRAN} является\mbox{идентификатором}.СловоFORTRANидентификатором.являетсяИспользование большого количества связующих пробелов ~ или команд \mboxможет затруднить поиск подходящего места для переноса.
Так, в предыдущемпримере LATEX сообщает о своих затруднениях, печатая на экране дисплея предупреждение о незаполненном горизонтальном боксе с указанием, что источникпроблем находится в строках 707–709 входного файла:Underfull \hbox (badness 10000) in paragraph at lines 707--709Слово \T2A/cmss/m/n/10 FORTRAN \T2A/cmr/m/n/10 яв-ля-ет-ся []2Из этого сообщения следует, что LATEX не разбивал слово FORTRAN на слоги (таккак это иностранное слово), а в слове «является» он нашёл три переноса из трёх:яв-ля-ет-ся.
Немного изменив пример, мы обнаружим, что слово «идентификатором» вылезло за правую границу страницы:Слово \textsf{WHILE} является\mbox{идентификатором}.Слово WHILE является идентификатором.В этом случае LATEX печатает предупреждение о переполненном горизонтальномбоксе:Overfull \hbox (12.18564pt too wide) in paragraph at lines 735--737Слово \T2A/cmss/m/n/10 WHILE \T2A/cmr/m/n/10 яв-ля-ет-ся []3Здесь [] символизируют команду \mbox вместе с её аргументом. Если в декларации \documentclass была использована опция draft, то строка, вызвавшаязатруднения, в печатном документе будет помечена справа закрашенным прямоугольником.
По умолчанию используется опция final, и строка не метится.Получив предупреждение о незаполненном или переполненном горизонтальном боксе, полезно изменить текст так, чтобы его фрагмент, вызвавший затруднение, передвинулся внутрь строки. Однако существуют и другие способы разрешения этой проблемы: можно регулировать разбиение строк, переносы и режимформатирования абзацев.Незаполненный горизонтальный бокс (разрежение 10 000) в абзаце в строках 707–709. Слово(переключение шрифта) FORTRAN (переключение шрифта) яв-ля-ет-ся.3 Переполненный горизонтальный бокс (шире на 12.18564pt) в абзаце в строках 735–737.
Слово(переключение шрифта) WHILE (переключение шрифта) яв-ля-ет-ся.21044.4.1.Глава 4. От буквы до страницыРазрыв строкLATEX позволяет управлять разбиением строки между словами.\linebreak [num]\nolinebreak[num]Команда \linebreak поощряет, а команда \nolinebreak препятствует прерыванию строки между словами. Опция num должна быть целым числом от 0 до 4.Чем больше значение num, тем сильнее поощрение или запрещение. Значение поумолчанию равно 4 и действует как безусловный приказ. Значение 0 равносильно отсутствию команды и не влияет на прерывание строки. Если использованиекоманд \linebreak и \nolinebreak приводит к чрезмерно большим пробеламмежду словами, LATEX генерирует предупреждение Underfull \hbox.
Команды\linebreak и \nolinebreak хрупкие, они могут использоваться только в текстовом режиме.Команда\newlineначинает новую строку без выравнивания правого края текущей строки. Онаможет использоваться только в текстовом режиме и только внутри абзаца, таккак вызывает предупреждение Underfull \hbox и дополнительный вертикальный пробел, если стоит в конце абзаца, или сообщение об ошибке, если стоитмежду абзацами. Команды\\[len]\\*[len]ведут себя похожим образом, когда используются в текстовом режиме, причём*-форма команды \\ препятствует переносу новой строки на следующую страницу.
Обе команды открывают новую строку и вставляют дополнительный вертикальный пробел длины len перед ней. По умолчанию дополнительный пробел невставляется. Не следует использовать подряд несколько команд \\. Вместо этогов необязательном аргументе нужно указать дополнительное расстояние междустроками.
Например, \\[7mm].Возможно, Читатель удивится, зачем нужна команда \newline, если есть\\. Отвечаем: она не нужна и поддерживается только по аналогии с командой\newpage, которая начинает новую страницу. В отличие от \newline команды \\и \\* могут использоваться не только в текстовом режиме, но и в аргументахнекоторых команд, где уместно делать несколько строк (например, в \author,\title, \date, \chapter, \section и т. д.), а также в теле некоторых процедур(мы ещё не рассказывали о таких процедурах, как array, eqnarray, tabular,tabbing, quote, itemize и др.).Команды \\ и \\*, как и \newline, хрупкие. Поэтому их нельзя использоватьв подвижном аргументе, не защитив при помощи \protect.
Это обстоятельство1054.4. Как LATEX делает строкираньше сильно досаждало любителям длинных заголовков, так как один из аргументов команд секционирования является подвижным (раздел 3.5). Однакотеперь команды \\ и \\* в аргументах команд секционирования ведут себя какустойчивые, и там их можно не защищать.4.4.2.Перенос по слогамLATEX не считает возможным переносить слово по слогам, если перед ним стоитмаленький пробел \,. Переносы также не применяются к сложным словам, написанным через дефис. Однако в подобных случаях можно явно указать местопереноса командой\Команда \- одновременно запрещает все иные варианты переноса в слове, кудаона вставлена. Поэтому в следующем примере мы указали все варианты переноса:ИзобретательМ.О.\,До\-ливо-Доб\-ро\-воль\-ский.Изобретатель М.О.
Доливо-Добровольский.Наряду с \- есть более гибкая команда\discretionary{text1 }{text2 }{text3 }Она указывает компилятору, как переносить строку текста в данном месте. Аргумент text1 есть текст, который останется на текущей строке; text2 — текст,с которого начнётся новая строка; text3 — текст, который будет напечатан, если слово целиком уместится в одной строке. Команду \discretionary обычноиспользуют, чтобы удалить знак переноса:\discretionary{Река}{Москва}{Москва-река},\discretionary{река}{Москва}{Москва-река}.Москва-река,Москва.рекаЕсли какое-то слово встречается очень часто, можно вставить в преамбулу декларацию\hyphenation{words}Она информирует LATEX, как переносить слова, записанные в words (через пробелы), во всех случаях, когда явно не использована команда \-.
Допустимые точкипереноса указываются символом -. Например, если кто-то считает неправильнымперенос после первого слога в слове «является», он может запретить его во всёмдокументе:\hyphenation{явля-ет-ся явля-ют-ся поч-тальон}LATEX не переносит слова, набранные машинописным шрифтом или несколькимишрифтами, а также слова, содержащие цифры, скобки или буквы из другогоалфавита. Команда \- помогает и в этом случае.106Глава 4.
От буквы до страницы4.4.3.Режим форматирования абзацевLATEX позволяет повлиять на режим форматирования целых абзацев. Декларации\sloppy\fussyизменяют способ обрезания строки. Декларация \fussy, действующая по умолчанию, препятствует образованию слишком больших пробелов между словами,но разрешает словам вылезать за правую границу страницы, если не найденаподходящая точка для переноса. Декларация \sloppy почти всегда обрываетстроку в точности на правом краю, но при этом могут образоваться очень длинные промежутки между словами.
В этом случае LATEX выдаст предупреждениеUnderfull \hbox о незаполненном горизонтальном боксе. Область действия декларации \sloppy определяется следующим образом. LATEX выполняет разбиение на строки, когда доходит до конца абзаца (то есть до пустой строки) или допроцедуры, начинающей печать с новой строки (примером служат процедуры,описанные в главе 5).