重新定义缺失的符号

重新定义缺失的符号

我正在使用该包EBGaramond-Maths

此字体缺少以下命令的符号(来自文档):

\leftharpoonup \triangleright \flat \smile
\leftharpoondown \triangleleft \natural \frown
\rightharpoonup \star \sharp \vec
\rightharpoondown \partial \t

加载此包的默认方式(根据文档)是

 \usepackage[cmintegrals,cmbraces]{newtxmath}
 \usepackage{ebgaramond-maths}

当使用上述缺失的符号时,该包不会在命令中打印任何内容,这是意料之中的。但是,如果我们只使用newtxmathebgaramond-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 都会这样做。它本质上无法分辨出哪种方式。

为了更清楚地理解这一点,看一下\partialfrom的定义会有所帮助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。)

因此顺序如下:

  1. 默认数学字体由 LaTeX 设置。(特别是,letters已定义。)
  2. newtxmath已加载并覆盖大部分数学字体的默认配置。(特别是letters已重新定义。)
  3. ebgaramond-maths已加载并覆盖数学字体的先前配置的一部分。(特别是,letters已重新定义。)

还有其他方法,但我认为这是最实用且最不兼容的方法。请参阅我问过这个问题大卫·卡莱尔的回应这是我做出这一决定的背景。

[我是该软件包的作者。]

重新定义缺失的符号

请注意,您必须在序言中但在加载之后执行此操作ebgaramond-maths

如果您尝试使用其中一个缺失符号,该包现在会发出错误。如果您寻求帮助,它会告诉您如何使用命令\re@DeclareMathSymbol来定义缺失符号newtxmath

下面是如何使用lettersfrom的选项之一执行此操作的示例。这里设置了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

相关内容