Michael Spivak 在他的文章中谈到了这个问题数学字体测验:
(来源文章: https://tug.org/pracjourn/2006-3/distract/mathquizAnswers.pdf)
\partial
在拉丁现代 (以及计算机现代 Unicode) 中,和之间的空格f
太大,而且看起来相当丑陋 (我不知道这是否是字距调整的缺陷,因为\partial f
看起来也很糟糕,但事实并非如此)。我想重新定义,\partial
以便自动更正字距调整。
\makeatletter
\newcommand\kernadjust{\kern -0.12em}
\let\@oldpartial\partial
\renewcommand\partial{\@oldpartial\@ifnextchar f{\kernadjust}{}}
\makeatother
这是我目前得到的结果:我设法纠正\partial
了紧跟在后面的 处的字距f
。但我不知道如何在\partial
与上标/下标一起使用时纠正字距(例如\partial^2 f
或\partial_x f
)\partial^2_{xy} f
。
所以我的问题是:如何\partial
在 LaTeX 中重新定义以实现以下行为:
- 当
\partial
后面紧接着f
,或者 中间有上标/下标时,将 之间的间距减少\kernadjust
(我测试了所有字母,只有 字母f
有这个问题); - 否则,使用默认字距(不执行任何操作)。
比较:
未调整:
已调整:
答案1
Computer Modern 中没有字距调整,Spivak 很可能指的是mathtime
。这里我使用mtpro2
来显示字距调整。
您可以吸收函数名称,计算标准字距并插入。\scriptspace
当有上标时,我也会删除。
然而,如果有下标,则不应进行任何更正。
\documentclass{article}
\usepackage[lite]{mtpro2}
\makeatletter
\NewDocumentCommand{\pdiff}{e{^_}m}{%
\IfValueTF{#2}{% subscript
\partial\IfValueT{#1}{^{#1}}_{#2}#3
}{% no subscript
\IfNoValueTF{#1}{% no superscript
\partial#3%
}{% superscript
{\mathpalette\pdiff@{{#1}{#3}}}%
}%
}%
}
\NewDocumentCommand{\pdiff@}{mm}{\pdiff@@#1#2}
\NewDocumentCommand{\pdiff@@}{mmm}{%
\begingroup
% get the kerning
\sbox\z@{$\m@th#1\partial#3$}%
\sbox\tw@{$\m@th#1{\partial}\kern0pt{#3}$}%
\dimen@=\dimexpr\wd\z@-\wd\tw@-\scriptspace\relax
\partial^{#2}\kern\dimen@#3
\endgroup
}
\makeatother
\begin{document}
$\pdiff{f}$ $\partial f$
$\pdiff^{2}{f}$ $\partial^{2}f$
$\pdiff^{2}_{x} f$ $\partial^2_{x}f$
$\pdiff^{2}_{xy} f$ $\partial^2_{xy}f$
$\pdiff{g}$ $\partial g$
$\pdiff^{2}{g}$ $\partial^{2}g$
$\pdiff^{2}_{x}{g}$ $\partial^{2}_{x}g$
$\pdiff^{2}_{xy}{g}$ $\partial^{2}_{xy}g$
$\scriptstyle \pdiff{f}\pdiff^2{f}$
$\scriptstyle \pdiff{g}\pdiff^2{g}$
\end{document}
代码相同,除了\usepackage[lite]{mtpro2}
产生
答案2
以下是我受@egreg 的回答启发而对拉丁现代(和 CMU)的方法:
\makeatletter
\newcommand\adjustvalue{-2.43mu}
\newcommand\kernadjust{\mkern\adjustvalue}
\let\@oldpartial\partial
\NewDocumentCommand{\pdiff}{e{^_}m}{%
\IfValueTF{#2}{% subscript
\@oldpartial\IfValueT{#1}{^{#1}}_{#2}#3
}{% no subscript
\IfNoValueTF{#1}{% no superscript
\@oldpartial\ifx#3f\kernadjust\fi#3%
}{% superscript
{\mathpalette\pdiff@{{#1}{#3}}}%
}%
}%
}
\NewDocumentCommand{\pdiff@}{mm}{\pdiff@@#1#2}
\NewDocumentCommand{\pdiff@@}{mmm}{\@oldpartial^{#2}\ifx#3f\kernadjust\fi#3}
\renewcommand\partial\pdiff
\makeatother
(注意我将调整值改为 -0.135em(相当于 -2.43mu),我发现这个值比之前的 -0.12em 和 -0.15em 更好)
我选择重新定义\partial
而不是定义新命令,因为我希望它与现有文档兼容(也就是说,我可以将代码粘贴到预先存在的文档中,而无需更改文档的内容)。如果您不想要这种行为,可以删除该\renewcommand\partial\pdiff
行并改用\pdiff
。
以下是比较:
未调整:
已调整:
但是,上面的代码有一些限制:它无法处理\partial
和字母之间的任何内容f
,例如\partial \dot f
(这不会导致正确的字距调整)。我仍在努力,一旦找到解决方案,我就会立即发布它。
编辑:代码已更改为处理上标和下标的情况。字距调整的度量单位已更改为 mu 而不是 em(感谢 @egreg 的编辑)。