В абзаце всё должно быть прекрасно

Комплютенская полиглотта


Среди верстальщиков есть спор с долгой историей (почти как между «остроконечниками» и «тупоконечниками»): надо ли автоматически проставлять неразрывные пробелы после всех однобуквенных союзов и предлогов. Мне захотелось вставить свои «пять копеек» и кратко изложить третий вариант, но пришлось копнуть чуть глубже. Получилось про абзац в целом.


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


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


Особенно печально это видеть на «читалках» — устройствах, как бы претендующих на вытеснение бумажной книги. Переносы не расставляются, отсюда возникают ужасающие дыры посреди текста или драный правый край. QReader на моей древней Nokia 3250 умел вполне сносно расставлять переносы. Эта опция ведь связана отнюдь не со слабенькой вычислительной мощностью читалок, не так ли? Неужели сверстать страничку текста на порядок сложнее, чем отрендерить pdf или jpeg на весь экран? Ну, а уж что мешает это делать браузерам на современных компьютерах, я совсем недоумеваю. Кажется, просто лень и небрежность.


О том, что такое «прекрасно свёрстанный абзац», есть информация в разных справочниках, вкратце можно было бы просуммировать следующим списком:


  1. правильный шрифт
  2. межбуквенные расстояния в каждой строке изменяются в разумных пределах
  3. межсловные пробелы в каждой строке в разумных пределах
  4. межсловные пробелы в соседних строках не слишком сильно отличаются
  5. разумный интерлиньяж
  6. гармоничный абзацный отступ или буквица
  7. аккуратный левый край (оптически), без одинаково начинающихся соседних строк (homeoarchy)
  8. аккуратный правый край (оптически), без частокола многих переносов кряду и без одинаково заканчивающихся соседних строк (homoioteleuton)
  9. если набор «флагом» (align=left) или выключкой по центру (align=center), то слово в конце строки не должно «висеть в воздухе», оно должно опираться на буквы следующей строки
  10. хорошая последняя строка: не слишком короткая (меньше 2 длин абзацных отступов) и не выглядящая недотянутой (до правого края остаётся меньше, чем абзацный отступ)
  11. без «коридоров» (rivers of white)
  12. без неблагозвучных переносов или незапланированных ассоциаций


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


Система правил, описывающих вёрстку абзацев, чем-то похожа на правила дорожного движения: так можно, а так нельзя. Но, в отличие от ПДД, тут нет дополнительного пособия, называемого «Таблица штрафов». Например, если на дороге очень надо обогнать трактор, то может быть выбор между ездой по обочине (1500 р.) и ездой по встречной полосе (5000 р. или лишение прав). Такой системы «штрафов» не знает InDesign. Для него «нельзя» значит «ни за что и никогда», и запретив 4 переноса подряд, я могу получить безумно растянутую строку. Мне кажется, что дырявую строку заметит большинство читателей, а четыре переноса подряд — только профессиональные зануды. Значит, выбор должен быть не такой, как у InDesign’а.


И этот вариант со штрафами расписывает в своей прекрасной книге не менее прекрасный Дональд Кнут: в его работе «Компьютерная типография» есть целая глава, посвящённая вёрстке абзаца (стр. 79–166). Там много математики и немало лирики, но основная идея такова. Текст представляется как последовательность 1) боксов, 2) растяжимого клея и 3) штрафов за разрыв строки в данном месте. Критерием плохости вёрстки абзаца является сумма штрафов за растянутость/ужатость строк, штрафов за переносы и ещё некоторые других дополнительных штрафов (за большую разницу в растянутости соседних строк, за два переноса подряд, и т. п.). Задача вёрстки сводится к тому, чтобы минимизировать общую сумму. И там же Кнут приводит программу-алгоритм решения этой задачи.


Вся эта штука работает достаточно неплохо, есть для ТеХ-а и паттерны переносов, с трекингом и оптическим выравниванием он мило работает благодаря microtype, а свод французских типографских правил «Lexique des règles typographiques en usage à l’Imprimerie Nationale» (весьма близкий к вышеописанному) можно применять, используя impnattypo.


Микротипографика при помощи microtype


Инструментарий — вещь хорошая, осталось научиться им пользоваться, описать, какие огрехи вёрстки мы считаем простительными, а какие — грубыми. Вот теперь мои «пять копеек».


Про правила, касающиеся неразрывных пробелов в текстах, на Хабре есть пара статей, есть и мощный скрипт DoTextOK, но учитывая вышесказанное, я не могу согласиться с авторами, что надо ставить после однобуквенных союзов и предлогов [авикосу] неразрывный пробел. Я хотел бы ввести в типографику новый термин — «слаборазрывный пробел». То есть такой, который можно разорвать, если очень надо.


Правило, которое мне удалось найти на эту тему, гласит:


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

П.Г. Гиленсон. «Справочник технического и художественного редакторов» М.: 1988. П. 11.4.1.1, С. 422

К сожалению, это не очень понятное правило. Неужели в этом блоке все пробелы должны быть неразрывными: «Почему и с 1 000 000 друзей…»? И в каких случаях этому «не следует оставлять» надо отдавать предпочтение над «не следует допускать слишком разреженных строк» и «не следует допускать белых коридоров в тексте»?


Кроме того, мне это правило не вполне понятно эстетически. Иногда оно ведёт к тому, что целый ряд строк начинается с однобуквенных слов. Разве это красиво? Разве это добавляет удобочитаемости? Как-то в студенческие годы, завёрстывая новость в узкую колонку, мы получили 4 строки подряд, начинающиеся с предлога «в». Подредактировав текст, довели это число до 6 — так и ушло в печать. Но это было ж чистой воды хулиганство.


Предлагаю это правило изменить. На следующий код для LaTeX:


\usepackage{newunicodechar}
\newcount\afterconjunctionpenalty
\afterconjunctionpenalty=1000
\newunicodechar{⋅}{\penalty\afterconjunctionpenalty\ }


Таким образом мы получим в LaTeX два спецсимвола:»~» для обозначения неразрывного пробела и »⋅» для обозначения слаборазрывного пробела. Величину штрафа можно подобрать по вкусу или даже менять локально.


А дальше несколько регулярных замен по тексту.


regexp

Однобуквенные слова в начале предложения не отрывать ни за что:


([^а-яА-ЯёЁ])([А-Я])\s+
$1$2~

Многобуквенные союзы и предлоги в начале предложения хорошо бы не отрывать:


([^а-яА-ЯёЁ])(Абы|Аж|Ай|Аки|Ако|Али|Аль|Ан|Аще|Без|Безо|Благо|Благодаря|Близ|Близко|Бо|Буде|Будто|Вблизи|Ввиду|Вглубь|Вдогон|Вдоль|Ведь|Взамен|Включая|Вкруг|Вместо|Вне|Внизу|Внутри|Внутрь|Во|Вовнутрь|Возле|Вокруг|Вопреки|Вослед|Впереди|Вплоть|Впредь|Впрочем|Вразрез|Вроде|Вслед|Вследствие|Всё|Где|Да|Дабы|Даже|Для|До|Докуда|Дотоле|Егда|Едва|Еже|Ежели|Если|Же|За|Заместо|Зане|Занеже|Зато|Зачем|Значит|Ибо|Из|Изнутри|Изо|Или|Иль|Именно|Имже|Иначе|Инда|Исключая|Исходя|Итак|Кабы|Как|Каков|Какой|Касательно|Ко|Когда|Когды|Коли|Коль|Который|Кроме|Кругом|Куда|Ли|Либо|Лицом|Лишь|Ль|Меж|Между|Мимо|На|Наверху|Навроде|Навстречу|Над|Надо|Назад|Назади|Накануне|Наместо|Наперекор|Наперерез|Наподобие|Напротив|Наряду|Настолько|Насупротив|Насчёт|Начиная|Не|Невзирая|Недалеко|Нежели|Независимо|Несмотря|Ни|Ниже|Но|Об|Обаче|Обо|Обок|Однако|Около|Окрест|Окромя|Округ|Опосля|Опричь|От|Отколь|Откуда|Откудова|Относительно|Ото|Оттого|Отчего|Перед|Передо|По|Поблизости|Поверх|Под|Подле|Подо|Подобно|Поелику|Позади|Позднее|Пока|Покамест|Покаместь|Покеда|Помимо|Понеже|Поперёд|Поперёк|Порядка|Посверху|Посередине|Посередь|Поскольку|После|Посреди|Посредине|Посредством|Пота|Потому|Почему|Почём|Правда|Пред|Предо|Прежде|При|Применительно|Притом|Причём|Про|Промеж|Просто|Против|Противу|Пускай|Пусть|Равно|Ради|Раз|Разве|Ровно|Рядом|Сверх|Сверху|Свыше|Середи|Сзади|Сиречь|Сколько|Следовательно|Следом|Словно|Смотря|Снизу|Со|Согласно|Спустя|Среди|Средь|Сродни|Столько|Судя|Супротив|Так|Также|Теперь|То|Тож|Тоже|Только|Хоть|Хотя|Чем|Через|Черезо|Чрез|Что|Чтоб|Чтобы|Чуть|Яко|Якобы)([,]*)\s+
$1$2⋅

Однобуквенные союзы и предлоги внутри текста хорошо бы не отрывать от многобуквенных слов (какие-то прилепляя к следующему слову, какие-то — к предыдущему):


([^а-яА-ЯёЁ][авикосу])\s([а-яА-ЯёЁ]{2}|[0-9]+)
$1⋅$2

\s+([бж]\s)
⋅$1


Я так уже некоторое время работаю и мне нравится :-)


Интересно, перекочуют ли эти фишки когда-нибудь в InDesign и веб-типографику?

© Habrahabr.ru