根据当前文本字体自动切换数学字体

根据当前文本字体自动切换数学字体

我正在编写文档,并已使用以下方式xelatex设置了文档字体:fontspec

\usepackage{fontspec}
\setmainfont[Mapping=tex-text,Numbers=OldStyle]{Linux Libertine O}
\setsansfont[Mapping=tex-text,Numbers=OldStyle,Scale=MatchLowercase,SmallCapsFont={Linux Biolinum Capitals O}]{Linux Biolinum O}
\setmonofont[Mapping=tex-text,Scale=MatchLowercase]{DejaVu Sans Mono}

在我的文档中,我希望数学字体使用 Linux Libertine 或 Linux Biolinum,具体取决于周围的文本字体是衬线字体还是无衬线字体。例如:

\normalfont This text is Linux Libertine as is the following math: $a^2 + b^2 = c^2$.
\sffamily This text is Linux Biolinum as is the following math: $a^2 + b^2 = c^2$.

以下是我迄今为止尝试过的方法以及我想要解决的问题的组成部分:

  1. 正常的数学文本应该在 Linux Libertine 中设置,而不是在 Computer Modern 中设置。但是,CM 可以作为后备,提供 LL 不提供的任何字形(例如,大符号和运算符,但不是希腊字母)。该mathspec软件包很好地满足了这一要求。

  2. 如果周围的正文设置为无衬线字体(用于表格、图形和标题),那么数学也应该设置为无衬线字体。我希望这能自动完成,但\sfmath如果有必要,我也不介意添加命令(或类似命令)。不幸的是,我不知道如何强制mathspec处理这部分。

需要注意以下几点:

  1. Linux Libertine 和 Linux Biolinum 都没有太多 Unicode 范围内的数学符号。因此,例如,希腊字母应该从希腊字母表块而不是数学希腊字母块中提取。

  2. 我没有使用\mathsf或数学无衬线字母来表示本文档中的任何特殊内容,因此当数学仅以无衬线字体设置以匹配周围的文本时不会产生任何混淆。

我在 TeX.sx 上发现的类似问题似乎与该命令有关pdflatex或使用该\mathsf命令。

答案1

下面的代码虽然不复杂,但是很清晰:

  • 创建两个虚拟字体,它们是您想要的数学无衬线字体和衬线字体的混合体,以便所有字符都在其中。请参阅 topskip 对如何创建虚拟字体的解释,如何创建虚拟字体?

有了这些字体,定义\mathsf就变得很容易了。可以从数学环境之外定义数学字体,例如 Andrew Stacey 所描述的,仅在文档的某些部分更改数学字体?

答案2

如何使用mathastext?以下使用newtx加载libertine和所有数学符号。

\documentclass{article}

\usepackage[no-math]{fontspec}
\usepackage[libertine,osf]{newtx}
\setmonofont{DejaVu Sans Mono}[
Scale=MatchLowercase]
\usepackage[italic]{mathastext}
\Mathastext[roman]
\MTfamily{\sfdefault}
\Mathastext[sans]
\MTfamily{\ttdefault}
\Mathastext[mono]
\newcommand{\swf}[1]{\MTversion{#1}}
\newcommand{\swm}[1]{\MTversion*{#1}}
\begin{document}
\swf{sans} Sans test 123 $\sum f(x)\cdot\frac{x}{yz}+\alpha\beta$

\swf{mono} Mono test 123 $\sum f(x)\cdot\frac{x}{yz}+\alpha\beta$

\swf{roman} Roman test 123 $\sum f(x)\cdot\frac{x}{yz}+\alpha\beta$

Switch only math, but not text:

\swm{sans} Sans math test 123 $\sum f(x)\cdot\frac{x}{yz}+\alpha\beta$

\swm{mono} Mono math test 123 $\sum f(x)\cdot\frac{x}{yz}+\alpha\beta$

\swm{roman} Roman math test 123 $\sum f(x)\cdot\frac{x}{yz}+\alpha\beta$

\end{document}

将 roman 字体改为 sans 字体,再改为 tt 字体

编译后的Lualatex输出看起来更好(间距更好)

lualatex 也一样

相关内容