É 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
/ \rpcode
do 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, \rightmarginkern
nem 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 \rightmarginkern
dessa 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 \leftmarginkern
e \rightmarginkern
?
Responder1
Sim, eu diria que isso é um bug no pdftex
. (Parece relacionado aesse bug, que foi corrigido há alguns anos.) Parece que \rightmarginkern
relata um kerning zero se contiver \parfillskip
um componente de cola, enquanto o próprio kerning de margem é aplicado apesar do componente de cola. Ambos concordam se você definir \parfillskip
como 0pt
.
Para as regras exatas, só posso encaminhá-lo para opdftex
fonte, 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 pdftex
mais um rastreador de bugs, então não sei onde isso pode ser relatado.