我有这个简单的代码,
\documentclass[12pt]{book}
\usepackage{mathtools}
\usepackage{newtxtext}
\usepackage[lite]{mtpro2}
\begin{document}
$d\bar{p}$ and $dt$.
\end{document}
有了这个输出,
我认为它是一个规范的空间,这是由于命令的存在\bar{...}
?有时为了将其恢复,我会插入一个负空间\!
以将其p
移到左侧附近d
。
必须始终进行这个小调整,否则我应该创建一个特定的宏。哪一个可以始终使用相同的命令\bar
?在我看来,更改原始命令有点复杂\bar{...}
。谢谢。
使用 Steven Segletes 的建议\ooalign{$d\bar{#1}$\cr$d#1$}
,我们可以看看这个问题是否普遍存在于 中\bar
。如果叠加产生了一个“粗”的第二个字母,则字距调整不正确。(使用newtxmath
因为 Steven 没有mtpro2
)
不幸的是,事实并非如此,有些情况下字距调整似乎正确,有些情况下则不然:
\documentclass[12pt]{book}
\usepackage{mathtools}
\usepackage{newtxtext}
\usepackage{newtxmath}%instead of \usepackage[lite]{mtpro2}
\newcommand\testkern[1]{%
\ooalign{$d\bar{#1}$\cr$d#1$}}
\textwidth 1in
\begin{document}
\noindent\testkern{a}
\testkern{b}
\testkern{c}
\testkern{d}
\testkern{e}
\testkern{f}
\testkern{g}
\testkern{h}
\testkern{i}
\testkern{j}
\testkern{k}
\testkern{l}
\testkern{m}
\testkern{n}
\testkern{o}
\testkern{p}
\testkern{q}
\testkern{r}
\testkern{s}
\testkern{t}
\testkern{u}
\testkern{v}
\testkern{w}
\testkern{x}
\testkern{y}
\testkern{z}
\end{document}
将通用-1mu
字距应用于\bar
\newcommand\xbar{\mkern-1mu\bar}
\newcommand\testkern[1]{%
\ooalign{$d\xbar{#1}$\cr$d#1$}}
因此,可能会修复一些字母组合,但不可避免地会破坏其他字母组合:
答案1
建议更新命令\bar
如下:
\let\svbar\bar
\renewcommand\bar[1]{%
#1\ThisStyle{\setbox0=\hbox{$\SavedStyle#1$}\kern-\wd0}\svbar{\,\phantom{#1}}\!}
这将确保字母的字距正确,因为它首先设置时没有\bar
。然后,我将字母的字距向后调整,并将 应用于\bar
字母的 的变体\phantom
。在本例中,变体是移位的\phantom
,然后在 之后取消移位\bar
,以免引入任何杂散空格。
因此,如果存在残留的字距调整问题,那么它们将与叠加条相对于底层正确字距调整的字母的位置有关。
MWE 使用\ooalign
问题中给出的测试来判断\bar
宏的质量,使用字母粗细作为字距调整不良的指标。如您所见,没有粗体/加粗字母表示字距不匹配。因此,使用这种方法,人们只需判断横线相对于字母的位置是否合适。
虽然所有示例都是相对于字母“d”显示的,但事实上,无论前面的字母是什么,方法的执行方式都是类似的。
经过编辑,可以适用于各种数学风格。
\documentclass[12pt]{book}
\usepackage{mathtools}
\usepackage{newtxtext}
\usepackage{newtxmath}%instead of \usepackage[lite]{mtpro2}
\usepackage{scalerel}
\let\svbar\bar
\renewcommand\bar[1]{%
#1\ThisStyle{\setbox0=\hbox{$\SavedStyle#1$}\kern-\wd0}\svbar{\,\phantom{#1}}\!}
\newcommand\testkern[2][]{%
\ooalign{$#1 d\bar{#2}$\cr$#1 d#2$}}
\textwidth 1in
\begin{document}
\noindent\testkern{a} \testkern{b} \testkern{c} \testkern{d}
\testkern{e} \testkern{f} \testkern{g} \testkern{h} \testkern{i}
\testkern{j} \testkern{k} \testkern{l} \testkern{m} \testkern{n}
\testkern{o} \testkern{p} \testkern{q} \testkern{r} \testkern{s}
\testkern{t} \testkern{u} \testkern{v} \testkern{w} \testkern{x}
\testkern{y} \testkern{z}
\noindent\testkern[\scriptstyle]{a} \testkern[\scriptstyle]{b}
\testkern[\scriptstyle]{c} \testkern[\scriptstyle]{d}
\testkern[\scriptstyle]{e} \testkern[\scriptstyle]{f}
\testkern[\scriptstyle]{g} \testkern[\scriptstyle]{h}
\testkern[\scriptstyle]{i} \testkern[\scriptstyle]{j}
\testkern[\scriptstyle]{k} \testkern[\scriptstyle]{l}
\testkern[\scriptstyle]{m} \testkern[\scriptstyle]{n}
\testkern[\scriptstyle]{o} \testkern[\scriptstyle]{p}
\testkern[\scriptstyle]{q} \testkern[\scriptstyle]{r}
\testkern[\scriptstyle]{s} \testkern[\scriptstyle]{t}
\testkern[\scriptstyle]{u} \testkern[\scriptstyle]{v}
\testkern[\scriptstyle]{w} \testkern[\scriptstyle]{x}
\testkern[\scriptstyle]{y} \testkern[\scriptstyle]{z}
\noindent$2 d\bar{p}^2\ne2d p^2$
\end{document}
答案2
如果我编译
\documentclass[12pt]{book}
\usepackage{mathtools}
\usepackage{newtxtext}
\usepackage[lite]{mtpro2}
\begin{document}
$d\bar{p}$
$dp$
\showoutput
\end{document}
对于这两个公式,我明白了
....\mathon
....\LMP1/mtt/m/it/12 d
....\kern1.43999
....\vbox(7.88399+2.568)x7.98
.....\hbox(7.88399+0.0)x0.0, shifted 3.312
......\LMP2/mtt/m/n/12 N
.....\kern-5.484
.....\hbox(5.484+2.568)x7.98
......\LMP1/mtt/m/it/12 p
....\mathoff
....\mathon
....\LMP1/mtt/m/it/12 d
....\kern1.43999
....\kern-2.40001
....\LMP1/mtt/m/it/12 p
....\kern0.48
....\mathoff
删除呼叫后mtpro2
,我得到
....\mathon
....\OML/cmm/m/it/12 d
....\vbox(6.77774+2.33331)x5.89717
.....\hbox(6.77774+0.0)x0.0, shifted 0.99028
......\OT1/cmr/m/n/12 ^^V
.....\kern-5.16667
.....\hbox(5.16667+2.33331)x5.89717
......\OML/cmm/m/it/12 p
....\mathoff
....\mathon
....\OML/cmm/m/it/12 d
....\OML/cmm/m/it/12 p
....\mathoff
明显的区别是,d
字体中\LMP1/mtt/m/it/12
(指向)有斜体修正,而字体中(指向)mt2mit at 12pt
没有。\OML/cmm/m/it/12
cmsy10 at 12pt
事实上,如果我这样做tftopl mt2mit
,我会得到
(CHARACTER C d
(CHARWD R 0.551)
(CHARHT R 0.717)
(CHARIC R 0.12)
(COMMENT
(KRN O 0 R -0.06)
[...]
(KRN C p R -0.2)
[...]
(KRN C t R -0.04)
[...]
(KRN O 263 R -0.02)
)
)
我tftopl cmsy10
得到了
(CHARACTER O 100
(CHARWD R 0.611113)
(CHARHT R 0.694445)
)
如您所见,还有带有p
或 的字距调整对t
,当没有重音符号时,它会在字符中移动,但当下一项是 Acc 原子时,这是不可能的。
您可以手动计算适当的字距。
\documentclass[12pt]{book}
\usepackage{mathtools}
\usepackage{newtxtext}
\usepackage[lite]{mtpro2}
\newcommand{\dwithbar}[1]{%
d\computedaccentkern{#1}\bar{#1}%
}
\makeatletter
\newcommand{\computedaccentkern}[1]{%
\mathpalette\computedaccentkern@{#1}%
}
\newcommand{\computedaccentkern@}[2]{%
\begingroup
\sbox\z@{$\m@th#1d#2$}
\sbox\tw@{$\m@th#1d{\kern0pt#2}$}%
\kern\dimexpr\wd\z@-\wd\tw@\relax
\endgroup
}
\makeatother
\begin{document}
$d\bar{p}$ $\scriptstyle d\bar{p}$
$\dwithbar{p}$ $\scriptstyle \dwithbar{p}$
$dp$ $\scriptstyle dp$
$d\bar{t}$ $\scriptstyle d\bar{t}$
$\dwithbar{t}$ $\scriptstyle \dwithbar{t}$
$dt$ $\scriptstyle dt$
\end{document}
您可以对其他口音进行类似的定义,例如\dot
:
\newcommand{\dwithdot}[1]{%
d\computedaccentkern{#1}\dot{#1}%
}
或通用的
\newcommand{\dwithacc}[2]{%
d\computedaccentkern{#2}#1{#2}%
}
被称为\dwithacc\bar{p}
或\dwithacc\dot{p}
。
答案3
这更像是一个评论,但需要一个例子。
Computer Modern 不会出现上述问题,原因是文件中的度量标准不同.tfm
:用于数学的字母表中的“d”没有斜体校正。这是设计使然,因为 Knuth 最常将“d”用于微分算子;如果他将其用作变量,他会在“d”后面添加一个细空格(如果需要)。
这是问题中使用的例子,使用 Computer Modern 设置。
\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}
The differential $d$ as set using Computer Modern: \qquad
$d\bar{p}$ and $dt$.
\end{document}
简而言之,插入的空格(在字母“d”后面有无变音符号时有所不同)是由于“d”的度量定义方式与 Computer Modern 中不同。(当直立的“d”用于微分函数时,这不是问题。)
答案4
这可能是一个中间解决方案,没有宏,使用 diffcoeff
包(我记得该derivative
包 - 参见第 29 页 - 不包含如图所示的差分符号)和选项ISO
选择直立差分符号。
在这种情况下,可以观察到水平间距有所减小。
\documentclass[a4paper,12pt]{article}
\usepackage[lite]{mtpro2}
\usepackage{derivative}
\usepackage[ISO]{diffcoeff}
\begin{document}
\begin{equation}
\frac{d\bar{p}}{dt}, \quad
\diff{\bar{p}}{t} \,
\end{equation}
\end{document}
对于那些想要编译代码但还没有安装的人\usepackage[lite]{mtpro2}
可以用 来替换它。唯一的区别是上面字母\usepackage{newtxmath}
的长度。\bar