Quais são as regras exatas do pdfTeX para protrusão de caracteres? E para as expansões de \leftmarginkern/\rightmarginkern?

Quais são as regras exatas do pdfTeX para protrusão de caracteres? E para as expansões de \leftmarginkern/\rightmarginkern?

É bem sabido que o pdfTeX tenta aplicar a protrusão de caracteres de uma forma inteligente. Ao quebrar uma lista horizontal em linhas, kerns (implícitos) para protrusão de caracteres são inseridos perto das bordas de cada um dos \hbox'es resultantes, para uma quantidade de kerning desumida do \lpcode/ \rpcodedo caractere mais à esquerda/à direita na linha, mesmo que isso O caractere está enterrado dentro de \hbox'es aninhados ou se outras colas ou kerns, ou mesmo \hbox'es vazios, intervirem entre o próprio caractere e a borda da linha. A presença da caixa de indentação, por outro lado, inibe o kern da “margem esquerda”. Assim, vemos que a protrusão de caracteres ignora alguns tipos de nós em uma lista horizontal, mas não outros.

Tentei encontrar uma especificação exata das regras que regem a inserção de kerns de "margem", mas sem sucesso. Notei, no entanto, que as regras para fixação do valor de,por exemplo, \rightmarginkernnem sempre estão "sincronizados" com aqueles para a inserção de tais núcleos. Considere, por exemplo, o seguinte código:

\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}

O exame da transcrição produzida por este exemplo mostra que a protrusão de caractereséaplicado na borda direita da última linha do parágrafo que começa com "Agora digitamos..."; no entanto, quando solicitamos o \rightmarginkerndessa linha, 0pté retornado.

Isso poderia ser um bug no pdfTeX? E se não for (se for um recurso), quais são, novamente, as regras exatas para definir \leftmarginkerne \rightmarginkern?

Responder1

Sim, eu diria que isso é um bug no pdftex. (Parece relacionado aesse bug, que foi corrigido há alguns anos.) Parece que \rightmarginkernrelata um kerning zero se contiver \parfillskipum componente de cola, enquanto o próprio kerning de margem é aplicado apesar do componente de cola. Ambos concordam se você definir \parfillskipcomo 0pt.

Para as regras exatas, só posso encaminhá-lo para opdftexfonte, onde os itens ignoráveis ​​são definidos (em cp_skipable) como:

  • inserções
  • marcas
  • ajustar nós
  • penalidades
  • Whatsits (exceto imagens)
  • discricionários vazios
  • nós matemáticos vazios
  • zero núcleos
  • zero colas (e aqui está a discrepância entre o kerning de margem real e o kerning de margem relatado)
  • caixas vazias

Infelizmente, parece não haver pdftexmais um rastreador de bugs, então não sei onde isso pode ser relatado.

informação relacionada