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如果 包含 glue 组件, 似乎会报告零字距\parfillskip,而边距字距调整本身会应用,尽管有 glue 组件。如果设置\parfillskip为 ,则两者都一致0pt

对于具体的规则,我只能推荐你去pdftex来源,其中可跳过的项目在 中定义cp_skipable为:

  • 插入
  • 分数
  • 调整节点
  • 处罚
  • 什么东西(图片除外)
  • 空的自由裁量权
  • 空数学节点
  • 零字距
  • 零粘连(这是实际边距字距和报告的边距字距之间的差异)
  • 空的水平盒子

不幸的是,似乎不再有错误跟踪器pdftex,所以我不知道可以在哪里报告这个问题。

相关内容