Многоликое многоточие… (часть 3: лучшая версия)

Спустя некоторое время, а именно 9 месяцев, мне пришла в голову идея по оптимизации макроса, который выдаёт красивое многоточие в LaTeX.

Вкратце перескажу первые две части.

Типографы LaTeX’а расходятся в мнении с большинством наборщиков по поводу многоточия. Если в иных издательских средах (Word, движок веб-сайта, InDesign и проч.) многоточие действительно нужно набирать тремя раздельными точками (...), а не одним символом (…), который, в частности, преподносится автозаменой MS Word, то в LaTeX’е было бы негоже использовать предустановленную контрольную последовательность \ldots или \dots, так как она выглядит широковато. В западной традиции многоточие зачастую разрежают пробелами, поэтому там широкая команда \dots (\ldots) сгодится, но с мелкими оговорками. Для российской (и не только) действительности предлагаю несколько команд, предоставляющих пользователю возможность легко набрать красивые многоточия, каких ещё свет не видывал, а также решить проблему неравномерного расположения точек в экзотичных многоточиях вида «?..».

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

Дональд Эрвин Кнут.

Любой интерфейс можно упростить в два раза.

Артемий Андреевич Лебедев.

Рассмотрим старый код.

\usepackage{soulutf8,xspace}
\xspaceaddexceptions{ > ) }
\sodef\so{}{.1em}{1em}{.3em plus.05em minus.05em}
\newcommand{\ldotst}{\so{...}\xspace}
\newcommand{\ldotsq}{\so{?\hbox{\hspace{-.212em}}..}\xspace}
\newcommand{\ldotse}{\so{!..}\xspace}

Что бросается в глаза?

  1. Зачем-то подключается сложный пакет soul, который приходится использовать в вариации soulutf8. Это усложняет жизнь и закладывает фундамент для потенциальных ошибок.
  2. Как следствие, становится затруднительной тонкая настройка расстояния.
  3. Использование высокоуровневой команды \hspace в определении команды текстовой моды создаёт ненужную нагрузку.

Как избавиться от этого? Ответ один — создать самую простую команду, которая добавляет требуемые жёсткие расстояния между символами знака препинания. Самая простая команда, генерирующая пропуск, — это \kern. Она хороша тем, что не может растягиваться или сжиматься, в отличие от клея, и после неё не будет разрыва строки (конечно, если после неё не идёт клей). В части 2 этого рассказа подробно описано, как подсчитать при помощи Photoshop, какое расстояние необходимо прибавить или убавить, чтобы точки смотрелись ровно.

Корректное многоточие в LaTeX с равномерными промежутками между точками для тех, кто пишет в соответствии с правилами русского языка:

\usepackage{xspace}
\def\ellipsiskern{.1em}
\xspaceaddexceptions{ > ) }
\newcommand{\ldotst}{.\kern\ellipsiskern.\kern\ellipsiskern.\xspace}
\newcommand{\ldotse}{!\kern\ellipsiskern.\kern\ellipsiskern.\xspace}
\newcommand{\ldotsq}{?\kern\ellipsiskern\kern-.11em.\kern\ellipsiskern.\xspace}

Если кому-то не хочется подключать пакет xspace, то предлагается самая робастная и компактная версия кода, в которой для обеспечения пробела после многоточия необходимо поставить пустую группу ({}):

\def\ellipsiskern{.1em}
\newcommand{\ldotst}{.\kern\ellipsiskern.\kern\ellipsiskern.}
\newcommand{\ldotse}{!\kern\ellipsiskern.\kern\ellipsiskern.}
\newcommand{\ldotsq}{?\kern\ellipsiskern\kern-.11em.\kern\ellipsiskern.}
...
Я хочу летать\ldotst{} Кто же этого не хочет\ldotsq{} Рассекать воздух "--- это так прекрасно\ldotse{}

В зарубежной типографской традиции принято всегда ставить пробел между точками в многоточии. Поэтому английское многоточие должно быть шире русского. Так у них на Западе принято.

In English, one always spaces the dots of an ellipsis out (usually a regular space in between is enough). That’s why English ellipses must be wider than their Russian “colleagues”. In Russia, ellipses space you out ellipses are tighter.

Proper LaTeX ellipses with even spacing and nice white space for those who typeset according to English punctuation rules:

\usepackage{xspace}
\def\ellipsiskern{.2em}
\xspaceaddexceptions{ > ) }
\newcommand{\ldotst}{.\kern\ellipsiskern.\kern\ellipsiskern.\xspace}
\newcommand{\ldotsp}{.\kern\ellipsiskern.\kern\ellipsiskern.\kern\ellipsiskern\kern.15em.\xspace}
\newcommand{\ldotse}{.\kern\ellipsiskern.\kern\ellipsiskern.\kern\ellipsiskern\kern.15em!\xspace}
\newcommand{\ldotsq}{.\kern\ellipsiskern.\kern\ellipsiskern.\kern\ellipsiskern\kern.067em?\xspace}

I do kern two times because I want to make the ellipses commands as customizable as possible. That’s why the space before the ending mark (point, question, exclamation) should change together with the length of \ellipsiskern.

Если вам будет надо набирать многоязычные документы, то создайте две длины, например \ellipsiskernru и \ellipsiskernen, и задайте 7 разных команд для текстовых многоточий. Только не запутайтесь, пишите удобные макросы.

Ha! Ha! I'm using ellipses with proper kerning guy

Об авторе Andreï Kostyrka

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

3 комментария: Многоликое многоточие… (часть 3: лучшая версия)

  1. Evgeny пишет:

    Благодарю за элегантное решение.
    Небольшое дополнение. Было обнаружено, что данные команды подпадают под microtype-protrusion, в частности, если включена висячая пунктуация, то последняя точка «свешивается». Это показалось не совсем удобным, и было найдено решение через добавление \strut:
    \newcommand{\ldotst}{.\kern\ellipsiskern.\kern\ellipsiskern.\strut\xspace}

  2. Сергей пишет:

    Когда-то у меня было два больших вопроса по правилам типографики — что делать с интервалами между точками в знаке «?..» и как быть с однострочными абзацами. На первый вопрос я получил ответ благодаря этим записям. Возможно, Вы поможете и со вторым?..
    В справочниках по верстке приводится следующее правило: если последняя строка многострочного абзаца короче полной строки менее, чем на 1,5em, то она растягивается до полной. А как быть, если абзац однострочный?

    • Andreï Kostyrka пишет:

      Добрый день, Сергей!
      В некоторых программных пакетах (Adobe) есть такая опция, как форсировать растяжение последней строки абзаца. Гм.
      Растяжение должно основываться исключительно на измерениях ширины пробела. Если пробелы в первой, последней, единственной — любой строке будут слишком большими, то применять растяжение нельзя. Всё ещё зависит от ширины строки: 1,5em в книжке формата A6 12-м кеглем и 1,5em в альбомной распечатке A4 10-м кеглем — разные вещи. Задача типографа — обеспечить равномерность плотности набора на странице (чтобы издалека она казалась равномерно серой без тёмных или светлых пятен). Если пробелы в этой самой единственной строке будут шире обычных более чем на 50%, то растягивать не надо. Например, если последний абзац — «И жили они долго и счастливо!», то я даже не знаю такого формата бумаги, где, будучи растянутым, это предложение бы смотрелось адекватно. Если, наоборот, в строку не умещается одно короткое слово, то можно уменьшить размер пробелов на 33%, чтобы попытаться его уместить, но если не получается, то надо остановиться и смириться. Если Вы автор, можете переписать предложение так, чтобы оно умещалось.
      Не могли бы Вы сказать, в каком справочнике Вы эту рекомендацию увидели?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *