如何让数学模式根据周围的文本改变其字体?
我必须使用(pdf)latex
。等xelatex
,luatex
在这种情况下不是可行的替代方案。
\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}
使数学与文本相匹配。