Хорошо известно, что pdfTeX пытается применить выступ символов хитрым способом. При разбиении горизонтального списка на строки (неявные) керны для выступа символов вставляются около краев каждого из полученных \hbox
'es, на величину кернинга, вычитаемую из \lpcode
/ \rpcode
самого левого/самого правого символа в строке, даже если этот символ скрыт внутри вложенных \hbox
'es или если другие склейки или керны, или даже пустые \hbox
'es, вклиниваются между самим символом и краем строки. С другой стороны, наличие поля отступа подавляет керн "левого поля". Таким образом, мы видим, что выступ символов обходит некоторые типы узлов в горизонтальном списке, но не другие.
Я пытался найти точную спецификацию правил, которые управляют вставкой "маргинальных" кернов, но безуспешно. Я заметил, однако, что правила установки значения,например, \rightmarginkern
не всегда "синхронизированы" с теми, которые используются для вставки таких кернов. Рассмотрим, например, следующий код:
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[protrusion]{microtype} % protrusion option is actually redundant,
% but I want to be safe!
\begin{document}
First of all, \( \verb|\parfillskip| = \mbox{\the\parfillskip} \).
Secondarily, the main font is ``\fontname\the\font'': in this font the
\verb|\rpcode| of the character~``.'' is \the\rpcode\font`. \space and the
\verb|\lpcode| of the character~``('' is \the\lpcode\font`( . % paren match )
Now we typeset a paragraph which, while containing the usual \verb|\parfillskip|
glue, whose value is specified above, ends flush with the right margin because
it contains a \verb|\hfill| command:\hfill
(here!).\special{comment:Do you see the kern?}
(Another example for protrusion into the left margin,\hfill using
parentheses.)\linebreak (We force a left parenthesis at the beginning of a
line.)
\begingroup
% Show that protrusion _is_ applied "through" the \parfillskip glue:
\showboxbreadth = 1000
\showboxdepth = 5
\showlists
% But if we ask for the \rightmarginkern of the last line...
\setbox0 = \vbox{\indent
Now we typeset a paragraph which, while containing the usual \verb|\parfillskip|
glue, whose value is specified above, ends flush with the right margin because
it contains a \verb|\hfill| command:\hfill (here!).\par
\global\setbox1 = \lastbox
}
% (...here it is...)
\showbox1
\endgroup
% ...we don't see any protrusion:
Now, \( \verb|\rightmarginkern1| = \mbox{\rightmarginkern1} \).
\end{document}
Изучение транскрипта, полученного в результате этого примера, показывает, что выступ символаявляетсяприменяется к правому краю последней строки абзаца, начинающегося со слов «Теперь мы набираем...»; тем не менее, когда мы запрашиваем \rightmarginkern
эту строку, 0pt
возвращается.
Может ли это быть ошибкой в pdfTeX? И если нет (если это фича), то каковы, опять же, точные правила настройки \leftmarginkern
и \rightmarginkern
?
решение1
Да, я бы сказал, что это ошибка в pdftex
. (Кажется, это связано сэтот баг, что было исправлено пару лет назад.) Похоже, что \rightmarginkern
сообщает о нулевом кернинге, если \parfillskip
содержит компонент склеивания, в то время как сам кернинг полей применяется, несмотря на компонент склеивания. Оба варианта совпадают, если вы установите \parfillskip
значение 0pt
.
Для получения точных правил я могу только отослать вас кpdftex
источник, где пропускаемые элементы определяются (в cp_skipable
) как:
- вставки
- Метки
- настроить узлы
- штрафы
- что есть (кроме изображений)
- пустые дискреционные полномочия
- пустые математические узлы
- нулевой керн
- ноль склеек (и вот расхождение между фактическим кернингом полей и заявленным кернингом полей)
- пустые hboxes
К сожалению, похоже, что больше нет системы отслеживания ошибок pdftex
, поэтому я не знаю, куда об этом можно сообщить.