\boldmath 与 unicode-math 和带有 MATH 表的字体

\boldmath 与 unicode-math 和带有 MATH 表的字体

该网站上有几个\boldmath关于unicode-math问题。示例 1下面显示,\boldmath通常不适用于带有 MATH 表的 unicode 字体,除非有特定的粗体版本的数学字体。到目前为止,除了 XITS Math 之外,我还没有找到任何字体的粗体版本;据我所知,Lucida 也有一个,但它不是免费的。如何使用 unicode-math 设置 \boldmath 字体?提供了一个仅适用于 XeLaTeX 的丑陋解决方案。由于我正在使用 LuaLaTeX,所以我正在寻找其他(更漂亮的)东西。

使用 unicode-math 的粗体斜体数学包含使用 unicode 字体使其工作的解决方案没有正确的数学表。该解决方案也适用于字体一个合适的数学表,只要你将数学字体替换为斜体文本字体(见示例 2)。如示例所示,重音符号 ( \hat) 在这种情况下看起来不太好。

因此最好的解决方案是:

  • 普通的非粗体数学符号应使用 TeX Gyre Pagella Math 排版
  • \boldmath数学应该使用粗体斜体文本字体 TeX Gyre Pagella Bold Italic 排版

我尝试过示例 3下面,但在这种情况下,文本和数学字体似乎不能一起工作,因为积分符号和其他一切都会中断。

最后我尝试示例 4玩弄version=bold,但奇怪的是,这使得全部数学粗体。这是一个错误吗?

有人能帮我实现这个功能吗?

% !TeX program=luatex
\documentclass{article}

\usepackage{fontspec,amsmath}

\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}

\usepackage{unicode-math}

\newcommand\mytest{
    \[ \hat f(t) = \int_0^t \hat f'(x)\, dx \]
    {\boldmath \[ \hat f(t) = \int_0^t \hat f'(x)\, dx \]}
}

\begin{document}

Example 1:

\setmathfont{TeX Gyre Pagella Math}

\mytest

Example 2:

\setmathfont{TeX Gyre Pagella Math}

\setmathfont[
   range=\mathit/{latin,Latin,greek,Greek,num},
   BoldFont=TeX Gyre Pagella Bold Italic
]{TeX Gyre Pagella Italic}

\mytest

Example 3:

\setmathfont[BoldFont=TeX Gyre Pagella Bold Italic]{TeX Gyre Pagella Math}

\mytest

Example 4:

\setmathfont{TeX Gyre Pagella Math}
\setmathfont[
     version=bold,
     range=\mathit/{latin,Latin,greek,Greek,num}
]{TeX Gyre Pagella Bold Italic}

\mytest

\end{document}

enter image description here

答案1

嗯,合理的解决方案是设置一个新的数学版本,它应该独立于正常的数学版本。

但在我看来,目前在你的用例中,让这个键发挥作用的机会并不多version。只要只涉及真正的数学字体,它就可以正常工作,但在与range文本字体结合时,它会出现错误,因为一个数学版本会影响另一个数学版本。

目前,我将通过加粗真实数学字体来实现粗体数学版本。在 xelatex 中,这可以使用和来完成FakeBoldversion只要不涉及其他文本字体)。在 lualatex 中,您可以使用 pdfliteral:

\documentclass{article}
\usepackage{fontspec,amsmath}
\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Pagella Math}

\begin{document}

\[ \hat f(t) = \int_0^t \hat f'(x)\, dx \]

\pdfliteral direct {2 Tr 0.2 w} %the second factor is the boldness

\[ \hat f(t) = \int_0^t \hat f'(x)\, dx \]

\pdfliteral direct {0 Tr 0 w}%

\end{document}

enter image description here

答案2

这里有一个解决方案,可以\boldmath按需要让“自动激活粗体斜体数学”。然而,它必然依赖于Ulrike Fischer 提到存在“真正的粗体数学字体”。 (因此,无法使用 TeX Gyre Pagella Math 实现,因为没有 TeX Gyre Pagella Math Bold,正如 egreg 所指出的那样。)

据我所知,目前(2023 年 2 月 2 日)有七种具有粗体数学字体的数学字体:

  1. 开源字体XITSMath(已在评论中提到,包含在标准 TeX 发行版中,并在我的解决方案中使用);
  2. 商业字体小黄人数学(甚至包括四个重量(英文):
  3. 商业字体露西达·布莱特
  4. 开源字体费拉数学(有多达 12 种粗细,但非常规粗细的字形覆盖范围相当不完整);
  5. 开源数学字体(包含在标准 TeX 发行版中,通过kpfonts-otf包裹甚至有四种粗细和一种无衬线版本);
  6. 开源埃瑞璜-马思字体(包含在标准 TeX 发行版中— 粗体字重目前未涵盖常规字重中存在的所有字形,例如,缺少可变大小的分隔符);并且
  7. 开源XCharter-数学字体(包含在标准 TeX 发行版中— 粗体粗细目前未涵盖常规粗细中存在的所有字形,例如,缺少可变大小的分隔符)。
% !TEX program = xelatex


\documentclass{minimal}


\usepackage{ifthen}
\usepackage[svgnames]{xcolor}

\usepackage[
   mathit = sym, mathup = sym, mathbf = sym,
   math-style = ISO, bold-style = ISO
]{unicode-math}

\setmainfont{LinLibertine_R.otf}[
   ItalicFont = LinLibertine_RI.otf,
   BoldFont = LinLibertine_RB.otf,
   BoldItalicFont = LinLibertine_RBI.otf
]
\setmonofont{FiraMono-Medium.otf}[
   Scale = 0.81,
   Color = DarkBlue
]

\setmathfont{XITSMath-Regular.otf}[
   BoldFont = XITSMath-Bold.otf
]
\setmathfont{XITSMath-Regular.otf}[
   version = mathitVersion
]
\setmathfont{XITSMath-Regular.otf}[
   version = mathbfitVersion
]
\setmathfont{XITSMath-Bold.otf}[
   version = boldmathVersion
]

\setmathfont{LinLibertine_R.otf}[
   range = up/{num, latin, Latin, greek, Greek},
   BoldFont = LinLibertine_RB.otf
]
\setmathfont{LinLibertine_RI.otf}[
   range = it/{num, latin, Latin, greek, Greek},
   BoldFont = LinLibertine_RBI.otf,
   NFSSFamily = mathitalic
]
\setmathfont{LinLibertine_RBI.otf}[
   range = bfit/{latin, Latin, greek, Greek},
   NFSSFamily = mathbolditalic
]
\setmathfont{LinLibertine_RB.otf}[
   range = bfup/{num, latin, Latin, greek, Greek}
]

\newif \ifBoldMath \BoldMathfalse
\let \mathversionorig \mathversion
\renewcommand{\mathversion}[1]{%
   \ifthenelse{\equal{#1}{bold}}{%
      \BoldMathtrue%
   }{%
      \BoldMathfalse%
   }%
   \mathversionorig{#1}%
}

\AtBeginDocument{%
   \let \mathitorig \mathit%
   \renewcommand{\mathit}[1]{%
      \ifBoldMath%
         \textbf{%
            \SetSymbolFont{__um_fam1}{boldmathVersion}{TU}{mathbolditalic}{b}{it}%
            \SetSymbolFont{__um_fam2}{boldmathVersion}{TU}{mathbolditalic}{b}{it}%
            \mathversion{boldmathVersion}%
            \(\mathitorig{#1}\)%
         }
      \else%
         \textit{%
            \SetSymbolFont{__um_fam1}{mathitVersion}{TU}{mathitalic}{m}{it}%
            \mathversion{mathitVersion}%
            \(\mathitorig{#1}\)%
         }%
      \fi%
   }%
   \let \mathbfitorig \mathbfit%
   \renewcommand{\mathbfit}[1]{{%
      \textbf{%
          \SetSymbolFont{__um_fam1}{mathbfitVersion}{TU}{mathbolditalic}{b}{it}%
          \mathversion{mathbfitVersion}%
          \(\mathbfitorig{#1}\)%
      }%
   }}%
}

\newcommand{\testUnicodeMath}{%
   \bigskip
   \begin{tabular}{l @{\quad}l @{\quad} l @{\quad} l @{\quad} l}
       Row
       & Math version/alphabet
       & Regular
       & Upright
       & Italic \\[\medskipamount]
       1
       & Text
       & A = 1a
       & \textup{B = 2b}
       & \textit{C = 3c} \\
       2 &
       \texttt{\textbackslash textbf}
       & \textbf{A = 1a}
       & \textbf{\textup{B = 2b}}
       & \textbf{\textit{C = 3c}} \\
       3
       & \texttt{\textbackslash mathversion\{normal\}} (default)
       & $A = 1a + \beta \times \Gamma \int_{-\infty}^{\infty} \frac{\mathup{d}x}{2}$
       & $\mathup{B = 2b + \beta \times \Gamma}$
       & $\mathit{C = 3c + \beta \times \Gamma}$ \\
       4
       & \texttt{\textbackslash mathversion\{bold\}}/\texttt{\textbackslash boldmath}
       & \boldmath $A = 1a + \beta \times \Gamma \int_{-\infty}^{\infty} \frac{\mathup{d}x}{2}$
       & \boldmath $\mathup{B = 2b + \beta \times \Gamma}$
       & \boldmath $\mathit{C = 3c + \beta \times \Gamma}$ \\
       5
       & \texttt{\textbackslash mathbf}/\texttt{\textbackslash mathbfup}/\texttt{\textbackslash mathbfit}
       & $\mathbf{A = 1a + \beta \times \Gamma \int_{-\infty}^{\infty} \frac{\mathup{d}x}{2}}$
       & $\mathbfup{B = 2b + \beta \times \Gamma}$
       & $\mathbfit{C = 3c + \beta \times \Gamma}$ \\
   \end{tabular}%
   \bigskip
   \bigskip
}


\begin{document}

\testUnicodeMath

\textit{Check that everything works properly by invoking it a~second time:}

\testUnicodeMath

\textit{Check that everything works properly by invoking it a~third time:}

\testUnicodeMath

\end{document}

这将产生以下输出 - 请注意,表格行 3-5 中的“3”是斜体,与原始 LaTeX 产生的格式一致\mathit

mathit/mathbfit fixed

我还将这个解决方案发布在不同的线程高斯勒提到

答案3

Unicode 已定义粗体和粗体斜体(及其他)数学字母数字字符,涵盖拉丁字母、希腊字母和数字字符,因此它们已包含在符合标准的 OpenType 数学字体中。

以下是使用粗体范围的示例:

\documentclass{article}
\usepackage{fontspec,amsmath}
\usepackage{unicode-math}
\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
\begin{document}
\[
  \hat f(t) = \int_0^t \hat f'(x)\, dx
\]
\[
  \mathbf{\hat f}(t) = \int_0^t \mathbf{\hat f}'(x)\, dx
\]
\end{document}

enter image description here

几点说明。我记得单原子元素的重音符号存在问题,可以通过在要重音的原子前加上一个空组(例如,\hat{{}f}如果需要的话)来解决。

此外,根据 unicode-math 文档,可以通过配置选项来确定粗体字母是否为斜体bold-style=ISO

答案4

有点巫术,因为这又被推到了头版。该FakeBold=选项适用于数学字体,包括您用 加载的数学字体version=bold

所以:

\documentclass{article}
\usepackage{unicode-math}

\setmainfont[Ligatures=TeX]{TeX Gyre Pagella}
\setmathfont{TeX Gyre Pagella Math}
\setmathfont{TeX Gyre Pagella Math}[
  version=bold,
  FakeBold=1.2 ]

\usepackage{unicode-math}

\newcommand\mytest{
    \[ \hat f(t) = \int_0^t \hat f'(x)\, dx \]
    {\boldmath \[ \hat f(t) = \int_0^t \hat f'(x)\, dx \]}
}

\begin{document}

\mytest

\end{document}

TeX Gyre Pagella sample

相关内容