我正在使用该包EBGaramond-Maths
。
此字体缺少以下命令的符号(来自文档):
\leftharpoonup \triangleright \flat \smile
\leftharpoondown \triangleleft \natural \frown
\rightharpoonup \star \sharp \vec
\rightharpoondown \partial \t
加载此包的默认方式(根据文档)是
\usepackage[cmintegrals,cmbraces]{newtxmath}
\usepackage{ebgaramond-maths}
当使用上述缺失的符号时,该包不会在命令中打印任何内容,这是意料之中的。但是,如果我们只使用newtxmath
该ebgaramond-maths
包,则符号会正确生成。因此,我们可以推测newtxmath
有这些符号,但 ebgaramond-maths
没有。
但是,这意味着当ebgaramond-maths
加载时,编译器实际上会“清除”字符映射中ebgaramond-maths
缺少的位置,而不是返回到先前加载的符号。例如,尽管 符号\partial
由包加载newtxmath
,并且在没有 的情况下使用时可以正确显示ebgaramond-maths
,但此后加载后ebgaramond-maths
,该命令不会执行任何操作。
1)为什么会发生这种情况?
2) 如果ebgaramond-maths
只是取消newtxmath
所做的一切,那么之前加载的意义何在newtxmath
?
答案1
欢迎来到 TeX SE!
关键问题是ebgaramond-maths
以下问题
\DeclareSymbolFont{letters} {OML} {EBGaramond-Maths} {m} {it}
这会覆盖现有letters
字体。这将启用字体提供的所有字符以及编码中使用的字符OML
。但是,它通过告诉 LaTeX,每当数学符号使用该letters
字体时,它都应该使用 来实现OML/EBGaramond-Maths/m/it
这一点。因此,无论字体中是否存在该符号,LaTeX 都会这样做。它本质上无法分辨出哪种方式。
为了更清楚地理解这一点,看一下\partial
from的定义会有所帮助fontmath.ltx
:
\DeclareMathSymbol{\partial}{\mathord}{letters}{"40}
这告诉 LaTeX\partial
对应于字体中相关插槽中的字符letters
。因此,在ebgaramond-maths
加载之前,将从当前配置为提供的任何字体letters
(默认情况下为 Computer Modern 或newtxmath
配置为使用的任何字体)中获取此符号。ebgaramond-maths
加载之后,将从当前配置为提供的字体中获取符号letters
。但现在该字体是 EBGaramond-Maths,我们知道它不提供符号。它提供的是一个空插槽 - 一个空白。
加载点newtxmath
是为了它提供的符号其他编码(即不是OML
),因为这些编码比默认编码更能补充 EBGaramond。因此,ebgaramond-maths
不会“抵消”什么newtxmath
作用。相反,它会覆盖一个部分做什么newtxmath
。
事实上,ebgaramond-maths
默认字体中的符号也会被删除。(如果注释掉 loading 行,您仍然可以重现该问题newtxmath
。)
因此顺序如下:
- 默认数学字体由 LaTeX 设置。(特别是,
letters
已定义。) newtxmath
已加载并覆盖大部分数学字体的默认配置。(特别是letters
已重新定义。)ebgaramond-maths
已加载并覆盖数学字体的先前配置的一部分。(特别是,letters
已重新定义。)
还有其他方法,但我认为这是最实用且最不兼容的方法。请参阅我问过这个问题和大卫·卡莱尔的回应这是我做出这一决定的背景。
[我是该软件包的作者。]
重新定义缺失的符号
请注意,您必须在序言中但在加载之后执行此操作ebgaramond-maths
!
如果您尝试使用其中一个缺失符号,该包现在会发出错误。如果您寻求帮助,它会告诉您如何使用命令\re@DeclareMathSymbol
来定义缺失符号newtxmath
。
下面是如何使用letters
from的选项之一执行此操作的示例。这里设置了newtxmath
一种新的数学字体,并使用它定义缺少的符号。是必需的,因为重新声明命令包含符号。ntxletters
\makeatletter...\makeatother
@
\makeatletter
\DeclareSymbolFont{ntxletters}{OML}{ntxmi}{m}{it}
\SetSymbolFont{ntxletters}{bold}{OML}{ntxmi}{b}{it}
\re@DeclareMathSymbol{\leftharpoonup}{\mathrel}{ntxletters}{"28}
\re@DeclareMathSymbol{\leftharpoondown}{\mathrel}{ntxletters}{"29}
\re@DeclareMathSymbol{\rightharpoonup}{\mathrel}{ntxletters}{"2A}
\re@DeclareMathSymbol{\rightharpoondown}{\mathrel}{ntxletters}{"2B}
\re@DeclareMathSymbol{\triangleleft}{\mathbin}{ntxletters}{"2F}
\re@DeclareMathSymbol{\triangleright}{\mathbin}{ntxletters}{"2E}
\re@DeclareMathSymbol{\partial}{\mathord}{ntxletters}{"40}
\re@DeclareMathSymbol{\flat}{\mathord}{ntxletters}{"5B}
\re@DeclareMathSymbol{\natural}{\mathord}{ntxletters}{"5C}
\re@DeclareMathSymbol{\star}{\mathbin}{ntxletters}{"3F}
\re@DeclareMathSymbol{\smile}{\mathrel}{ntxletters}{"5E}
\re@DeclareMathSymbol{\frown}{\mathrel}{ntxletters}{"5F}
\re@DeclareMathSymbol{\sharp}{\mathord}{ntxletters}{"5D}
\re@DeclareMathAccent{\vec}{\mathord}{ntxletters}{"7E}
\makeatother