数学中的字距、连字和斜体校正

数学中的字距、连字和斜体校正

以下示例显示,使用默认的 Computer Modern 字体时,当将其视为数学变量时,'d' 和 'f' 之间存在一些字距调整,'d' 和 'j' 之间存在一些字距调整:

\documentclass{minimal}
\begin{document}
$d f$\quad $d \strut f$\quad $d j$\quad $d \strut j$
\end{document}

使用 CM 字体的数学单字母变量之间的字距调整

但根本不应该有字距调整!首先是出于“理论”原因:字距调整确实应该只发生在同一个单词的字母之间;实际上,这是一种区分多字母变量\mathit{length}和单字母变量乘积的方法。(此外,你可以使用一些负空间来区分函数的无穷小变化G d\mspace{-1.5mu}g和变量的乘积d通过变量G d g,再次利用两个变量相乘后没有字距调整的事实)。

这在实践中也造成了一个问题,因为全部其他字母对没有字距调整!对于非 CM 字体,绝不数学单字母变量之间也没有任何字距调整!

请参阅以下几个示例:

上述现象的说明

所以:

  1. 这是 CM 字体设计人员(或者可能是 LaTeX 程序员)的误解吗,或者这样做有充分的理由吗?
  2. 如何停用数学单字母变量的字距调整,而无需明确插入\strut

提前致谢! :-)

答案1

您可以使用 microtype 删除此编码的连字和字距调整:

\documentclass{article}
\usepackage{microtype}
\DisableLigatures{encoding = OML}
\begin{document}
\loggingoutput
\showoutput
$d f$ \quad $d \strut f$\quad $d j$\quad $d \strut j$
\end{document}

答案2

之间有字距d以及数学模式中的后续字母,因为唐·克努斯认为这是$df$印刷中类似的微分表达式应该出现的方式。他坚持数学出版的长期做法,至少在美国

答案3

barbara beeton 解释了为什么“d”要与以下字母对齐。如果你很挑剔,那就不应该这样,定义你自己的宏:

\documentclass{article}
\usepackage{amsmath}

\newcommand{\diff}{\mathop{}\!d}
\newcommand{\sdiff}{\mathop{}\!d\/}

\begin{document}

\begin{gather}
\diff f=\int_0^1 f(x)\diff x\\
\sdiff f=\int_0^1 f(x)\sdiff x
\end{gather}

\end{document}

您似乎更喜欢\sdiff(您可以随意称呼它)。

在此处输入图片描述

答案4

我忍不住要添加这些细节,以防有人对它们感兴趣。


数学中的字距、连字和斜体校正

是的,TeX即使字体在数学模式下使用,也执行字体的连字程序:附录 G 对此进行了解释电子书(这项工作的一部分最近受到了特别的关注!:-),更准确地说是在规则 14 中。解释这条规则,当相关字符作为一对原子的核出现时,将由两个连续字符形成连字,并在这两个字符之间插入字距,这样就满足了以下所有条件:

  1. 对中的第一个原子是 Ord 类型,第二个原子是以下类型之一:Ord、Op、Bin、Rel、Open、Close、Punct;

  2. 一对原子中的两个原子都没有下标,也没有上标;

  3. 每个原子对中的原子核仅仅是一个符号(在通过数学模式发出获得的诊断描记中,它将显示为某某家族中的某某字符\showlists );

  4. 这两个符号均由取自相同的家庭;

  5. 所讨论的两个原子是数学列表中严格连续的节点,也就是说,没有不是原子的东西(例如,一个 kern 节点,一个 glue 节点,一个 rule 节点,一个 whatsit 节点,一个 style change…) 介入其中。

请注意,条件 4 意味着这两个字符实际上取自同一个字体,因为它们除了来自同一个家族之外,大小也相同,因为样式更改不会干扰;我们称这种字体为字体对

每当找到满足上述条件的一对时,就会发生以下事情:

  1. 将对中第一个原子的原子核中包含的符号标记为“文本符号”,即在决定是否在其后附加斜体校正时应以特殊方式处理的符号;

  2. 如果该对的字体包含由第一个原子的字符和第二个原子的字符形成的连字,则这两个原子将被一个 Ord 原子替换,该原子的原子核包含连字字符,并重复整个过程:TeX 检查这个新原子和列表中的下一个节点是否再次形成满足上述所有条件的对,如果是……(你猜怎么着);

  3. 如果该对字体规定了第一个原子的字符与第二个原子的字符之间的字距,则会在第一个原子之后附加与该字距量对应的字距节点。

从这个描述中可以得出,为了抑制字距调整,在两个原子之间插入“某些东西”是(必要的,也是)足够的,以使 TeX 无法识别这对原子:这可能是空原子,如 ,或零d{}f宽度规则,如d\strut f,或零宽度字距,如d\/f(实际上,在数学模式中\/命令总是插入一个宽度为零的字距,参见TeXbook,第 292 页)。在这三个习语中,最后一个(d\/f)是最有效的。

但需要注意的是,插入这个“某些内容”也会对第一个字符后面的斜体校正产生副作用,如上所述(参见规则 17)。现在,一般来说,在数学模式下,斜体校正与上标的水平放置相互作用,这里无需解释,因为在这里,我们只关心纯粹的“非脚本”符号;在这种情况下,规则归结为以下简单标准:

  • 如果字符属于“数学”字体,则其斜体校正为总是附加到字符本身;

  • 如果该字符不属于“数学”字体,则当且仅当(斜体校正本身不为空)该字符具有时,才会附加其斜体校正不是被标记为“文本符号”(见上文)。

回想一下,“数学”字体是一种参数\fontdimen 2(单词间空间的自然长度)为零的字体:TeX 使用此值来表示用于数学变量的字体。因此,我们看到,对于“非数学”字体,抑制两个字符之间的字距也意味着抑制第一个字符后的斜体校正;当然,这是人们通常想要的,但应该注意的是,这两种效果是结合在一起的,与触发它们的方式无关:在数学中,V{}A产生V\/A完全相同的结果,而在文本中则不会。

下面的小程序可以用来检查上面提到的一些事实:

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\usepackage{mathtools}



\begin{document}

\begingroup

\showboxbreadth = 1000
\showboxdepth = 10
\tracingonline = 1

% Uncomment the "\showlists" commands to see the TeXnical details:
Test:
\(
    dY\ d\/Y\ dZ\ d\/Z\ dj\ d\/j
    % \showlists
\).
% \showlists

\endgroup

About the italic correction:
\[
    \mbox{compare}\quad
    \begin{cases*}
        \mathit{firstA}  +1 & (ligature, no italic correction),\\
        \mathit{f{}irstA}+1 & (no ligature, italic correction added),\\
        \textit{f\/irstA}+1 & (same as preceding case), and\\
        \textit{f{}irstA}+1 & (no ligature, but no italic correction either).
    \end{cases*}
\]
Another example:
\begin{alignat*}{2}
    &\mathit{VA}        && \textit{VA}   \\
    &\mathit{V{}A}      && \textit{V{}A} \\
    &\mathit{V\/A}\quad && \textit{V\/A}
\end{alignat*}
By the way: writing \( d\,x\,dx \) perhaps helps to clarify that the intended 
meaning is ``$d$~times $x$ times the differential of~$x$''.

\end{document}

字距调整cmmi10

确实,该cmmi10字体几乎没有定义字符之间的字距调整对,最值得注意的例外确实是字符d (不过,还定义了其他几个字距调整对,其中大多数与标点符号的正确间距有关)。让我们看看相关 PL 文件中对此字符的描述,即 TFM 文件的人类可读格式:

(CHARACTER C d
   (CHARWD R 0.520488)
   (CHARHT R 0.694445)
   (COMMENT
      (KRN C Y R 0.055555)
      (KRN C Z R -0.055555)
      (KRN C j R -0.111112)
      (KRN C f R -0.166667)
      (KRN O 177 R 0.166672)
      )
   )

cmmi10.tfm回想一下,你可以使用以下命令获取与文件对应的 PL 文件

tftopl cmmi10.tfm cmmi10.pl

这应该会自动从 TEXMF 树中挑选出 TFM 文件,并将 PL 文件保存在当前目录中。我们上面展示的实际上是通过这种方式获得的 PL 文件的摘录;为了方便起见,程序在tftopl每个字符的描述中添加了一个COMMENT列表,该列表总结了以该字符为第一个元素的字距调整对(以及连字符,如果有的话)(字距调整和连字符实际上是在上面的列表中定义的)。我们可以看到,为、 和字符LIGTABLE规定了递减量的负字距调整  ,甚至还有一个字符(fjZY)的积极的指定了字距调整;所有其他字母都采用正常间距。我们还可以看到,斜体校正为零 d,因为不CHARIC存在任何字段。

Barbara Beeton 的回答解释字体作者刻意选择这种设计的原因。


如何抑制字距调整

我想补充几点Ulrike Fischer 的明智回答

  1. 无需禁用全部编码的连字和字距调整OML:只需对以字母“d”开头的那些(如果有的话,连字和)字距进行调整即可;此外,补丁应仅限于该 cmm 系列。只需替换

    \DisableLigatures{encoding = OML}
    

    \DisableLigatures[d]{encoding = OML, family = cmm}
    

    (注意可选参数)。

  2. 原则上,也可以避免加载该microtype包,只需编写几行相对低级的代码即可直接执行禁用;但实现这一点的方法是特定于引擎的,因此我不建议这样做。事实上,使用该 microtype包的优势恰恰在于您不需要担心这种细节。

例如,以下内容适用于 pdfTeX:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc} % compatibility proof

\makeatletter

\newcommand*\@fix@d@kerning@in@math{%
    \tagcode \font `\d \m@ne
    \@font@info{%
        Cleared ligature program of character `d'\MessageBreak
        in font \the\font (\fontname\font)%
    }%
}

% The ensuing declaration will have the desired effect even on preloaded fonts
% because "\DeclarePreloadSizes" makes special provision exactly to this end.
\DeclareFontFamily{OML}{cmm}{%
    \skewchar\font127 % from `omlcmm.fd'
    \@fix@d@kerning@in@math % our patch
}

% Only for tracing purposes:
\newcommand*\ShowLists{%
    \begingroup
        \showboxbreadth \@M
        \showboxdepth   \sixt@@n
        \tracingonline  \@ne
        \showlists
    \endgroup
}

\makeatother



\begin{document}

Test: $d f$ $d\strut f$ $d j$ $d\strut j$.
% \ShowLists

\end{document}

最后,我想说一下,为了避免混淆,当想要表达的意思为“d 乘以 x”时,最好这样写$d\,x$;而且,这与使用的数学字体无关!

相关内容