Каковы точные правила pdfTeX для выступания символов? И для расширений \leftmarginkern/\rightmarginkern?

Каковы точные правила pdfTeX для выступания символов? И для расширений \leftmarginkern/\rightmarginkern?

Хорошо известно, что 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, поэтому я не знаю, куда об этом можно сообщить.

Связанный контент