## Как сделать коэффициенты со звёздочками уровня значимости в LaTeX’е

In this quick entry, it will be shown how it is possible to format regression output tables in LaTeX and automatically print significance codes (in the form of stars) without any symbols placed a priori.

First of all, one should obtain estimates and standard errors from any statistical package (preferably R, but as long as homicide is considered a crime punishable by incarceration or death, and using SPSS is not, one can use whatever they want—although the author wishes it were the other way about).

Second, one should use regular expressions or any other dark wizardry in order to convert such table into a list of LaTeX control sequences taking two argument each, possible delimited by an ampersand. Here is an example how this can be done by taking raw Excel output (tab-delimited) and running any regex engine on it.

Before:

market	0.0552	0.0055	0.00988	0.00149
ret	-1.974	0.0329	-0.767	0.00993
sls	-1.31	0.36	-0.342	0.128
age	-0.0109	0.0246	-0.00381	0.00663
roa	-0.107	0.107	-0.0733	0.0281
Intercept	-0.586	0.138	-0.165	0.036


Regular expression:

s/([A-Za-z]+)\t([-0-9.]+)\t([0-9.]+)\t([-0-9.]+)\t([0-9.]+)/\1 & \\coef{\2}{\3} & \\coef{\4}{\5} \\\\/g

After:

market & \coef{0.0552}{0.0055} & \coef{0.00988}{0.00149} \\
ret & \coef{-1.974}{0.0329} & \coef{-0.767}{0.00993} \\
sls & \coef{-1.31}{0.36} & \coef{-0.342}{0.128} \\
age & \coef{-0.0109}{0.0246} & \coef{-0.00381}{0.00663} \\
roa & \coef{-0.107}{0.107} & \coef{-0.0733}{0.0281} \\
Intercept & \coef{-0.586}{0.138} & \coef{-0.165}{0.036} \\


Do not be surprised that now there 3 columns, not 5. Suppose one would like to have the standard error placed beneath the coefficient. Then what?

This is the standard preamble.

\documentclass[11pt, a4paper]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{amsmath} \usepackage{microtype} \usepackage{booktabs} \usepackage[british]{babel} \usepackage{fp} \newlength\coeflength \setlength\coeflength{2cm}

Now, it is time to write a command that would typeset a fixed-width box (because all entries in a column have the same width). The basic building block will have 3 arguments: width (optional), estimate (numeric), and standard error (numeric).

\newcommand{\simplestuff}[3][\coeflength]{\parbox[t]{#1}{\hfil$#2$}\parbox[t]{#1}{\hfil$(#3)$}}

Now, the stars. fp package provides facilities to work with fixed-point arithmetic, which is more than enough in our case. Three significance levels—10%, 5%, and 1%—and normal distribution quantiles will be used because this was initially written for applied people in accounting. For asymptotically normal estimators, the critical values can be obtained via the R command qnorm(), e. g. qnorm(1-0.001/2), which should give 3.29 as the critical value for a two-sided t test of significance at 0.1% level.

\newcommand{\coef}[3][\coeflength]{% \FPset\critsss{2.575829}% 0.995 quantile of the standard normal distribution \FPset\critss{1.959964}% 0.975 quantile of the standard normal distribution \FPset\crits{1.644854}% 0.95 quantile of the standard normal distribution \FPset\coefest{#2}% The first argument is the estimate \FPset\coefse{#3}% The second argument is the standard error \FPdiv\zstat{\coefest}{\coefse}% This is the observed t-statistic \FPabs\zabs{\zstat}% This is its absolute value \FPiflt\zabs{\crits}\def\kostyrkastar{\relax}\else% Minimising the risk of overwriting an existing command \FPiflt\zabs{\critss}\def\kostyrkastar{*}\else% \FPiflt\zabs{\critsss}\def\kostyrkastar{**}\else\def\kostyrkastar{***}% \fi% \makebox[#1]{\null\hfill$#2$\kern.1em\rlap{${}^{\kostyrkastar}$}}\makebox[#1]{\null\hfill$(#3)$}% }

Since hard def’s are used for brevity, in order to minimise the chance that the star-drawing command overwrites any existing one, one should consider using their family name or the name of their pet as a command prefix—above is an example of precautiousness rather than hubris.

\setlength{\coeflength}{1.5cm}   Look how stars appear when the absolute value of the $t$ statistic increases.   $\beta_0$ \coef{0.00}{1.0} ($t=0$) \par $\beta_1$ \coef{1.10}{2.2} ($t=0.5$) \par $\beta_2$ \coef{2.00}{2.0} ($t=1$) \par $\beta_3$ \coef{-3.00}{2.0} ($t=-1.5$) \par $\beta_4$ \coef{5.10}{3.0} ($t=1.7$) \par $\beta_5$ \coef{-3.80}{2.0} ($t = -1.9$) \par $\beta_6$ \coef{4.92}{2.5} ($t = 1.968$) \par $\beta_8$ \coef{19.60}{7.0} ($t = 2.8$) \par $\beta_9$ \coef{-800}{8.0} ($t = -100$)

\begin{table}[htbp] \setlength{\coeflength}{2.2cm} \setlength{\tabcolsep}{3pt} \begin{tabular}{lll} \toprule & \null\hfill NCSKEW\hfill\null &\null\hfill DUVOL\hfill\null \\ \midrule Market value & \coef{0.0552}{0.0055} & \coef{0.00988}{0.00149} \\ Return & \coef{-1.974}{0.0329} & \coef{-0.767}{0.00993} \\ Sales & \coef{-1.310}{0.36} & \coef{-0.342}{0.128} \\ Age & \coef{-0.0109}{0.0246} & \coef{-0.00381}{0.00663} \\ ROA & \coef{-0.107}{0.107} & \coef{-0.0733}{0.0281} \\ (Constant) & \coef{-0.586}{0.138} & \coef{-0.165}{0.036} \\ Sector dummies &\null\hfill Yes\hfill\null &\null\hfill Yes\hfill\null \\ Year dummies &\null\hfill Yes\hfill\null &\null\hfill Yes\hfill\null \\ \midrule Observations &\null\hfill 14\,689\hfill\null &\null\hfill 14\,694\hfill\null \\ \bottomrule \multicolumn{3}{l}{\footnotesize Significance codes: * $p<0.10$, ** $p<0.05$, *** $p<0.01$.} \-.5ex] \multicolumn{3}{l}{\footnotesize Cluster-robust (by country) standard errors in brackets.} \\ \end{tabular} \caption{OLS estimates} \end{table} If one is working in particle physics and needs to use sigma levels, one can be more creative with their notation. For example, one might need more markers or vertcial placement. This can be achieved in an instant. \newcommand{\coefnuclear}[3][\coeflength]{% \FPset\coefest{#2}% \FPset\coefse{#3}% \FPdiv\zstat{\coefest}{\coefse}% \FPabs\zabs{\zstat}% \FPiflt\zabs{0.5}\def\mystar{\relax}\else\FPiflt\zabs{1}\def\mystar{.}\else% \FPiflt\zabs{1.5}\def\mystar{*}\else\FPiflt\zabs{2}\def\mystar{*.}\else% \FPiflt\zabs{2.5}\def\mystar{**}\else\FPiflt\zabs{3}\def\mystar{**.}\else% \FPiflt\zabs{3.5}\def\mystar{***}\else\FPiflt\zabs{4}\def\mystar{***.}\else% \FPiflt\zabs{4.5}\def\mystar{****}\else\FPiflt\zabs{5}\def\mystar{****.}\else \def\mystar{\text{Eureka!}}\fi% \parbox[t]{#1}{\hfil#2\kern.1em\rlap{{}^{\mystar}}\\% \null\hfil\scriptsize(#3)} } \begin{table}[htbp] \setlength{\coeflength}{2cm} \setlength{\tabcolsep}{3pt} \begin{tabular}{lllll} \toprule & \null\hfill LHC\hfill\null & \null\hfill Sein\hfill\null & \null\hfill Pectus\hfill\null & \null\hfill Corps-nichons \hfill\null\\ \midrule Experiment 1 & \coefnuclear{4.9908}{1.3099} & \coefnuclear{7.4037}{1.2957} & \coefnuclear{5.6249}{1.3124} & \coefnuclear{1.2275}{1.2893} \\[2ex] Experiment 2 & \coefnuclear{4.3236}{1.2972} & \coefnuclear{10.0386}{1.3176} & \coefnuclear{3.7301}{1.3056} & \coefnuclear{6.7275}{1.2844} \\[2ex] Experiment 3 & \coefnuclear{6.1690}{1.2955} & \coefnuclear{7.9955}{1.2917} & \coefnuclear{1.8410}{1.2883} & \coefnuclear{8.7442}{1.3116} \\[2ex] Experiment 4 & \coefnuclear{0.6228}{1.3083} & \coefnuclear{3.0899}{1.2977} & \coefnuclear{9.3049}{1.3027} & \coefnuclear{2.4693}{1.2962} \\ \bottomrule \multicolumn{3}{l}{\footnotesize Significance codes: {}^* = 1\sigma, {}^. = 0.5\sigma.} \\ \end{tabular} \caption{Trying to uncover Higgs' bosom} \end{table} One can change the placement of \hfill and \null to change the alignment. It is, however, a very delicate matter, and good alignment differs from table to table since sometimes, the decimal separator should serve as the pivot. A good (but rather restrictive in real world) idea would be using the same number of digits for all table entries. Another good example would be using bootstrapped percentile confidence intervals and checking whether zero is inside it or not. One can supply multiple intervals. Making that kind of output is extremely easy if one uses boot package. However, examples of such style in real scientific journals are virtually unseen—because either their typesetters have not read this entry (yet) and are blissfully unaware of this method, or this sort of acrobatics is not deemed æsthetically pleasing or practical. \newcommand{\coefbootci}[4][\coeflength]{% \FPset\coefest{#2}% \FPset\coeflb{#3}% \FPset\coefub{#4}% \parbox[t]{#1}{#2\kern0.5em[#3\hfill% \FPiflt\coeflb{0}\FPifgt\coefub{0}\relax\else**\fi%% \hfill#4]}% } \coefbootci[4cm]{0.034}{-0.01}{0.09} \par \coefbootci[4cm]{3.511}{2.048}{5.194} It is possible to make any formatting aspect adjustable. The last example shows how to make coefficients significant at 5% bold. \newcommand{\coefbold}[2]{% \FPset\coefest{#1}% \FPset\coefse{#2}% \FPdiv\zstat{\coefest}{\coefse}% \FPabs\zabs{\zstat}% \FPiflt\zabs{2}\ensuremath{#1}\else\ensuremath{\mathbf{#1}}\fi% } Virgin insignificant coefficient with t=1.5: \coefbold{4.20}{2.8} \par Chad significant coefficient with t=2.5: \coefbold{6.66}{2.664} P.S. In no way is this entry published in order to promote hacking p-values or abusing the data and/or methodology in order to get a sweet succulent p-value that is less than 0.05. Researchers are encouraged to avoid such filthy terms as ‘a convincing trend towards significance’ and other ones, and honestly provide the results as is, using asymptotic refinement via bootstrap, or empirical-likelihood-based with proper calibration, or, in small samples with limited-value variables, exact values for non-parametric small-sample statistics. ## Советы наборщикам, часть 1 Данный набор советов составлен по прочтении студенческих лекций по математическому анализу, набранных делающим большие успехи в наборном деле Анатолием Евгеньевичем Ширыкаловым. PDF — это аббревиатура (Portable Document Format), поэтому пишется прописными. Если имеется в виду файл с расширением .pdf (расширения регистроНЕзаВиСИмЫ), то можно писать по-разному: pdf-файл, файл PDF, PDF-файл, .pdf-файл, .PDF-файл (хотя последние два варианта смотрятся хуже). Более громоздкие конструкции: файл типа PDF, файл типа .PDF, файл с расширением .PDF/.pdf... Необходимо учитывать, на что ставится акцент: на то, что это тип Portable Document Format с разметкой, открывающийся одинаково везде, или на то, что у файла должно быть расширение .pdf. Топонимы-прилагательные пишутся со строчной буквы: французский, европейский, российский. Исключения — устойчивые имена собственные: Русское собрание, Английская революция. Следует заметить, что, как правило, в составных названиях организаций и событий капитализируется только первая буква: Вторая мировая война, Английская революция, Великая французская революция. Опасно уподобиться англоговорящим и «англопишущим», которые согласно своим правилам всегда географические прилагательные употребляют с заглавной буквы: «I am a Russian typesetter who is an expert in German traditions». Похвально, когда человек читает зарубежную литературу, но если он потом суётся с заморским свиным рылом в пряничный отдел, то, значит, он не только плохой переводчик, но и плохой знаток своего родного языка. (Из доказательства эквивалентности двух формулировок аксиомы Дедекинда.) Пусть $$A,B$$ — любые подмножества $$\mathbb R$$, такие, что $$\forall a\in A,\ \forall b\in B \mspace{11mu} a\leqslant b$$, и пусть $$\tilde B=\{\tilde b\in \mathbb{R}\colon \forall a\in A\ \, a\leqslant\tilde b\}$$, $$\tilde A= \{\tilde a\in \mathbb{R}\colon \exists a\in A\colon a\geqslant \tilde a\}$$. К сожалению, в LaTeX по умолчанию нет пробела, который был бы шире обыкновенного («\ »), но у́же em-space («\quad»). Он был бы очень полезен в конструкциях вида «$$\forall a\in A,\ \forall b\in B \mspace{11mu} a\leqslant b$$». Сравните: • $$\forall a\in A,\ \forall b\in B \ a\leqslant b$$ — слишком узко («\ », равный 1/3em, или 3.33pt для шрифта размером 10 пунктов); • $$\forall a\in A,\ \forall b\in B \mspace{11mu} a\leqslant b$$ — в самый раз («\mspace{11mu}», где 1mu=1/18em); • $$\forall a\in A,\ \forall b\in B \quad a\leqslant b$$ — слишком широко («\quad», где \quad=\hskip1em). Выходит, что обычный пробел равен 6/18em (плюс-минус клей, позволяющий ему принимать значения от 4/18em до 9/18em). Напомню, 18mu=1em. В формулах, где имеется в виду, что «для такого-то условия ↑ то-то равно тому-то», на месте знака ↑ должен быть пробел, позволяющий точно отделить одну группу символов от другой. Это и логично: запись «\forall a\in A,\ \forall b\in B \mspace{11mu} a\leqslant b» сразу становится ясной, так как между однородными условиями должен быть меньший пробел, чем между подчинёнными грамматическими основами. Всем математикам рекомендуется создать краткий макрос или даже переопределить какую-нибудь ерунду вроде «\;», чтобы выдавал пробел шириной 11/18em. 1. Если распространённое/развёрнутое (не помню) определение стоит после определяемого слова, то оно обособляется. Если перед, то нет. Машина, $$\langle$$переехавшая меня$$\rangle$$, скрылась. $$\langle$$Переехвашая меня$$\rangle$$ машина скрылась. 2. Союз «такой ..., что» требует наличия запятой перед «что». Возьмём такой икс, что всем иксам икс! Возьмём такой икс, что все игреки задрожат! NB Если перед однородными членами после обобщающего слова стоит уточняющая конструкция «такие что», то тогда запятая ставится только перед всей конструкцией. Другое дело, что я не могу придумать ни одного примера, чтобы «такие что» было уточняющим словом. «Такие как» — это легко («туристы посетили старинные города, такие как Суздаль, Владимир, Ростов»). «Такие что» — это почти невозможно. 3. Правила 1–2 отлично сочетаются. Я люблю $$\langle$$такой| перчёный соус|, что у окружающих глаза слезятся$$\rangle$$. Я люблю перчёный соус, $$\langle$$такой, что у окружающих глаза слезятся$$\rangle$$. Как проверить, является ли какая-нибудь конструкция вводным словом? Где ставить запятые? Попробовать его выкинуть вместе с окаймляющими запятыми. Если можно это слово выкинуть и вставить, то слово вводное. • Он любит куриное мясо, а значит, и мясо вообще. «А значит» — вводное слово. Проверка: «Он любит куриное мясо и мясо вообще». Смысл не исказился после выбрасывания «, а значит,»? Да почти нет. Всё нормально. Контрпримера не будет. Если где-то написать «, а, значит,», то вводное слово «, значит,» можно будет выкинуть. Союз «а» имеет противительное значение, которое не согласуется с логическим следованием вводного слова «значит». Вывод: «а значит» — одно вводное слово. • Он любит куриное мясо и, следовательно, мясо вообще. «Следовательно» — вводное слово. Перед союзом «и» запятую ставить не нужно. Проверка: «Он любит куриное мясо и мясо вообще». Знаки препинания в редуцированном предложении стоят верно, поэтому можно в него безболезненно встраивать конструкцию «, следовательно,». Будет лучше, если в определениях, сделанных курсивом, не будет переменных, выглядящих так же, как однобуквенные служебные слова ($$a$$, $$c$$, $$o$$, $$u$$, $$y$$). Правда? Это негласное правило, которого в книгах наверняка нет; приходит это правило в голову после того, как человек с первого раза не может прочесть некоторые определения. Почему? Чтобы отличать букву «c» от переменной $$c$$, люди договорились делать переменные курсивом. А если всё курсивом: и текст, и переменные? Надо тогда сделать так, чтобы читатель сразу понял, где переменная, и не использовать двояко читающихся символов. • Пусть $$A\subset\mathbb{R}$$, $$a$$ — наибольший ($$\max$$) элемент $$A$$, если (1) $$a\in A$$; (2) $$\forall \tilde a\in A\mspace{11mu}\tilde a\leqslant a$$. Плохо! • Пусть $$A\subset\mathbb{R}$$; $$a$$ — наибольший ($$\max$$) элемент $$A$$, если (1) $$a\in A$$; (2) $$\forall \tilde a\in A\mspace{11mu}\tilde a\leqslant a$$. Средне! • Пусть $$A\subset\mathbb{R}$$; $$m$$ — наибольший ($$\max$$) элемент $$A$$, если (1) $$m\in A$$; (2) $$\forall \tilde m\in A\mspace{11mu}\tilde m\leqslant m$$. Идеально! Следствие №1: точка с запятой может помочь там, где замена переменных нежелательна. Следствие №2: если есть возможность перестроить предложение во избежание двоякого прочтения, то лучше это сделать. Краткие причастия — одно Н. Краткие прилагательные — два Н. • Девушка ограниченна (прил.), нелюдима и замкнута. • Множество ограничено (прич.: чем-то оно да ограничено), непусто и замкнуто. • Девушка образованна (сама по себе, никто её ни от чего не образовал). • Прямая образована путём перечения двух плоскостей. Совет №1. Если после слова можно подставить «кем/чем?», то это, скорее всего, краткое причастие. Прямая образована... плоскостями. А девушка чем образованна? Ничем, она сама по себе образованна и воспитанна; она не может быть образованна «чем». Совет №2. Смотрите на контекст. • Девушка воспитанна, умна и обаятельна. (Краткое прилагательное.) • Девушка воспитана мачехой. (Краткое причастие.) Три примера корректной расстановки знаков препинания и заглавных/строчных букв в скобках (на основе правил из «Справочника издателя и автора»). 1. То есть $$\exists c\in\mathbb{R}\colon \forall n\in\mathbb{N} \mspace{11mu} c\in[a_n; b_n]$$. (Для интервалов неверно!) 2. То есть $$\exists c\in\mathbb{R}\colon \forall n\in\mathbb{N} \mspace{11mu} c\in[a_n; b_n]$$ (для интервалов неверно). 3. То есть $$\exists c\in\mathbb{R}\colon \forall n\in\mathbb{N} \mspace{11mu} c\in[a_n; b_n]$$ (для интервалов неверно!). Общая идея. Всё выражение в скобках — либо отдельное предложение, которое берут в скобки с завершающим знаком и заглавной буквой, либо часть предложения или оборот, а поэтому пишется со строчной и по настроению завершается либо ничем, либо вопросительным/восклицательным/многоточечным знаком (знаки почти аналогичны оным в прямой речи). 1. Павел подумал. «Вот к чему это приводит!» — наконец воскликнул он. 2. Павел подумал: «Вот к чему это приводит». 3. Павел подумал: «Вот к чему это приводит!» — и сел на стул. Правила постановки запятых при однородных членах. 1. Я люблю яблоки и груши. 2. Я люблю яблоки, бананы и груши. 3. Я люблю и яблоки, и бананы, и груши. 4. Я люблю яблоки, и бананы, и груши. 5. Я люблю яблоки и бананы, груши и сливы. 6. Я люблю яблоки, и бананы, и груши, и сливы. Правило добавления окончаний к числительным в цифровой записи (гадость наподобие «5-й», «5-му» в книгах почти недопустима, однако в математике есть «$$j$$-й» — с ему подобными и приходится работать). 1. Если предпоследняя буква окончания гласная, то после дефиса пишется одна буква (житый → j-й, при десятом → при 10-м, первое → 1-е). 2. Если предпоследняя буква окончания согласная, то после дефиса пишутся две буквы (тринадцатого → 13-го). 3. Три и более букв на конце не имеют права на существование. Нельзя написать «13-ого»! Я скажу: «Кхм, ого, ну и тупицы же нынче набирают тексты!» Если внутри курсивного текста идёт какая-то дробь, то она должны быть прямой. Но если она идёт сразу после курсивной скобки, то она будет торчать, аки ребро торчит на худой корове. Старайся делать так, чтобы в тексте не было выражений навроде этого: «$$\left(\dfrac{1}{\varepsilon};+\infty\right)$$ ($$\dfrac1\varepsilon$$ нужен, чтобы...)». Выглядит косо. Необходимо добавить после скобки хотя бы одно слово, чтобы ещё не было чувства, что текстовую скобку надо было сделать большой (конечно, не надо, но когда я вижу маленькую скобку и вылезающую дробь, то рука начинает подрагивать). Как можно сделать лучше: • ...$$\left(\dfrac{1}{\varepsilon};+\infty\right)$$. $$\dfrac1\varepsilon$$ нужен, чтобы... • ...$$\left(\dfrac{1}{\varepsilon};+\infty\right)$$ (чтобы расстояние от левой границы до нуля сужалось, $$\dfrac1\varepsilon$$ должен быть левой концом интервала). Следствие. Команда \dfrac иногда портит расположение строк, вызывая склеивающиеся конструкции и трудночитаемые нагромождения. Лучше \dfrac во внутристрочных формулах вообще не использовать. Для конструкций вида «я люблю и красный, и белый сорт рыбы» вариант «я люблю и красный, и белый сорта́ рыбы» абсолютно равноправен. Но в приведённом ниже примере присутствует ошибка. • Неправильный вариант. Длина отрезка меньше половины длины окрестности, чтобы $$\Delta n$$ в ней смог колебаться, ведь $$x_0$$ может лежать и в левом, и в правом хвостах $$\Delta n$$. Но почему нельзя написать «может лежать и в левом, и в правом хвостах»? Потому что точка $$x_0$$ лежит только в одном хвосте. Я люблю оба сорта рыбы, все их люблю, поэтому возможно и единственное, и множественное число. Но в данном примере множественное число просто не смотрится из-за нелогичности. Это же не квантовый $$x_0$$, чтобы находиться в двух хвостах одновременно. • Правильный вариант. Длина отрезка меньше половины длины окрестности, чтобы $$\Delta n$$ в ней смог колебаться, ведь $$x_0$$ может лежать и в левом, и в правом хвосте $$\Delta n$$. Прямая «d» в подынтегральных выражениях повсеместно употребляется в зарубежной математической литературе. Я согласен, не всё из зарубежной литературы брать хорошо, свои традиции должны быть везде. Но одно дело — это традиция (пределы интегрирования сверху или сбоку, «меньше или равно» прямое или наклонное, точка или запятая как десятичный разделитель), а другое — это обозначение чего-то, что имеет принципиально другое значение. Так, буква $$d$$ (курсивная) может быть истолкована как переменная. В интеграле её принято называть знаком дифференциала. Но ещё кто-то из великих (Гаусс или такой величины) жаловался, что в математике не хватает обозначений. К счастью, современные типографические средства позволяют набирать громадный диапазон символов. Так что такого особенного с дифференциалом? То, что тонкий пробел «\,» перед ним не всегда заметен, например после скобки. Чтобы пользователь точно знал, что это тот самый магический символ, который завершает запись интеграла, он должен немного отличаться от стандартных переменных. Всему своё лицо: переменные — курсив ($$a=5$$), векторы — курсив со стрелочкой или жирные строчные ($$\vec a = \boldsymbol{a}=\mathbf{a} = \begin{pmatrix}a_1 \\ a_2\end{pmatrix}$$), матрицы — жирные заглавные ($$(\boldsymbol{X}^T\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{Y}$$), поля — двойные ($$\mathbb{N} \subset \mathbb{R}$$), алгебры — каллиграфические ($$\mathcal{A} = \bigl\{ \{a,b\},\{c,d\},\{\Omega\},\varnothing\bigr\}$$), алгебры Ли, векторные пространства и идеалы — фрактурные ($$\mathfrak{A} \mapsto \mathfrak{gl}(\mathfrak{A})$$). А «D» и «d» в дифференциальных выражениях пусть будут прямыми. В СССР не было такого разнообразия латинских шрифтовых касс, чтобы откуда-то что-то брать. Неправильный вариант. $$\displaystyle \frac{{d}I}{{d}t} = f(x_2,t)\frac{{d}x_2}{{d}t} - f(x_1,t)\frac{{d}x_1}{{d}t} + \int\limits_{x_1(t)}^{x_2(t)}\frac{\partial f}{\partial t}{d}x$$. Правильный вариант. $$\displaystyle \frac{\mathrm{d}I}{\mathrm{d}t} = f(x_2,t)\frac{\mathrm{d}x_2}{\mathrm{d}t} - f(x_1,t)\frac{\mathrm{d}x_1}{\mathrm{d}t} + \int\limits_{x_1(t)}^{x_2(t)}\frac{\partial f}{\partial t}\mathrm{d}x$$. Мораль. Если у Демидовича матожидание, вероятность и дисперсия обозначаются прямыми и беззасечечными $$\mathsf{E}$$, $$\mathsf{P}$$ и $$\mathsf{D}$$, а «принадлежит» — длиннющими вилами, то это не значит, что так надо. Необходимо от каждой традиции брать лучшее в плане функциональности, а затем доказывать, что оно лучшее. ## Грамота.ру: так верстают только чудаки На этот сайт молятся любители правописания. Он не раз утешал меня в трудную минуту, и благодаря ему, в частности, я окреп в области русского языка. Но сегодня учитель совершил глупость и пал в моих глазах. Сели в лужу дизайнеры информационного объявления. Такое ощущение, что текст набирали жители Юго-Восточной Азии, не имеющие ни малейшего представления о русской типографике. Взгляните на это объявление: Оставим эти мешающие глазу контрастные тени и забытые точки над «ё» (марку всё же надо поддерживать). Казалось бы, где здесь ошибки? А вот где. Салатовыми цифрами в круглых скобках обозначены ошибки в дизайне, синими буквами в квадратных скобках — ошибки в расстановке знаков препинания (пунктуации). Если за первый род ошибок «грамотеев» следует оштрафовать, то ошибки второго рода не оставляют нам ничего иного, кроме как поместить грешников в газовую камеру. Ошибки в дизайне: (1) Дефисы принято свешивать за линию набора. «БЛАГО» должно располагаться точно над «АКЦИЯ», а дефис должен торчать справа. Но он предательски спихивает буквы перед ним влево, оккупируя бесценную рекламную площадь.  Как надо было сделать | Как получилось | Б Л А Г О- | Б Л А Г О- Т В О Р И Т Е Л Ь Н А Я | Т В О Р И Т Е Л Ь Н А Я А К Ц И Я | А К Ц И Я  Согласитесь, если сверху пять букв и снизу пять букв, то логично их разместить одна над другой, если учесть то, что шрифт кажется моноширинным. (2) Заглавные буквы для удобства чтения принято разрежать. Это относится и к логотипам, потому что ПРОСТО КАПИТАЛИЗИРОВАННАЯ НАДПИСЬ — ЭТО КРИКЛИВОСТЬ, а РАЗРЕЖЕННЫЕ ЗАГЛАВНЫЕ — ЭТО БЛАГОРОДСТВО. (3) Какие-то скользкие и едва ли заметные пробелы вокруг предлога «до». Мне кажется, что после «1400» вообще забыли поставить пробел. (4) Знак номера принято отбивать от предшествующей цифры на полкегля (Мильчин, «Справочник издателя и автора»). Упрощу сказанное: тонкого пробела там не хватает (тонкой шпации). U+2009 в Юникоде. Microsoft уже давно выпустила «Keyboard Layout Creator», позволяющий создать какую угодно раскладку. Можно взять, например, «Типографскую раскладку Ильи Бирмана» и на комбинацию AltGr + Shift + Space повесить этот злосчастный тонкий пробел. Но знаки процента (13 %), номера (№ 8), сокращения вида «т. д. и т. п.» и прочие похожие конструкции требуют именно тонкой шпации! Ошибки в пунктуации: [а] Забыть тире в предложении с именным сказуемым! Расстрел на месте! Больше я вам не доверяю! Итак, 22 ноября. Я прихожу некое место обмена зал (мн. ч., род. п.) номер восемь — например, в дирекцию. Она является местом обмена зал на что-то другое. Например, одну залу № 8 меняют на мороженое. Я им мороженое — они мне залу № 8. Или, может, каждый приходит со своей залой номер восемь и устраивает с кем-то обмен. Но место обмена не указано. Сделка не состоялась: я не знаю, где поменять свою залу номер восемь на что-нибудь более нужное. [б] Двоеточие не отрывается от предшествующего текста пробелом. Такое ощущение, что улитка куда-то летела и по дороге нагадила. Так и лежат эти две точки слева от её хвоста и смущают нас, порядочных читателей. [в] Почему в конце предложений не поставлены точки? Это полноценные предложения. В них есть грамматическая основа. А завершающего знака им не досталось. Наверно, улитка съела и переварить успела. Позор, «Грамота»! Позор! Сдайте своё оружие, грамматические нацисты! Вы провалили эту боевую операцию. P.S. Домашнее задание для умненьких: правомерно ли двоеточие в [б]? Или уместнее было бы употребить тире? ## Многоликое многоточие… (часть 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 разных команд для текстовых многоточий. Только не запутайтесь, пишите удобные макросы. ## The joy of sex… I’m sorry, TeX  «Начинающий с латекса всегда заканчивает кнутом». Толкование шутки (для простого народа). Человек, который приступает к набору текста в системе LaTeX, рано или поздно заинтересуется тонкостями системы, лежащими в основе макросов. Образованный человек, получив необычное сообщение об ошибке, захочет раскрыть макрокоманду и изучить контрольную последовательность на самом низком уровне, то есть на TeX. А главной книгой по низкоуровневому TeX’у является, как ни странно, «The TeXbook» авторства Д. Э. Кнута, в то время как «The Joy of TeX» ориентировано на набор формул, а не на механизмы и фундамент языка программирования. ## Знак рубля в LaTeX (Rouble sign in LaTeX), версия 0.5 Представляется разумным придумать знак рубля, который можно было бы использовать в системе LaTeX. Раз уже написан отдельный пакет для знака евро (eurosym), то не за горами тот момент, когда на основе этого поста будет создан полноценный патех... пакет для знака рубля. Технический нюанс. Высота перекладины должна зависеть от высоты буквы, длина — от длины. Но на то он и TеХ, чтобы быть для этого предназначенным. Поэтому горизонтальное расположение палки будет определяться в em (ширина буквы M), вертикальное — в ex (высота буквы x). При создании символа будем придерживаться здравого смысла. Придумаем гайдлайны на основе существующих графических изображений знака рубля. 1. Знак рубля состоит из буквы «эр» и поперечной палки. 2. Примем, что палка должна быть ближе к верху буквы, чем к низу. 3. Допустим, что палка начинается слева вместе с серифами и кончается справа на половине толщины дуги. 4. Вообразим, будто бы в варианте без серифов низ дуги выходит за ствол на ширину серифа, и так же делает сама палка. 5. Предположим, народ обойдётся шестью начертаниями: обычное, жирное (bold, bf), курсивное (italics, it), жирное курсивное (bold italics, bf+it), а также без засечек (sans serif, sf) и без засечек жирное (sf+bf). 6. Метрика знака рубля должна равняться оной заглавной буквы «Р». 7. Грубая защита от дурака: команда не должна зависеть от текущего начертения шрифта, но должна зависеть от размера. Пользователь должен сам подставить желаемое начертание. \newcommand{\rouble}{{\rm{Р}\kern-.635em\rule[.5ex]{.52em}{.04em}\kern.11em}} \newcommand{\roubleit}{{\it{Р}\kern-.54em\rule[.5ex]{.48em}{.04em}\kern.07em}} \newcommand{\roublebf}{{\bf{Р}\kern-.64em\rule[.4ex]{.51em}{.05em}\kern.13em}} \newcommand{\roublebi}{{\bf{\itshape{Р}\kern-.565em\rule[.4ex]{.48em}{.05em}\kern.08em}}} \newcommand{\roublesf}{{\sf{Р}\kern-.635em\rule[.43ex]{.52em}{.05em}\kern-.52em\rule[.68ex]{.12em}{.05em}\kern.52em}} \newcommand{\roublebs}{{\sf{\textbf{Р}\kern-1.6ex\rule[.35ex]{.58em}{.068em}\kern-.58em\rule[.65ex]{.15em}{.068em}\kern.57em}}} Символ семейства bold sans serif оказался самым глючным, поэтому пришлось двигать горизонтальную черту при помощи вертикальных единиц измерения. Напоминаю, что данный код является грязным хаком, поэтому давайте подождём, когда господин Львовский с присущей ему аутентичностью напишет свой пакет для знака рубля. Может быть, эту благородную задачу возьмёт на себя господин Котельников. ## Мысли по прочтении справочника Петра Коломнина («Краткія свѣдѣнія по типографскому дѣлу», 1899.) Безграмотный и невѣжественный наборщикъ представляетъ явленіе совершенно анормальное. Развѣ не звучитъ смѣшно: «безграмотный наборщикъ»! А между тѣмъ такихъ въ настоящее время большинство. Научныя познанія и развитіе наборщиковъ настолько ничтожны, что ихъ затрудняютъ, при работѣ, самые обыкновенные выраженія и термины, хорошо знакомые каждому гимназисту третьяго класса. Какъ открою какую-нибудь кулинарную книжицу года эдакъ 2009-го, такъ и не терпится срыгнуть отъ вида уродскихъ межбуквенныхъ интерваловъ, чудовищно частых, аки частоколъ, переносовъ и постыднаго и непросвѣщённаго изобилія гарнитуръ, принадлежащихъ разнымъ барышнымъ словолитнямъ! За каждую вывѣску, оформленную шрифтомъ «Bettina Script», необходимо срамной удъ дизайнеру въ ухѣ зашивать стальными нитками — пусть хотя-бы въ его плебейском лексиконѣ слова-окрики «сслышь» и сходное съ нимъ «ссыышь» станут синонимами, ибо надѣлённымъ человѣческими свободами онъ быть не достоинъ! ## Список правил и запретов в LaTeX Многие новички спрашивают друг у друга, как сделать что-то в LaTeX. Беда в том, что они не спрашивают у профессионалов, а придумывают какие-то окольные решения мелких проблем, итогом чего становится возникновение проблем больших! Памятка полному новичку системы LaTeX. Что обязательно нужно: • Соблюдать длинные и короткие тире, дефисы и минусы! Длинное — такое — тире — как в предложениях между словами — пишется так: "--- (кавычка и три дефиса; в преамбуле должен быть подключён пакет babel с опцией russian). Короткое тире (1941–45 гг., 3–8 лет) пишется так: -- . Минус набирается простым дефисом (-) внутри формулы: на улице -3 градуса. Дефис же просто-напросто набирается одним дефисом. • Разделять десятичную дробь запятой (0,5 — так принято в Европе и России), а не точкой (0.5 — так принято в США). Чтобы после запятой не добавлялось пустого пространства, оную необходимо заключать в фигурные скобки: p=0{,}1. • Соблюдать парные кавычки! Внешние — «такие», внутренние — «„такие“». Чтобы получить первые, надо написать так: <<текст>> (два знака больше или меньше, что внизу клавиатуры на латинской раскладке). Внутренние применяются крайне редко, но если вдруг понадобилось, то надо написать так: ,,текст (две запятые и два обратных апострофа, которые в латинской раскладке на нашей букве «ё»). После компиляции они станут аккуратными. • Использовать графику только в формате PNG или PDF. Крайне нежелательно применять JPG ввиду того, что это формат с потерей качества. Рекомендую везде использовать PDF, фотографии и растровую графику сохранять в PNG, вставлять в документ, а затем, если надо, оптимизировать весь готовый файл (например, через Adobe Acrobat). • При компиляции документа использовать только PDFLaTeX. Создавайте документ с учётом его крохотных требований (отсутствие поддержки EPS). Не используйте PDFTeXify. Если неточные номера страниц, запустите PDFLaTeX ещё пару раз. • Делать вертикальные пропуски пустого места стандартными: \par\smallskip, \par\medskip, \par\bigskip соответственно — и по минимуму отсебятины. • Чтобы получить пустое пространство нестандартного размера (оставить пустую строчку или несколько строк, отступить место и прочие синонимы), нужно написать так: \vspace*{XXXem plus PPPem minus MMMem}, где XXX — это желаемое количество пустых строк, PPP — максимальное количество пустого пространства, которое система может добавить к нашим пустым строкам, MMM — максимальное количество пустоты, которое можно отнять у нашего пропуска. На самом деле нам без разницы, 3 строчки будет пустого вертикального пространства или 4 строчки, поэтому пишем так: \vspace*{3.5em plus .6em minus .5em}. Рекомендую давать припуск ±20%. Чего категорически нельзя: • Делать «переход на новую строку» командами \\, \newline и \linebreak. Запрещаю! В системе TeX надо мыслить в терминах абзацев. То есть как мыслили все нормальные люди до 1990-х, пока их не искусили красивенькими компьютерами с кучей туманной структуры. Наборщик выравнивал слова и выражения в строке (избегая переносов), из строк составлял абзац, а затем уже абзацы разносил по страницам (для этого некоторые абзацы он разрезал). Поэтому то, что в Word делает клавиша Enter — создание абзаца, — в LaTeX достигается двумя нажатиями Enter. Пустая строка без символов. Вместо этого можно написать \par. LaTeX составляет страницу из абзацев, поэтому даже если написать \par\par\par\par, а затем оставить десять пустых строк, то ничего страшного не случится, так как пустого абзаца существовать не будет. • Объединять несколько строчных формул в одну, разделяя логические части пробелами. Одноформульные монстры наподобие p=0{,}1,\ t_1=1\,{}^\circ C,\ a_2=10 только ухудшат разбиение текста на строки. Корректно логически и правильно с точки зрения вёрстки каждую формулу прописывать отдельно: p=0{,}1, t_1=1, a_2=10. • Для создания каких-то выделений использовать \paragraph. Это команда рубрикации! Она входит в оглавление, но просто не отображается, так как слишком низкоуровневая. Нужно сделать небольшой пропуск и начать новый раздел с подзаголовком? Пожалуйста: ...конец абзаца. \par\medskip \textbf{Наш подзаголовок}\par. • Использовать графику в формате EPS. Этот формат применялся в старину, но современный PDFLaTeX его не понимает. • Использовать PDFTeXify. Иногда возникают ошибки. Из-за всяких разных вещей. Используйте стандартный и проверенный PDFLaTeX. Примечание для негодующего профессионала, читающего эту заметку. Вот что же мне, новичков пугать всякими \baselineskip? Я прекрасно понимаю, что em — единица измерения, зависящая от шрифта, а \baselineskip — параметр документа, выраженный в каких-то единицах. И никакого профессионального преступления не совершаю. Пусть пишут пока так — меньше проблем будет. ## Список с asbuk в LaTeX и enumitem — решение Полгода назад я написал пост о существующей в пакете для LaTeX enumitem проблеме. Список в формате asbuk или Asbuk не нумеровался. Проблема: When using the enumitem package with [russian]{babel}, I get the ordered lists with no numbering! The following code: % Article class \usepackage{cmap} \usepackage[X2,T2A]{fontenc} % X2 can be dropped \usepackage[utf8]{inputenc} \usepackage[british,russian]{babel} % Bunch of math and table packages \usepackage{enumitem} % Some other packages, not needed for MWE \renewcommand{\theenumi}{(\Asbuk{enumi})} \renewcommand{\labelenumi}{\Asbuk{enumi})} % You know, \asbuk and \Asbuk are defined in Babel \begin{document} \begin{enumerate} \item Изгнание действующей косноязычной верхушки; \item Единоличное собственное воцарение. \end{enumerate} \end{document} instead of the desired output: ----------------- А) Изгнание действующей косноязычной верхушки; Б) Единоличное собственное воцарение. ----------------- will yield: ----------------- ) Изгнание действующей косноязычной верхушки; ) Единоличное собственное воцарение. ----------------- The very numbering has vanished and has been replaced with nothing! Enumitem doesn’t work correctly with \asbuk. When I drop the enumitem package away from the preamble, it renders perfectly. Please fix the incompatibily of the package with cyrillic-letter labeling. Thank you in advance! I am very thankful to monsieur Bezos, who has provided me with an exact reply: Thank you very for your report. Just add the following: \AddEnumerateCounter{\Asbuk}{\@Asbuk}{\CYRM} \AddEnumerateCounter{\asbuk}{\@asbuk}{\cyrm} See the manual for further details (p. 11). Kind Regards Javier I should add that if the document is properly encoded (UTF-8, as praised by Donald Knuth), you can write explicitly: \AddEnumerateCounter{\Asbuk}{\@Asbuk}{Ы} \AddEnumerateCounter{\asbuk}{\@asbuk}{ы} То есть буквы можно писать открыто. Продемонстрирую данную свободу ещё на одном примере: \makeatletter \def\ctext#1{\expandafter\@ctext\csname c@#1\endcsname} \def\@ctext#1{\ifcase#1\or Разз\or Дова\or Дри\or Черте\or Тяпь\or Жесть\or Месь\or Гвоздемь\or Девианть\or Дескать\fi} \makeatother \AddEnumerateCounter{\ctext}{\@ctext}{Гвоздемь} \renewcommand{\theenumi}{(\ctext{enumi})} \renewcommand{\labelenumi}{\ctext{enumi})} %%%% Somewhere in a {document} far-far away \begin{enumerate} \item Индусы; \item Евреи; \item Индусы; \item Евреи; \item Индусы; \item Евреи; \item Индусы; \item Евреи; \item Индусы; \item Евреи. \end{enumerate} Результат превыше всяких похвал (копирую дословно). ----------------- Разз) Индусы; Дова) Евреи; Дри) Индусы; Черте) Евреи; Тяпь) Индусы; Жесть) Евреи; Месь) Индусы; Гвоздемь) Евреи; Девианть) Индусы; Дескать) Евреи. ----------------- ## Как избавиться от подчёркивания изображения-ссылки в CSS Ура, поздравьте меня! Начал работу сайт http://kostyrka.ru, первый работающий раздел — это блог. Данный пост посвящён удалению некоторых свойств ссылок у изображений с границами. В CSS, как известно, есть множество способов оформить изображение. Можно добавить рамку к изображению: img { border: thin solid black; } Можно отрегулировать внешние отступы (margins) и внутренние отступы (padding): img { border: thin solid black; padding: 3px; margins: 3px; } Можно даже назначить данному изображению изображение заднего плана, которое замостит фон (бывает полезным при работе с графикой в формате PNG с альфа-каналом): img { background: url(images/grunge.png) repeat 0 0; border: thin solid black; padding: 3px; margins: 3px; } Можно сделать изображение ссылкой на другое изображение, как это часто бывает с предварительным просмотром: <a title="Крупное фото" href="http://site.ru/foto/large.png"> <img src="http://site.ru/foto/preview.png" alt="Предварительный просмотр" /> </a> И, конечно же, каждый уважающий себя веб-мастер настраивает по-своему ссылки. Принято, чтобы все ссылки были подчёркнуты, но эстетически куда приятнее, если это подчёркивание не так заметно. Поэтому задаётся отдельный цвет каждого состояния ссылки и её подчёркивания: a:link, a:visited { border-bottom: 1px solid; border-color: #e0b2e0; text-decoration: underline; color: red; } a:hover, a:active { border-bottom: 3px solid red; text-decoration: none; color: maroon; } К сожалению, весь груз свойств, который мы понавесили на текстовые ссылки, применяется и к ссылкам-изображениям! И у них появляется гадкое и несвойственное изображениям подчёркивание. Сам автор этого блога боролся с расползшимися по всем рамкам линиям. Первое, что приходит в голову, — написать так: a img { text-decoration: none; border: 0 none; } На что действует эта корректива — на якорь (a) или изображение (img)? На изображение. Данный код убирает с изображения собственную рамку, а не ссылку. Дословно это надо понимать так: всем изображениям, которые могли бы иметь собственное обрамление (border), являясь ссылками, обрамление снять. Текстовое же форматирование (подчёркивание) здесь вообще нигде не присутствует, поскольку оно не применяется к изображению напрямую (в самом деле, попробуйте себе представить жирные изображения, курсивные изображения, изображения, набранные из малых прописных пикселей с разрядкой между символами, — изображения с применёнными к ним текстовыми декларациями). Поэтому, вместо попыток найти и обезвредить подчёркивание ссылок и создание границ, нам нужно модифицировать элементы-якори (ссылки), содержащие изображения. Это разумно — обращаться к внешнему контейнеру. Если содержимое ссылки <a> будет подчёркиваться, то этой директиве начхать на то, что мы творим внутри неё со стилями вложенных объектов. Она просто возьмёт и подчеркнёт. Жаль, что CSS не поддерживает создания селекторов по критериям (qualified selectors). Если бы было наоборот, то мы бы могли выцепить целевое изображение следующим методом: a < img { border: none; } Томимые собственными сладкими грёзами об этом, мы должны искать обходной путь. Первый путь решения проблемы — это воспользоваться присвоением особого «неподчёркнутого» класса всем изображениям, являющимся ссылками: a.image-border { text-decoration: none; border: 0 none; } Это работает, текстовое форматирование уходит со всех изображений-ссылок, принадлежащих данному классу, а сами стили изображения остаются нетронутыми. Это хорошо? Отнюдь, так как требуются колоссальные трудозатраты — перекопать все изображения-ссылки на гигантском сайте. Никому не захочется рыться в базе данных и присваивать класс всем являющимся ссылкой изображениям. К счастью, CSS3 позволяет нам выделять определённые типы ссылок путём сопоставления с образцом и отбора атрибутов. Отбор атрибутов сужает наш круг подозреваемых на «ссыльность» или иные характеристики изображений. Пример критериев отбора: мы хотим присвоить свойства в фигурных скобках объектам, у которых выполняется равенство атрибута такого-то тэга тому-то. Для примера сделаем жёлтый фон только у тех ссылок, которые не подлежат автоматическому переходу, добавим зелёную рамку (буэ-э) изображениям, у которых замещающий текст — «arrow», и всему коду во фрагменте подсветки синтаксиса, который говорит, что он написан на языке perl, сделаем красные буквы. Записывается это короче, чем формулируется: a[rel="nofollow"] { background: yellow; } img[alt="arrow"] { border: green; } pre[class="perl"] { color: red; } В этих примерах выбор атрибутов позволяет отфильтровать объекты с определёнными значениями. Мы можем использовать следующий синтаксис фильтра. Элемент содержит указанный атрибут: element[attribute] У элемента атрибут принимает конкретное значение: element[attribute="value"] У элемента атрибут содержит в значении указанный фрагмент: element[attribute~="valuefragment"] У элемента значение атрибута начинается с указанного фрагмента: element[attribute^="valuebeginning"] У элемента значение атрибута кончается указанным фрагментом: element[attribute="valueending"] У элемента значение атрибута содержит строковое выражение фрагментом: element[attribute*="containsstringvalue"] Подобный функционал проверки соответствия шаблону даён веб-мастеру возможность целиться только в те якори, которые обращаются к определённым типам файлов. Поэтому мы будем использовать синтаксис [атрибут="значение"] и выбирать только те якори, которые ведут на изображения любого типа. Например, чтобы охватить вниманием ряд мелких иконок предварительного просмотра изображений, которые потом открываются полноразмерными PNG, радивый веб-мастер напишет: a[href=png] { text-decoration: none; border: 0 none; } Это приведёт к тому, что у них у всех исчезнут границы и подчёркивания от ссылки. Все ссылки вида http://dirtymess.gov/nav/.../...[abracadabra].../some-image.png утратят текстовые закидоны и лишатся подчёркивающих линий. Мы можем выбирать столько типов изображений, сколько нам угодно. Ограничимся якорями, адресующимся к JPG, PNG и GIF: a[href=jpg], a[href=jpeg], a[href=jpe], a[href=png], a[href=gif] { text-decoration: none; border: 0 none; } Это лучший способ убрать подчёркивание у изображений-ссылок, не копаясь в классах изображения. К сожалению, не всё проходит так гладко, как хотелось бы. Существуют две категории вещей, омрачающих наше ликование: 1. Изображения, которые ссылаются не на выбранные нами типы файлов. 2. Текстовые ссылки, ссылающиеся на выбранные нами типы файлов. В первом случае все ссылки-изображения, на которых мы не навели мушки своих критериев, останутся со всем окружающим их форматированием, например, изображения, ведущие на аудио, видео, веб-страницы, которые довольно трудно отловить в силу сложности запросов, формирующих целевое содержимое. Во втором случае текстовые ссылки, ведущие на картинки, утратят подчёркивание. Наша ищейка ставит знак равенства между всеми типами контейнеров, чьи атрибуты соответствуют её критериям. Поэтому все текстовые ссылки переймут стиль, который предписывает данный поиск. И тут можно применить небольшие латки для образовавшихся прорех. Можно изменить критерии отбора и подвергнуть обесподчёркиванию (или расподчёркиванию?) объекты с другими фрагментами кода в параметрах. Можно отловить только те изображения, которые ведут на определённый сайт или в определённый раздел сайта (содержат определённую папку в пути): a[href*=domain] { text-decoration: none; border: 0 none; } a[href*=directory] { text-decoration: none; border: 0 none; } Данный приём снимет ненужное форматирование с любого объекта-ссылки, ведущего в определённое место сайта. Надеюсь, указанные в данной статье приёмы предоставят дизайнерам возможности более аккуратного контроля над применением стилей, особенно над удаленим свойств якоря с объекта-ссылки. P.S. Самые любознательные могли уже просмотреть исходный код любой страницы блога в качестве иллюстрации и догадаться, доступ к каким объектам я перекрыл ссылочным стилям. ## Имя Константин Как написать имя Константин, если вы математик? How does a mathematician write the name “Constantine”? \[\LARGE\cos(\tan t)\, i_n
$\LARGE\mathrm{const}\, a_n, t\in \qquad \tt (\backslash in)$
$\LARGE\mathrm{const}\, a^n_t,\ i\ne \qquad \tt (\backslash ne)$

## Computer Modern font mismatch

Does someone think LaTeX is cool only due to its aristocratic-looking font? Decided to fool someone by just installing Computer Modern Unicode (to be obtained here) font and making up a dummy in Photoshop, or worse, MS Word? Ahem, I haven’t had new scalps for ages; it’s time to renew my collection. Mark my words, using CMU font does not provide typesetting quality achieved by TeX system.

Typing a text with Computer Modern in Photoshop yields different kerning spaces and accent angles. Can you tell an artificial image from native LaTeX output? Two examples:

Correct answers: LaTeX, Photoshop, Photoshop, LaTeX. Did you notice that the angle between the artifical-letter accent and horizontal line is too acute?

Finally, some grand comparison via superimposition. Original LaTeX output is blue, Photoshop result is pinky, correct juxtaposition is green.

Use no artificial substitutes for this wonderful typesetting engine.

## Первые шаги для самых маленьких

Естественно, под «самыми маленькими» я имею в виду тех пользователей, которые только начинают набирать тексты и не имеют малейшего представления о том, как это делать по-научному.

В тексте не принято красную строку делать пробелами. Новый абзац в вебе обозначается не красной строкой, а увеличенным или двойным межстрочным интервалом. В HTML (языке веб-разметки, на котором работают абсолютно все сайты) принято абзацы делить пустой строкой или тэгами <p>abzats</p>. Если прописана соответствующая настройка (indent), то красная строка будет делаться сама (style="text-indent: 20px"). В Word тоже не надо делать красную строку пробелами! Достаточно один раз по умолчанию поставить отступ первой строки на 1 см и не мучиться. Это эквивалентно параметрам в style.

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

 Текст слева Текст справа — и никаких двойных пробелов!

Нужен отступ от краёв в соотношении два к пяти? Тоже таблица.

 Длинный текст, который занимает несколько строк и не должен вылезать за пределы левого и правого поля, которые определены как 100 и 250 пикселей соответственно, что даёт соотношение 2:5.

Нужна красная строка? Пожалуйста, отступ первой строки абзаца в параметрах.

 Первый абзац, в котором есть отступ в виде красной строки. Это прекрасно видно, потому что последующие строки поднгоняются к левому краю. Ох, что-то мне надоело писать содержательную рыбу, надо писать курсовую, ведь что скажет князь Борис Борисович? А ведь он у себя в блоге писал, что надо уже к июню закончить курсовую, чтобы был запас времени, а я пока не так много сделал. Ухожу к чертям.

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

## A monstrous drawing in LaTeX

I have spent several hours fighting this atrocity and yet have not found an answer. Let's consider this simple symbol:

It must fit well inside a table. Here is what I want to get:

Here is a nice PGF/TikZ picture produced by the code:

\usepackage{tikz} \begin{tikzpicture}[scale=0.028]% \path[use as bounding box] (-0.7,0) rectangle (15.7,10);% Added ±0.7 for nicer inline kerning \draw[line width=0.4pt] (0+5, 5-0.02) .. controls(0+5, 6.5) and (4.5+5, 10) .. (7.02+5, 10);% \draw[line width=0.4pt] (7+5-0.03, 10) .. controls(8.5+5, 10) and (10+5, 10) .. (10+5, 5-0.02);% \draw[line width=0.4pt] (10+5, 5+0.02) .. controls(10+5, 0) and (8.5+5, 0) .. (7+5-0.02, 0);% \draw[line width=0.4pt] (7.03+5, 0) .. controls(4.5+5, 0) and (0+5, 3.5) .. (0+5, 5+0.02);% \draw[line width=0.3pt] (3.6+5, 7.2) .. controls(5.6+5, 8.8) and (10.2+5, 11.1) .. (8.6+5, 2.8);% \draw[line width=0.3pt] (8.3+5, 4.2) -- (8.5+5, 2.4) -- (9.35+5, 3.9);% \draw[dash pattern=on 0.5pt off 0.3pt, line width=0.3pt] (0, 8.5) -- (4.8, 4.55);% \draw[dash pattern=on 0.5pt off 0.3pt, line width=0.3pt] (0, 1.5) -- (4.8, 5.45);% \draw (0.5,5) node {\scalebox{.43}{$\alpha$}}; \end{tikzpicture}

Let’s just name that monster something shorter, e.g. define the whole code from \begin{tikzpicture} to \end{tikzpicture} (including both) as \basemotorpic and try to make some improvements. First, I refined some of the lines and scaled it properly (made it fontsize-dependent):

\newcommand{\basemotorpic}{\resizebox{1.17em}{!}{\begin{tikzpicture}[scale=0.028]% \path[use as bounding box] (-0.7,0) rectangle (15.7,10);% \draw[line width=0.4pt] (0+5, 5-0.02) .. controls(0+5, 6.5) and (4.5+5, 10) .. (7.02+5, 10);% \draw[line width=0.4pt] (7+5-0.03, 10) .. controls(8.5+5, 10) and (10+5, 10) .. (10+5, 5-0.02);% \draw[line width=0.4pt] (10+5, 5+0.02) .. controls(10+5, 0) and (8.5+5, 0) .. (7+5-0.02, 0);% \draw[line width=0.4pt] (7.03+5, 0) .. controls(4.5+5, 0) and (0+5, 3.5) .. (0+5, 5+0.02);% \draw[line width=0.3pt] (3.6+5, 7.2) .. controls(5.6+5, 8.8) and (10.2+5, 11.1) .. (8.6+5, 2.8);% \draw[line width=0.3pt] (8.3+5, 4.2) -- (8.5+5, 2.4) -- (9.35+5, 3.9);% \draw[dash pattern=on 0.5pt off 0.3pt, line width=0.3pt] (0, 8.5) -- (4.8, 4.55);% \draw[dash pattern=on 0.5pt off 0.3pt, line width=0.3pt] (0, 1.5) -- (4.8, 5.45);% \draw (0.5,5) node {\scalebox{.43}{$\alpha$}}; \end{tikzpicture}}}

I have noticed that if one loads a lump of packages (longtable, mathtools, microtype, wasysym and a bunch of other priceless tools) and places the command inside a table, then the symbol is somewhat stuck to the bottom edge of the box and no standart tricks can move it down. However, when I put this devil inside a \frame{...} command, it was stuck to the upper edge of the cell box! WTF?! UPDATE: when I did the same thing two days later, it was always stuck to the upper edge, et il n’avait rien à péter de ce qu’il n’y avait pas de \frame{...} controlseq autour de l’image, as an enraged French would have said. In order to stabilize the behaviour of that wayward hoodlum, I had to confine it within a \frame... that would draw no frame! It was accomplished after I had hacked the latex.ltx file and copied the \frame definition with \hrule’s and \vrule’s removed. Here’s what I got:

\makeatletter \long\def\invisibleframe#1{% \leavevmode \hbox{% \hskip-\@wholewidth \vbox{% \vskip-\@wholewidth \hbox{#1}% \vskip-\@wholewidth}% \hskip-\@wholewidth}} \makeatother

Now let’s combine all these oddities and get a symbol with nice vertical alignment:

\newcommand{\oddmot}{\invisibleframe{\raisebox{-0.05em}{\mbox{\basemotorpic}}\vspace{-0.07em}}}

Aww yeah! Finally!

If needed, play with the resizebox, thicken the lines etc.