pdfTeX の文字突出に関する正確なルールは何ですか? また、\leftmarginkern/\rightmarginkern の拡張についてはどうですか?

pdfTeX の文字突出に関する正確なルールは何ですか? また、\leftmarginkern/\rightmarginkern の拡張についてはどうですか?

pdfTeX が巧妙な方法で文字突出を適用しようとしていることはよく知られています。水平リストを行に分割すると、文字突出用の (暗黙の) カーニングが、行の左端/右端の文字の/\hboxから推定されるカーニング量で、結果の各 'esの端の近くに挿入されます。これは、その文字がネストされた 'es 内に埋め込まれていたり、他のグルーやカーニング、または空の'es が文字自体と行の端の間に介在していたり​​する場合でも同様です。一方、インデント ボックスが存在すると、「左マージン」カーニングが抑制されます。したがって、文字突出は水平リスト内の一部のタイプのノードをバイパスしますが、他のノードはバイパスしません。\lpcode\rpcode\hbox\hbox

私は「マージン」カーンの挿入を規定する規則の正確な仕様を見つけようとしましたが、成功しませんでした。しかし、値を設定する規則は、例えば、 \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}

この例で作成された転写を調べると、文字の突出が「Now we typeset...」で始まる段落の最後の行の右端に適用されます。ただし、\rightmarginkernその行の を要求すると、0ptが返されます。

これは pdfTeX のバグでしょうか? そうでない場合 (機能である場合)、\leftmarginkernと を設定するための正確なルールは何でしょうか\rightmarginkern?

答え1

はい、これは のバグだと思いますpdftex。(これは に関連しているようです)このバグ、これは数年前に修正されました。) は、グルー コンポーネントが含まれている\rightmarginkern場合に 0 カーニングを報告しますが、マージン カーニング自体はグルー コンポーネントに関係なく適用されるようです。を に\parfillskip設定すると、両方とも一致します。\parfillskip0pt

正確なルールについては、pdftexソースここで、スキップ可能な項目はcp_skipable次のように定義されます ( 内)。

  • 挿入
  • マーク
  • ノードを調整する
  • 罰則
  • 何でも(画像以外)
  • 空の裁量権
  • 空の数学ノード
  • ゼロカーン
  • グルーはゼロです(実際のマージンカーニングと報告されたマージンカーニングの間には矛盾があります)
  • 空のhbox

残念ながら、バグトラッカーはもう存在しないようですpdftexので、どこに報告すればよいかわかりません。

関連情報