Типографика: Страницы и абзацы в LaTeX

6 мая 2020 (10:07:11)

Небольшой конспект, собранный по опыту вёрстки художественных книжек в LaTeX. Вообще-то дядька Кнут писал свою систему для научных текстов с формулами, а тут есть определённая разница… которую приходится постигать именно по опыту.

Слабым местом LaTeX’а является алгоритм разбиения текста на страницы, и понятно почему. Во-первых, при наличии в тексте большого числа формул между ними присутствует много вертикальных промежутков, которые легко растягивать-сжимать и за счёт этого делать страницу красивой. Во-вторых, когда Кнут и Лэмпорт работали над TeX и LaTeX, компьютеры были недостаточно мощными, чтобы рассматривать разбиения на несколько страниц вперёд — как следствие, алгоритм получился локальным.

Что это означает практически? Грубо говоря, система набирает абзацы для формирования текущей страницы, и как только видит оптимум с точки зрения заданных параметров, то тут же и выдаёт сформированную страницу в файл, обнуляет своё состояние, после чего начинает формировать следующую. Того, что можно было сделать предыдущую страницу чуть-чуть хуже и тогда следующая будет нормальной, а в нынешнем виде при оптимальности предыдущей следующая страница получается ужасной — этого система не разумеет. Да с формулами на странице такого обычно и не получается.

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

﹨setlength{﹨emergencystretch}{3em} — позволяет чрезмерно растягивать пробелы между словами, чтобы избежать переполненных строк; указанное значение как раз сообщает, сколько пустого места допускается вставлять для растяжки пробелов. В русском языке слова длиннее английских, поэтому разреженные абзацы обычно выглядят достаточно естественно. Экстремальным случаем является команда ﹨sloppy, которая разрешает вставлять этих пустых мест вообще сколько угодно.

﹨hfuzz=2.5pt — задаёт величину, на которую разрешается выступать за правую границу строки, не считая это переполнением. Понятно, чем больше поля на странице, тем больше её можно задать, и результат не будет выглядеть слишком плохо.

﹨setlength{﹨parindent}{2em} — устанавливает величину абзацного отступа. Вообще задаётся глобально, но в самом крайнем случае можно немного изменить её на одну главу. Хотя лучше так не баловаться.

﹨setlength{﹨parskip}{0pt plus 2pt} — устанавливает дополнительный (растяжимый) интервал между абзацами. В данном случае говорится, что при нормальных условиях между абзацами ничего вставлять не нужно, но при необходимости можно растягивать межабзацный интервал на величину до двух пунктов. Можно при крайней необходимости указывать сжимаемый интервал, но очень не рекомендуется, так как выглядит сильно хуже.

﹨hyphenpenalty=100 и ﹨exhyphenpenalty=300 — эти команды устанавливают штрафы за переносы слов вообще и за переносы по дефису в частности. С ними главное не переборщить.

﹨raggedbottom — предписывает не растягивать страницу по вертикали, разрешая позиционировать последние строки на различной высоте. В русском художественном тексте делать это очень не рекомендуется.

﹨clubpenalty=1500 и ﹨widowpenalty=1500 — эти команды устанавливают штрафы за разрыв страницы после первой и перед последней строками абзаца соответственно. Если что, разрыв страницы после первой строки абзаца всё-таки выглядит лучше разрыва страницы перед последней строкой.

﹨looseness=-1 — требует от системы попытаться сделать текущий абзац на одну строку короче, чем при оптимальной вёрстке. Делается за счёт ужатия межсловных пробелов и получается не всегда, но часто получается. Понятно, если последняя строка абзаца оказывается длинной, то скорее всего не получится.

﹨nopagebreak[0–4] — запрещает разрыв страницы в этом месте (0 — не рекомендует, 4 — категорически запрещает). В комбинации с командой вертикального промежутка обязательно должна стоять первой.

﹨pagebreak[0–4] — аналогично предыдущей команде, но наоборот, предписывает разрыв (0 — предлагает, 4 — категорически требует).

﹨enlargethispage{﹨baselineskip} — разрешает добавить на текущую страницу одну дополнительную строку. Имеет смысл пользоваться только в тех случаях, когда последняя строка абзаца получается короткой, на один-два слога, и эти слоги упорно вылезают на следующую страницу.

Другие возможности вмешательства в вёрстку таковы:

  • попытаться запретить перенос слова в проблемном месте, заключив его в ﹨mbox{}; за счёт этого можно чуть растянуть абзац.
  • если слово упорно переносится некрасиво, то задать ему явные переносы посредством вставки ﹨- между слогами. Если это слово встречается часто, то задать ему переносы один раз в начале текста посредством ﹨hyphenation{эк-зи-стен-ци-а-лизм}.
  • если смысловые единицы текста разделяются вертикальными промежутками, то поиграться с их величинами — в принципе, можно делать эти величины разными, никто не запрещает.
  • пользоваться или не пользоваться неразрывными пробелами при однобуквенных словах. Типографика требует, чтобы однобуквенные слова «а», «в», «и», «к», «о», «с», «у», «я» не стояли в конце строки, а однобуквенные частицы «б», «ж» в начале. Эти присоединения выполняются за счёт использования неразрывного пробела «~», но при крайней необходимости ими можно и пренебречь.