让 mathfont 尊重周围的家庭

让 mathfont 尊重周围的家庭

如何让数学模式根据周围的文本改变其字体?

我必须使用(pdf)latex。等xelatexluatex在这种情况下不是可行的替代方案。

\documentclass{scrartcl}

\usepackage{lmodern}
%\usepackage{sfmath}
%\usepackage{cmbright}

\newcommand{\test}{%
    \sqrt{(a_1+a_2+\gamma)^2}=\sum_{i=1}^2 a_i + \gamma
}

\begin{document}
Text in roman family and math too $\test$
\begin{equation}
    \sqrt{(a_1+a_2+\gamma)^2}=\sum_{i=1}^2 a_i + \gamma
\end{equation}

\sffamily
Text in sans family and math should be in sans too $\test$
\begin{equation}
    \sqrt{(a_1+a_2+\gamma)^2}=\sum_{i=1}^2 a_i + \gamma
\end{equation}

\normalfont
Back to roman $\test$
\end{document}

我发现了sfmath,但它只改变拉丁字母和数字,并且它只能作为全局设置起作用。cmbright包含或多或少匹配(和工作)的数学字体,但它也会改变文本字体,并且它也只能在全球范围内起作用。

答案1

如果您使用 Latin Modern 或 Computer Modern 字体,则可以切换到 CMBright:

\DeclareMathVersion{sans}
\SetSymbolFont{operators}{sans}{OT1}{cmbr}{m}{n}
\SetSymbolFont{letters}{sans}{OML}{cmbrm}{m}{it}
\SetSymbolFont{symbols}{sans}{OMS}{cmbrs}{m}{n}
\SetMathAlphabet{\mathit}{sans}{OT1}{cmbr}{m}{sl}
\SetMathAlphabet{\mathbf}{sans}{OT1}{cmbr}{bx}{n}
\SetMathAlphabet{\mathtt}{sans}{OT1}{cmtl}{m}{n}
\SetSymbolFont{largesymbols}{sans}{OMX}{iwona}{m}{n}

(以及 Iwona 用于大符号);然后是如下声明

\sffamily\mathversion{sans}

就可以了;它尊重分组,但\normalfont\mathversion{normal}也会恢复正常。

在此处输入图片描述

答案2

这是我根据自己的想法和 egreg 的回答编写的,以使 mathfont 自动更改为 sans 和/或粗体字体。

\documentclass[parskip=half]{scrartcl}

\usepackage[T1]{fontenc}
\usepackage{lmodern}

\DeclareMathVersion{sans}
\SetSymbolFont{operators}{sans}{OT1}{cmbr}{m}{n}
\SetSymbolFont{letters}{sans}{OML}{cmbrm}{m}{it}
\SetSymbolFont{symbols}{sans}{OMS}{cmbrs}{m}{n}
\SetMathAlphabet{\mathit}{sans}{OT1}{cmbr}{m}{sl}
\SetMathAlphabet{\mathbf}{sans}{OT1}{cmbr}{bx}{n}
\SetMathAlphabet{\mathtt}{sans}{OT1}{cmtl}{m}{n}
\SetSymbolFont{largesymbols}{sans}{OMX}{iwona}{m}{n}

\DeclareMathVersion{boldsans}
\SetSymbolFont{operators}{boldsans}{OT1}{cmbr}{b}{n}
\SetSymbolFont{letters}{boldsans}{OML}{cmbrm}{b}{it}
\SetSymbolFont{symbols}{boldsans}{OMS}{cmbrs}{b}{n}
\SetMathAlphabet{\mathit}{boldsans}{OT1}{cmbr}{b}{sl}
\SetMathAlphabet{\mathbf}{boldsans}{OT1}{cmbr}{bx}{n}
\SetMathAlphabet{\mathtt}{boldsans}{OT1}{cmtl}{b}{n}
\SetSymbolFont{largesymbols}{boldsans}{OMX}{iwona}{bx}{n}

\newif\IfInSansMode
\let\oldsf\sffamily
\renewcommand*{\sffamily}{\oldsf\mathversion{sans}\InSansModetrue}
\let\oldmd\mdseries
\renewcommand*{\mdseries}{\oldmd\IfInSansMode\mathversion{sans}\fi\relax}
\let\oldbf\bfseries
\renewcommand*{\bfseries}{\oldbf\IfInSansMode\mathversion{boldsans}\else%
   \mathversion{bold}\fi\relax}
\let\oldnorm\normalfont
\renewcommand*{\normalfont}{\oldnorm\InSansModefalse\mathversion{normal}}
\let\oldrm\rmfamily
\renewcommand*{\rmfamily}{\oldrm\InSansModefalse\mathversion{normal}}

\usepackage[textwidth=9cm]{geometry}

\begin{document}
\section{Inline-$m\alpha \tau h$}
Normal: A $Ax\alpha+\chi b$

\sffamily Sans: A $Ax\alpha+\chi b$

\bfseries Bold-Sans: A $ Ax\alpha+\chi b$

\normalfont Normal: A $ Ax\alpha+\chi b$

\bfseries  Bold: A $ Ax\alpha+\chi b$

\normalfont Normal: A $ Ax\alpha+\chi b$

\section{Display-$\mu\alpha\tau\eta$}
Text in roman family
\begin{equation}
     \sqrt{(a_1+a_2+\gamma)^2}=\sum_{i=1}^2 a_i + \gamma
\end{equation}

\sffamily
Text in sans family
\begin{equation}
    \sqrt{(a_1+a_2+\gamma)^2}=\sum_{i=1}^2 a_i + \gamma
\end{equation}

\sffamily\bfseries
Text in sans family, bold version
\begin{equation}
    \sqrt{(a_1+a_2+\gamma)^2}=\sum_{i=1}^2 a_i + \gamma
\end{equation}

\rmfamily\bfseries
Text in roman family, bold version
\begin{equation}
    \sqrt{(a_1+a_2+\gamma)^2}=\sum_{i=1}^2 a_i + \gamma
\end{equation}
\end{document}

结果

答案3

使用unicode-math,您可以声明一个新的数学版本为

\defaultfontfeatures{Scale = MatchLowercase}
\setmathfont[version=sans]{Fira Math}

然后,您可以切换到它\mathversion{sans}并重新使用其他答案的其余代码,或者定义对应于\boldmath和的命令\boldsymbol

如果您还想要一个粗体无衬线版本,则没有现成的 OpenType 数学字体。截至 2020 年 6 月,唯一的无衬线数学字体是 Fira Math,但唯一的粗体数学字体是 XITS、Libertinus 和 Minion。此外,range=version=不能一起使用,因此您无法将 Libertinus Math Bold 与 Libertinus Serif Bold(Italic)中的字母一起加载。

目前,您可以将 FakeBold 应用于 Fira Math:

 \setmathfont[version=boldsans, FakeBold=1.2]{Fira Math}

如果您想在粗体无衬线标题中使用数学模式,这将非常有用。您可以更改格式,\sffamily\bfseries\mathversion{boldsans}使数学与文本相匹配。

相关内容