LaTeX cord and plug / battery symbols

I have finally revised a price list for motors and turntables, which is available here. What’s notable is its complete awesomeness due to LaTeX typesetting. I decided to indicate the power type (AC or battery) with an icon, but unfortunately a comprehensive search of the “Complete LaTeX symbol list” returned nothing. If they have those ugly and unethical Simpsons’ heads and unnecessary trash, why do they lack power type icon? Let’s rectify that error.

\usepackage{wasysym} % For that \AC command
\newcommand{\cord}{\mbox{% To avoid breaking
\resizebox{1.6em}{0.5em}{% Create a box based on current font size
$\mathrlap{\AC}\lower0.15pt\hbox{\AC}$\hspace{-2pt}% To make it bold
\lower-0.4pt\hbox{\resizebox{6pt}{3pt}{\LEFTCIRCLE}} % Plug
\hspace{-4pt}\lower0.45pt\hbox{\resizebox{3pt}{3pt}{$=$}}}}} % Pins
This yields the following cutie: AC plug symbol for LaTeX

The point is: at any font size, this symbol will not distort. The font size affects only the em dimensions of the resizable box. Its thickness will always be the same.

For battery adorers, there is another solution from me:

\usepackage{xcolor}
\newcommand{\battery}{\mbox{\resizebox{1.5em}{0.5em}{ % The resizable hard box
\rule{12pt}{5pt}\hspace{-0.1pt}\rule[1.5pt]{1.4pt}{2pt}\hspace{-12.2pt}{\color{white}%
\rule[2pt]{3pt}{1pt}\hspace{4.2pt} % Minus, then empty space
\rule[2pt]{3pt}{1pt}\hspace{-2pt}\rule[1pt]{1pt}{3pt} % Plus sign
}}}}
This yields the following hottie: Battery symbol for LaTeX

Красивые формулы в Википедии

Наверняка любой уважающий себя математик загонял кусок своей курсовой, диссертации или лекции в Википедию, аккуратно копировал TeX-код, но при этом некоторые формулы становились текстом. Сравните:

Как есть (некрасиво) Как должно быть (красиво)
α + (β + γ) = (α + β) + γ,

Наличие окружения <math> ни к чему не приводит. Решение? Писать директиву \, (тонкий пробел, thin space) в начале или конце формулы. Даже если сразу после закрывающего тэга </math> идёт какой-то знак, перед которым пробел нежелателен, то можно смело ставить пробел в конце формулы: он обкусится и исчезнет, но математическая мода будет включена. Долой текстовый рендер математических выражений! Долой тэги <sub> и <sup>!

Многоликое многоточие… (часть 2)

Читать первую половину статьи!

В зависимости от вкусов пользователи захотят, чтобы их многоточие было или ýже, или шире, но где-нибудь в пределах двух крайностей, показанных на рисунке выше. Нет ничего проще: создадим специальную команду, которая будет разрежать три точки на некоторое расстояние. Чтобы не мучиться с прописыванием каждого расстояния вручную, для разрядки текста употребим пакет soul (его название происходит от space out и underline — двух главных функций, предоставляемых пакетом: разрядка и подчёркивание). Самые умненькие, пользующиеся юникодом и пишущие в кодировке UTF-8, должны подключить не soul, а soulutf8 (просто, правда?). После подключения проведём настройку разреженности букв:

\usepackage{soulutf8} % те, кто в cp1251 или в ещё более
% глубоком ужасе, пишут \usepackage{soul}
\sodef\so{}{.1em}{1em plus1em}{.3em plus.05em minus.05em}
\newcommand{\ldotst}{\so{...}}
\newcommand{\ldotsq}{\so{?..}}
\newcommand{\ldotse}{\so{!..}}

Экскурс для того, чтобы всё было понятно.
Для начала объясню на пальцах механизм работы пакета soul. После подключения пакет позволяет создавать различные конфигурации разрядки (например, в одном документе, который симулирует набор на печатной машинке, может использоваться несколько конфигурационных макросов), чтобы можно было придумать несколько кратких команд, один раз всё настроить, а потом применять нужную команду там, где хотим использовать нужную конфигурацию разрядки.

Что же конкретно делает этот пакет? Рассмотрим следующие несколько примеров. Условные обозначения: в левой колонке знаки обычного пробела для ясности обозначены знаком подчёркивания (но на самом деле я имел в виду под этим пробел, просто так виднее!). Как говорится, то лев, а не собака; веб-браузер криво отображает знак явного пробела... Далее, значком • (угорь, или комедон) я обозначил межбуквенные пробелы (которые при стандартном наборе отсутствуют и возникают при разрядке), значком ● (карбункул) — внутренний пробел между разрежаемыми словами, значком * (прыщ) — внешний пробел.

Ввод Вывод
1 Барин\so{набрал_в_рот}навозу Баринн•а•б•р•а•л●в●р•о•тнавозу
2 Барин_\so{набрал_в_рот}_навозу Барин*н•а•б•р•а•л●в●р•о•т*навозу
3 Барин_{\so{набрал_в_рот}}_навозу Барин*н•а•б•р•а•л●в●р•о•т*навозу
4 Барин_\null{\so{набрал_в_рот}}{}_навозу Барин_н•а•б•р•а•л●в●р•о•т_навозу

Случай 1: если пропустить внешние пробелы вокруг разрежаемого текста, то их так и не будет в разреженном варианте. Случай 2 — это то, что нам нужно: разреженный текст где-то посреди обычного, причём окружающие его пробелы будут не простыми, а специальными внешними, причём наличие группирующих скобок (случай 3) ни на что не влияет. Чтобы принудить систему выдать не внешний, а обычный пробел, то надо, как в случае 4, создать символ-ничего перед окружением; \kern0pt, \null или любой другой знак сойдут. Пробел после можно нормализовать при помощи \relax или \null.

Синтаксис команды \sodef таков:
\sodef<\команда>{<шрифт>}{<межбуквенный пробел>}{<пробел внутри разрежаемого текста>}{<пробелы извне разрежаемого текста>},
или в терминах наших обозначений:
\sodef<\кмнд>{<шрифт>}{•}{●}{*}.
Пробелы могут задаваться с клеем, то есть с диапазоном плюс-минус, в котором их можно подгонять под наилучшее отображение на строке. По умолчанию стоит одна конфигурация, которая вызывается командой \so и имеет следующие параметры:

\sodef\textso{}{.25em}{.65em\@plus.08em\@minus.06em}{.55em\@plus.275em\@minus.183em}

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

\sodef\so{}{.1em}{1em plus1em}{.3em plus.05em minus.05em}
\newcommand{\ldotst}{\so{...}}
\newcommand{\ldotsq}{\so{?..}}
\newcommand{\ldotse}{\so{!..}}

Естественно, длина интервала должна зависеть от размера шрифта (а не задаваться в пунктах и тем более в миллиметрах!). На мой взгляд, эти значения удовлетворят большинство искушённых пользователей. Желающие могут поиграться с параметрами или задействовать пакет xspace. Зачем? Потому что в текущем виде команду придётся употреблять в тексте так:

\ldotst и тотчас же забылся\ldotst{} Он очнулся в полные сумерки.
\ldotst и тотчас же забылся\ldotst\ Он очнулся в полные сумерки.

Если же к документу подключить пакет xspace, то можно будет сделать так:

\usepackage{xspace}
\newcommand{\ldotst}{\so{...}\xspace}
\ldotst{}и тотчас же забылся\ldotst Он очнулся в полные сумерки.

При этом пробел не будет съеден командой \ldotst.

Возникает незадача с \newcommand{\ldotsq}{\so{?..}\xspace}, так как по-прежнему вопросительный знак выглядит смещённым: расстояние между точками неодинаково. Чтобы восстановить справедливость, вручную сосчитаем, на какую длину нужно вручную сдвинуть вопросительный знак.

Для этого сгенерируем два PDF-файла с одной-единственной командой в самом теле — ldotsq, но по очереди используем в преамбуле две следующие хитрые конструкциями:

Преамбула 1 Преамбула 2
\newcommand{\ldotsq}{\so{?\hbox{\hspace{0em}}..}\xspace} \newcommand{\ldotsq}{\so{?\hbox{\hspace{1em}}..}\xspace}
?.. with 0em box ?.. with 1em box

Естественно, результат будет ужасным. В первом случае из-за наличия коробки \hbox вопросительный знак будет смотреться ещё смещёнее, а второй результат... не пугайтесь, это временная мера. Снимите оба скриншота (желательно, чтобы знаки почти совпадали... началом) и вставьте в свой любимый редактор (Photoshop или Paint сойдут). На кадре, где добавлен 1em горизонтального пространства, правая точка вообще закатилась за правый край скриншота. Теперь возьмём инструмент «прямоугольное выделение» (Rectangular Marquee) и измерим расстояние между краями (например, левыми... или правыми, в зависимости от политических убеждений) левой точки (от вопросительного знака) и центральной (которая первая самостоятельная) в обоих случаях. Вычтем из второго измерения первое. Это мы измерили расстояние в 1em в пикселях (так как в первом случае был сдвиг на 0em, во втором — на 1em). В моём случае вышло, что при таком гигантском разрешении (6400%) один em равен 849 пикселям (если этого нигде не написано, то попробуйте нажать F8 или выбрать отображение панели Window — Info, на которой показывается размер выделения в выставленных в параметрах единицах; в Paint достаточно посмотреть в левый нижний угол, и это верно для Windows 7). Самые умненькие (навроде меня) могли сделать по-другому: поставить режим отображения Darken и провести всего одно измерение. Теперь смотрим на скриншот, на котором расстояние сдвига равно 0em, и измеряем расстояния между первой и второй и между второй и третьей точками. Получилось 501 и 320,5 (так как читающий это уже сам по себе индивидуальность, у него могут получиться совершенно иные цифры). Простая арифметика говорит, что необходимо сократить расстояние между вопросительным знаком и первой точкой на (501-320,5)/849=0,212 долей целого em (больше знаков после запятой добавлять нет смысла из-за погрешности; так, я получал результаты 0,2106, 0,2126 и 0,2133, но человеческий глаз столь тонкой разницы ощутить уже не может).

Выполняем подстановку:

\newcommand{\ldotsq}{\so{?\hbox{\hspace{-.212em}}..}\xspace}

Полученную картинку проверяем в графическом редакторе на вшивость: результаты в 320 и 321 пиксель более чем устраивают (1 пиксель уходит на субпиксельное сглаживание и погрешности), ошибка менее половины процента от ширины буквы M.

?.. after hspace shift

При использовании других размеров или начертаний шрифта или других шрифтов получаются другие результаты. Кроме того, при изменении самого расширения (если нам хочется более плотных или более далеко отстоящих друг от друга точек) надо не забывать включать изменение в команду \ldotsq: если написано не \sodef\so{}{.1em}..., а \sodef\so{}{.15em}... (более широкое многоточие), то в команде \hbox горизонтальный сдвиг должен быть не -.212em, а -.262em.

Использовать \xspace нужно только в том случае, если после многоточия должен обязательно идти пробел. Если не принять никаких дополнительных мер, то тогда станут невозможными конструкции навроде <...> или (Я этого так хочу...), так как после вёрстки пробел будет добавляться автоматически: <... >; (Я этого так хочу... ). Это в корне некорректно. Чтобы этого избежать, необходимо прописать декларацию свободы специальных знаков от пробела (в частности, всевозможных закрывающих) при помощи команды \xspaceaddexceptions. В аргументе команды должны стоять команды или символы, перед которыми необходимо запретить своевольное добавление пробела (при этом ничто не мешает пользователю добавить его вручную).

Итак, истинные аристократы, гурманы и библиофилы, возжелав иметь у себя самое точное и непогрешимо эстетичное многоточие, должны в свою преамбулу включить следующую мантру:

\usepackage{soulutf8,xspace} % у кого не UTF-8, те пишут просто soul
\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}

Comparison of 3 different ellipses

Многоликое многоточие… (часть 1)

Удивительно, но верстальщики так и не пришли к единодушному выводу в вопросе о том, какой знак надо ставить в качестве «точечек» — действительно три точки (...) или один знак, содержащий три точки (…) — можете попробовать выделить в браузере и почувствовать разницу. Давайте посмотрим, как многоточие будет отображаться при использовании различных шрифтов (все картинки кликабельны и отлично смотрятся в высоком разрешении):

Ellipsis in different fonts, Russian

В английском чуть помудрёнее правило, поэтому там после многоточия надо ещё и точку ставить. Для них этот пост был бы намного актуальнее:

Ellipsis in different fonts, English

Как видно, всё зависит от шрифта. В некоторых действительно лучше применять три точки (в Times New Roman единый знак слишком широк, в Tahoma эллипсис слишком мелкий), а в некоторых, особенно моноширинных (предназначенных для консоли и имеющих одинаковую ширину любого знака), лучше пользоваться единым знаком. Но если автор где-нибудь на lib.ru с его Courier New хочет, чтобы издалека было видно, где он задумался, а где писал уверенно, то он выберет три отдельные точки.

Артемий Лебедев пытается надавить на стремление человека к аристократизму (и совершенно правильно), когда пишет:
«
В книгах и других видах благородного набора уместно применение только того многоточия, которое состоит из трех отдельных точек (...).
»
http://www.artlebedev.ru/kovodstvo/sections/164/

Однако многие маститые ЛаТеХнари с ним не согласны. Воронцов, чей учебник 2005 года является лучшим наглядным руководством на русском языке, которое понятно даже новичку, пишет:
«
Многоточие в тексте и формулах набирают не тремя точками, а командой \dots.
Верно: подумал\dots и сказал.
Верно: $i=1,2,\dots,n$.
Неверно: подумал... и сказал.
Неверно: $i=1,2,...,n$.
»
http://www.ccas.ru/voron/download/voron05latex.pdf

Титан ЛаТеХа Львовский ещё в 2003 году утверждал:
«
На пишущей машинке многоточие — это три точки подряд (каждая из которых имеет стандартную ширину буквы). При наборе это не так: для многоточия есть специальная команда \ldots или \dots.
Вместо ‘‘...’’ пишем: нет, что-то здесь не так\ldots
»
http://www.mccme.ru/free-books/llang/newllang.pdf

Кому же верить? Действительно, многоточие в LaTeX выглядит чуть широковато для русской традиции, а три точки, наоборот, кернятся очень близко друг к другу. Сравните:

Ellipsis spacing, Russian

И зачем там только присутствует слово «верно»? В математических выражениях \ldots выглядит просто идеально, но для простого текста оно широковато.

Львовский утверждает, что наличие подключённого пакета amsmath, который нужен любому человеку, который хоть капельку лучше, чем бестолковые гуманитарии, подкладывает свинью и добавляет небольшой горизонтальный отступ после многоточий. Попробуем отключить пакет amsmath и убедимся, что нечего на него пенять, коли команда предназначена для математической моды:

Ellipsis with AMS package on

Ellipsis with AMS package off

Итак, имеем следующую проблему: стандартные три точки выглядят мелко, команда \ldots даёт слишком широкий знак, а в тех текстах, где есть многоточие с вопросительным или восклицательным знаком, получается откровенный косяк: расстояние слишком неравномерно распределено между вопросительным знаком и точками; с ним и с восклицательным знаком непонятно что делать:

Default ?.. with ugly kerning

Что делать? Те, кто работает в MS Word и обладает хоть капелькой самодостоинства, схватятся за голову и печально взвоют от безысходности, но поскольку большинству без разницы, как будет выглядеть их скопипащенный реферат по философии в арбузолитейном ПТУ, я всего лишь вздохну и приведу решение для \(\rm\TeX\), кто хочет, чтобы плоды их собственных стараний выглядели по меньшей мере неотразимо.

Читать вторую половину статьи!

Список с asbuk в LaTeX и enumitem — проблема

Надоело каждый раз писать директиву для того, чтобы убрать громадные отступы в списках в LaTeX?

\let\origenumerate\enumerate
\let\origendenumerate\endenumerate
\renewenvironment{enumerate}{\vspace{-0.3\baselineskip}\origenumerate%
\setlength{\partopsep}{0pt}
\setlength{\topsep}{0pt}
\setlength{\itemsep}{-0.1\baselineskip}
\setlength{\parsep}{0pt}%
}%
{\origendenumerate\vspace{-0.3\baselineskip}}

При желании можно подогнать на свой вкус отрицательный vskip в начале и конце и отрицательный -\baselineskip в \itemsep и назначить им клей plus minus. Но Javier Bezos (Хавьер Бесош, доблестный испанец) написал для нашего облегчения пакет enumitem.

Но при использовании пакета enumitem в документе летят к чёрту так полюбившиеся русскому народу нумерованные кириллицей списки. Так, код

{стандартная преамбула}
\usepackage{enumitem}
\renewcommand{\theenumi}{(\Asbuk{enumi})}
\renewcommand{\labelenumi}{\Asbuk{enumi})}
\begin{document}
\begin{enumerate}
\item Индус пишет программу, которая будет впоследствии
\item использоваться инженерами для планировки застройки города.
\end{enumerate}
\end{document}

вместо желаемого

-----------------
А) Индус пишет программу, которая будет впоследствии
Б) использоваться инженерами для планировки застройки города.
-----------------

выдаст

-----------------
 ) Индус пишет программу, которая будет впоследствии
 ) использоваться инженерами для планировки застройки города.
-----------------

О ужас! Пропала сама нумерация! Enumitem doesn’t work correctly with \asbuk! Я написал отчёт о баге автору. И я дождался ответа! Оказывается, надо было более вдумчиво курить мануалы.

Решение проблемы я подробно описал здесь.

Почему iPad безнравственен и убог

А вот насчёт iPad... Кроме как быть читалкой и свистоперделкой для фильмоманов и попсятников, это исчадье яблочников ни к чему не пригодно. На iOS не пойдёт \(\rm\LaTeX\). А знаете почему? Потому что, видите ли, \(\rm\TeX\) — это Тьюринг-полный язык программирования, который не вписывается в их лицензионное соглашение. Apple — это порочная корпорация, выпускающая однотипный малофункциональный товар, который оттого никогда не падает, что он малофункционален; сей продукт и его потребители напоминают известных амёб, которых обуяла гордыня ввиду того, что они не подвержены воспалению лёгких по причине отсутствия оных. Большинство приложений жрёт много ресурсов, программы вылетают, если их не оптимизировать. В общем, Стив Джобс и егойные приспешники будут сами решать, каким ПО пользоваться их стаду пользователей... при том, что половину iOS написали сторонники свободного софта.

Если убрать праведный гнев, то останется вот что: на iPad \(\rm\LaTeX\)’а нет и не предвидится, а существующие три с половиной редактора уравнений сгодятся лишь для тех людей, кто не в состоянии удосужиться составить силою собственного ума выражений навроде \frac{\sigma^{2 \hat e}}{\sum\limits_i n_i}, не знает греческого алфавита, не помнит акцентов и боится употреблять & для перехода в следующую ячейку матрицы... Мне жаль, читатель, что люди добровольно идут в рабство, упиваясь этим псевдотехнологическим фетишизмом, и покупают портативные якобы компьютеры, на которых не запускается свободное ПО, в том числе и то, которое было написано до появления концепции свободного ПО! Самоуправство некомпетентных сотрудников Apple привело к тому, что было принято невежественное и безнравственное решение — выпустить iPad и iOS и продавать под неё дешёвые и безыскусные программки, которые берут внешним лоском, под которым скрывается убогая архитектура и грубая безвкусица, требующие просвещённого вмешательства в виде запрета на распространение этих коварных и непотребных планшетников.

A rhymed pun on mathematics

What do some fans of mathematics
Give to each other for New Year?
Guess what—they do present some \(\rm\LaTeX\),
Tight-fitting \(\rm\LaTeX\) underwear.

Побороть ошибку 1113 ради LaTeX’а любой ценою

Для имеющих Windows API error 1113 я создал специальную инструкцию.

При установке MIKTEX 2.9 может выскочить жуткая ошибка: Windows API error 1113: Символ Юникода не имеет сопоставления в конечной кодовой странице (Windows API error 1113: No mapping for the Unicode character exists in the target multi-byte code page). При запуске инсталлятора выскакивает чёрт, дальше процесс не идёт. Предупреждаю сразу: будет больно. Привожу руководство для тех, кто сидит под учётной записью суперадмина (built-in administrator), и для простых смертных, которым поставили винду, софта понакидали — и ладно.

Проблема кроется в том, что MIKTEX любит иметь много прав, лезет в Application Data пользовательской или админской папки, но ему мешают нелатинские символы в пути.

Нижеприведённое решение срабатывает для Windows 7/Vista (32- и 64-битные версии).

Для встроенных суперадминистраторов Для бесхитростных пользователей или администраторов
  1. Если вы добавили себе суперадмина, то именем вашего суперадминистратора по умолчанию является «Администратор». Переименование учётной записи не переименует личной папки, находящейся в C:\Users (C:\Пользователи), поэтому придётся переустанавливать винду. Иначе никак!
  2. После переустановки по умолчанию вам предложать создать пользователишку — это всё временно. Нареките его как угодно и продолжайте. Суперадмина не включайте!
  3. Пуск → Панель управления → Администрирование → Управление компьютером → Локальные пользователи → Пользователи.
  4. Сделайте, как на рисунке.

    Не напутайте, потому что есть такое правило: if you have enabled the built-in Administrator account before changing the name, then the C:\Users\Администратор folder will be the default folder name and cannot be changed again without a clean reinstall. Both name will be associated with the account. If you change the built-in Administrator account name before enabling the built-in Administrator account, then the C:\Users(renamed) folder will be the default folder name and cannot be changed again without a clean reinstall.
  5. Заходите в суперадмина, удаляйте старого временного админа.
  6. Ставьте MIKTEX и наслаждайтесь памятью тех времён, когда грешно было не то что пробелы в имени папки ставить — даже длиннее восьми латинских символов нельзя было в имени файла прописать. Расширение — строго три. Школоте не понять! Айподникам и жертвам «яблочной» лоботомии не понять! Кнутом их выпороть, Кнутом! И пропустить через \(\rm\TeX\).
  1. Создайте нового пользователя с именем латиницей. Никакой русоты и кирилличности в буквах. Пробел — расстрел. Акценты, диакритика — в ад.
  2. Зайдите в него и попробуйте из-под него поставить MIKTEX 2.9 (или другой версии). Если не получится, начните с первого пункта левой колонки.