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

Набор текста

Команда \sloppy и параметр \emergencystretch

Существует простой и грубый способ раз и навсегда избавиться от переполнений. Для этого достаточно включить в преамбулу файла команду \sloppy — больше сообщений о слишком длинных строках вы, скорее всего, не увидите. Для черновых распечаток команды \sloppy, помещенной в преамбулу, чаще всего бывает достаточно. При изготовлении оригинал-макета, однако же, доверяться ей полностью было бы рискованно, так как иногда в этом режиме могут появиться недопустимо разреженные строки. Разумнее задать эту команду не в преамбуле, а перед концом того абзаца, в котором произошел overfull (см. ниже по поводу того, как это сделать), и посмотреть, что из этого получится.

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

режим верстки абзаца определяется в тот момент, когда TeX читает пустую строку, завершающую абзац.

В частности, если вы решили дать команду \sloppy внутри группы, то для того чтобы она подействовала на абзац, необходимо, чтобы закрывающая фигурная скобка шла после пустой строки, завершающей абзац. Вот пример того, как надо действовать в таких случаях:

Черепаховый суп — изысканное
деликатесное и диетическое блюдо
{\sloppy

}

А вот — типичная ошибка начинающего:

{\sloppy
Черепаховый суп —
изысканное деликатесное
и диетическое блюдо}

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

Для более тонкого управления выбором между разреженными строками и overfull'ами используется параметр со значеним длины \emergencystretch. Его точный смысл мы объясним ниже, а для начала скажем, что если установить его значение равным примерно 20-30 пунктам, т.е. написать, например,

\emergencystretch=25pt

то в случае, когда без переполнений сверстать абзац не удается, TeX попробует сделать все строки абзаца более разреженными (тем более разреженными, чем больше величина этого параметра). Точную величину \emergencystretch надо подбирать экспериментально.

Ручное управление разрывами строк

Иногда возникает необходимость повлиять на то, в каком месте TeX начинает новую строку. Для этой цели есть соответствующие команды, с одной из которых мы уже встречались — это "неразрывный пробел", запрещающий разрыв строки между двумя словами.

Иногда надо обеспечить, чтобы в каком-то слове не делалось переносов, причем не вообще никогда (тогда разумно применить команду \hyphenation ), а только в данном месте. Можно добиться этого, например, с помощью команды \mbox, написав так:

Параметр
\mbox{\textbf{filename}}
задает имя файла
.
Параметр
\mbox{\textbf{filename}}
задает имя файла.

Команда \mbox имеет один обязательный аргумент: в фигурных скобках может находиться любой текст, укладывающийся в одну строку (в том числе, как вы заметили, с командами переключения шрифта и т.п.); TeX будет рассматривать содержимое \mbox как одну большую букву и тем самым, конечно, не сможет разорвать его между строками.

Вы уже встречались с командой \mbox, если прочли в предыдущей лекции раздел о включении текста в формулы; более подробно мы ее рассмотрим в лекции о "блоках".

Теперь посмотрим, что делать, если вам понадобилось насильно разорвать строку в каком-то месте, не начиная при этом нового абзаца. Для этого есть несколько способов, в зависимости от того, что вы хотите получить. Один из вариантов — воспользоваться командой \\ и получить возможно не доходящую до края, но не растянутую строку:

Эта строка\\ была разорвана.
Справа осталось пустое
место, но зато строка
не разреженная
.
Эта строка\\ была разорвана.
Справа осталось пустое
место, но зато строка
не разреженная.

Можно также воспользоваться командой \linebreak ; при этом оборванная строка будет выровнена по правому краю, даже если ради этого ее придется растянуть:

Эта строка была\linebreak
разорвана. Она выровнена по
правому краю, но для
этого ее пришлось
безбожно растянуть
.
Эта строка была\linebreak
разорвана. Она выровнена по
правому краю, но для
этого ее пришлось
безбожно растянуть.

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

Команда \\ допускает и необязательный аргумент: если в квадратных скобках указать какое-то расстояние (в TeX'овских единицах длины — то после оборванной строки будет оставлено это расстояние (по вертикали). Пример:

Разорвем строку\\[5pt] и
оставим место
.
Разорвем строку\\[5pt] и
оставим место.

При использовании команды \\ с необязательным аргументом бывает удобно вместо расстояния в явном виде указать один из следующих параметров:

\smallskipamount маленький вертикальный пробел;
\medskipamount вертикальный пробел побольше;
\bigskipamount еще больше.

Точный размер этого пробела зависит от класса документа (и " классовых опций"); далее в лекции будет изображена величина соответствующих пробелов в стандартных классах со шрифтом кегля 115При печати книг оригинал-макет часто уменьшают; в этом случае, естественно, пропорционально изменяются и промежутки. Вот для сравнения промежуток, который в оригинал-макете имел размер в один сантиметр:\vrule\hspace*{1cm}\vrule ; если бы мы написали \\* или \\* [ расстояние ], то эффект был бы тот же, что и без звездочки, и к тому же было бы запрещено заканчивать страницу на оборванной строке.

У команды \linebreak с необязательным аргументом} также может присутствовать необязательный аргумент. При этом команда \linebreak[n] указывает, что в данном месте желателен переход на новую строку, причем n указывает "силу" этого желания ( n должно быть целым числом от 0 до 4). Если n=4, то это полностью равносильно \linebreak без необязательного аргумента, если n=0, то это означает только, что строку в данном месте разрешается разорвать (так что применять эту команду с аргументом 0 между словами обычно бессмысленно); когда n возрастает от 1 до 3, команда \linebreak[n] "усиливает давление" на TeX'овский алгоритм верстки абзаца, делая для него разрыв в указанном месте все более выгодным, невзирая на возможное появление разреженных строк.

Есть также команда \nolinebreak, действующая противоположно; она также может принимать необязательный аргумент — целое число от 0 до 4. Будучи заданной с аргументом 4, эта команда запрещает разрыв строки в указанном месте. Когда ее необязательный аргумент возрастает от 1 до 3, TeX начинает рассматривать разрыв строки в указанном месте как все менее желательный, даже невзирая на то, что из-за отказа от этого разрыва могут появиться разреженные строки. Команда \nolinebreak[0] равносильна, как это ни странно, команде \linebreak[0]. Команду \nolinebreak надо давать непосредственно после слова и до пробела, иначе она не сработает.

Для простых приложений, о которых идет речь в этой лекции, команда \nolinebreak, как правило, не нужна: чтобы запретить разрыв, гораздо удобнее "неразрывный пробел". Команда \nolinebreak иногда бывает полезна при разработке собственных макроопределений, о чем сейчас говорить преждевременно.

Абзацы без выравнивания и переносов

Можно перевести TeX в режим, при котором он вообще не будет пытаться выравнивать текст по правому краю и не будет (почти никогда) делать переносов. Для этого служит команда \raggedright. Ее можно дать как в преамбуле, так и внутри документа; в любом случае, чтобы она подействовала на абзац, необходимо, чтобы ее действие не прекратилось до того, как TeX'ом будет прочтена пустая строка, завершающая абзац (ср. выше обсуждение команды \sloppy ). Вот пример:

Этот абзац мы сверстали
без выравнивания и переносов.
Может быть, вид и не очень
аккуратный, зато без
overfull'ов.{\raggedright

}
Этот абзац мы сверстали
без выравнивания и переносов.
Может быть, вид и не очень
аккуратный, зато без
overfull'ов.{\raggedright

}

Команда \raggedright в том виде, как она представлена в LaTeX'е, делает абзацный отступ равным нулю, поскольку предназначена для оформления текста в виде так называемого "флагового набора". В приведенном выше примере этого не произошло, поскольку команда \raggedright была выполнена после начала абзаца, когда абзацный отступ уже был определен; если, однако, записать ее в преамбулу, то отступ будет равен нулю для всех абзацев. Если вам это не нравится, но выравнивать текст по правому краю все-таки не хочется, можно после \raggedright записать в преамбуле команду, устанавливающую значение абзацного отступа \parindent ; в стандартных классах значение этого параметра равно примерно 1.5em.

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