Многоликое многоточие… (часть 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

Данетки

Cловесные игры, записанные вашим покорным слугой в компьютерном лагере «Факел» в июле 2004 г. со слов некоего «дяди Васи» из его отряда. Транскриптор отлично помнит, что первая данетка была загадана во время купания в пруду, а последние — во время игры в баскетбол на спортивной площадке. Естественно, эти данетки хорошо известны профессионалам, и они не претендуют на новизну. Записаны загадки в хронологическом порядке (как «дядя Вася» их загадывал, в таком порядке они и идут), а сложность обозначена числом звёздочек (от * до ****).

 

Данетка №1. Мужик зашёл в ресторан и заказал стакан воды. Официант приставил к его виску дуло пистолета. Мужик поблагодарил официанта и ушёл из бара. Почему? (*)

 

Данетка №2. Мужик в ресторане заказал мясо альбатроса*, съел кусочек и выбросился из окна. Почему? (****)
* Это не имеет отношения к скетчу Monty Python «Albatross».

 

Данетка №3. Мужику пришла посылка. Он её открыл, увидел дохлую крысу и умер. Почему? (***)

 

Данетка №4. Он сказал ей: «Я тебя люблю», и она умерла. Почему? (**)

 

Данетка №5. Вася зашёл в комнату и увидел своего друга Петю мёртвым на полу. Рядом в лужице воды лежали осколки стекла, а окно было открыто. Как умер Петя? (**)

 

Данетка №6. Посреди пустыни лежит голый мёртвый человек, а у него в руке сломанная спичка. Как он умер? (**)

 

Данетка №7. Семья, переезжая в новый пустой дом, заметила около него пустой грузовик. Зайдя в комнату, члены семьи увидели, что на крюке для люстры повесился мужик. Пол был мокрым. Ни в доме, ни в грузовике не было ни лестниц, ни табуреток, ни каких-либо предметов, по которым можно было бы взобраться на высоту. Как умер мужик? (*)

 

Данетка №8. Клоун пришёл в гримёрную, не увидел опилок и умер. Почему? (***)

 

Данетка №9. Мужик зашёл в комнату, не увидел опилок и застрелился. Почему? (**)

 

Данетка №10. Семья сидит обедает, и это связано с гробом. (****)

The joy of sex… I’m sorry, TeX

«Начинающий с латекса всегда заканчивает кнутом».

Толкование шутки (для простого народа). Человек, который приступает к набору текста в системе LaTeX, рано или поздно заинтересуется тонкостями системы, лежащими в основе макросов. Образованный человек, получив необычное сообщение об ошибке, захочет раскрыть макрокоманду и изучить контрольную последовательность на самом низком уровне, то есть на TeX. А главной книгой по низкоуровневому TeX’у является, как ни странно, «The TeXbook» авторства Д. Э. Кнута, в то время как «The Joy of TeX» ориентировано на набор формул, а не на механизмы и фундамент языка программирования.

Дифференцирование

Если на каком-нибудь фортепианном концерте играют два любых произведения Ференца Листа, то это называется диференцирование. Если исполняются три его произведения, то это уже будет триференцирование.