为什么如果我插入 \hspace{0pt} \widehat 的行为会有所不同?

为什么如果我插入 \hspace{0pt} \widehat 的行为会有所不同?

我收到了一些难以解释的行为\widehat

\documentclass[12pt,a4paper]{文章}
\usepackage{amsfonts}
\开始{文档}
\[
\fbox{$\widehat{\mathcal{C}}$},
\fbox{$\widehat{\hspace{0pt}\mathcal{C}}$},
\fbox{$\widehat{\mathcal{C}\hspace{0pt}}$},
\fbox{$\widehat{\hspace{0pt}\mathcal{C}\hspace{0pt}}$}
\]
\结束{文档}

输出

请注意,帽子在第一种情况下没有对齐,但在其他所有情况下都正确对齐。为什么\hspace{0pt}会有如此大的差异?

另外,我如何才能复制此效果以解决其他对齐问题?目前,我在使用脚本字体的边界框方面​​遇到了麻烦……

答案1

如果您将重音符号放在单个字符上,TeX 会使用字体度量中的信息来移动重音符号,以考虑斜体字母的斜度。这就是第一个字母移动的原因。如果您将重音符号放在更复杂的数学列表上,那么它只会位于列表的中心。

答案2

David Carlisle 解释了为什么\hspace{0pt}会有如此大的差异。我想解释一下如何改变重音符号的行为,\mathcal{C}使它们不会向右偏离太多。事实上,我甚至可以说\mathcal字​​体的字体度量存在错误cmsy10。我的解决方案适用于 UNIX 类型的系统;以下是未打补丁和打补丁后的字体度量的比较。

未打补丁且有路径

我认为右边的修补版本看起来好多了。要生成修补后的字体指标,请在当前 TeX 目录中运行以下 shell 脚本:

for i in 5 6 7 8 9 10
do tftopl $(kpsewhich cmsy$i.tfm) |
     sed '
     /(LABEL O 103)/d
     /(LABEL O 104)/a\ \ \ (LABEL O 103)' > modcmsy$i.pl
   pltotf modcmsy$i.pl
   rm modcmsy$i.pl
done

这将生成 6 个文件modcmsy5.tfmmodcmsy10.tfm(如果您认为重音符号仍然太靠右,请在 shell 脚本中替换104113。)现在 LaTeX 文件

\documentclass[12pt]{article}
\DeclareFontShape{OMS}{cmsy}{m}{n}{%
      <5><6><7><8><9><10>gen*modcmsy%
      <10.95><12><14.4><17.28><20.74><24.88>modcmsy10%
      }{}
\pdfmapline{+modcmsy5 CMSY5 <cmsy5.pfb}
\pdfmapline{+modcmsy6 CMSY6 <cmsy6.pfb}
\pdfmapline{+modcmsy7 CMSY7 <cmsy7.pfb}
\pdfmapline{+modcmsy8 CMSY8 <cmsy8.pfb}
\pdfmapline{+modcmsy9 CMSY9 <cmsy9.pfb}
\pdfmapline{+modcmsy10 CMSY10 <cmsy10.pfb}
\usepackage{amsfonts}
\begin{document}
$\dot{\mathcal C}$ $\tilde{\mathcal C}$ $\widehat{\mathcal C}$
\end{document}

将产生上图右侧部分的输出,并且重音校正将适用于所有字体大小。(谢谢,egreg,告诉我\pdfmapline!) 就我个人而言,我不太喜欢这个\widehat形式amsfonts,所以如果可能的话我还是会省略\usepackage{amsfonts}

未打补丁且有路径

¹简单解释一下:(八进制数!)是字体中103的位置。在原始字体指标中, 上的重音符号向右移动的量与 上的重音符号向右移动的量相同。在修补版本中,它与 上的重音符号相同(以 8 为基数);替代版本对应于。\mathcal{C}\mathcal{C}\mathcal{B}\mathcal{D}104113\mathcal{K}

相关内容