Это последняя из трёх статей, в которых обрисовывается проблематика знака многоточия в типографике и предлагается способ набирать хорошо выровненные многоточия в системе LaTeX.

Читать часть 1
Читать часть 2

Спустя некоторое время, а именно 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