为什么 cmsy10.tfm 会给减号赋予正深度?

为什么 cmsy10.tfm 会给减号赋予正深度?

cmsy10.tfm 为减号赋予正深度:

$ tftopl /usr/local/texlive/2019/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm | grep -A4 'CHARACTER O 0'
(CHARACTER O 0
   (CHARWD R 0.777781)
   (CHARHT R 0.583334)
   (CHARDP R 0.083334)  # <- emphasis mine
   )

(减号位于零位置,如下所述:

$ grep 'C 0' /usr/local/texlive/2019/texmf-dist/fonts/afm/public/amsfonts/cm/cmsy10.afm 
C 0 ; WX 777 ; N minus ; B 83 230 694 270 ;

哪里有这个正的深度?减号显然没有下降部分。

这对于 Python 绘图库 matplotlib 来说是个问题,它需要找出某些 tex 构造的基线,以正确对齐 tex 处理的字符串——请参阅https://github.com/matplotlib/matplotlib/issues/6323针对该问题,https://github.com/matplotlib/matplotlib/pull/6333/files对于建议的修复,基本上相当于对此字形进行特殊处理以忽略 tfm 数据。

答案1

这就是减号与加号具有相同高度和深度的原因之一。

\def\nodepthminus{\mathbin{\setbox0=\hbox{$-$}\dp0=0pt\box0}}
\def\noheightminus{%
  \mathbin{%
    \setbox0=\hbox{$-$}%
    \dimen0=\fontdimen22\textfont2
    \advance\dimen0 0.4pt
    \ht0=\dimen0
    \dp0=0pt
    \box0
  }%
}

\setbox0=\hbox{$\displaystyle\sqrt{a+b}$}
\dimen0=\dp0 \advance\dimen0 0.1pt
\def\guide#1{%
  \setbox0=\hbox{$\displaystyle\sqrt{#1}$}
  \dimen0=\dp0 \advance\dimen0 0.1pt
  \hbox to0pt{\vrule width 2in height -\the\dp0 depth \the\dimen0 \hss}%
}

$$
\guide{a+c}\sqrt{a+c}\sqrt{a-c} \sqrt{a\nodepthminus c}\sqrt{a+c}
$$

$$
\guide{+}\sqrt{+}\sqrt{-} \sqrt{\nodepthminus}\sqrt{+}
$$

$$
\guide{+}\sqrt{+}\sqrt{-} \sqrt{\noheightminus}\sqrt{+}
$$

\bye

在此处输入图片描述

差别很小,但很明显。

答案2

我没有检查过,但据我所知,减号的边界框与加号的边界框相同。这确保了$x-z$和等表达式$x+z$同样对齐。

相关内容