如何重新定义 \partial 命令来调整字距(按照 Michael Spivak 的建议)?

如何重新定义 \partial 命令来调整字距(按照 Michael Spivak 的建议)?

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 的编辑)。

相关内容