我想轻松切换到无衬线字体,即使是数学符号。可以吗?
到目前为止我已经尝试过:
\documentclass{article}
\def\mySfFamily{\fontfamily{cmbr}\selectfont\sffamily}
\def\N{\mathbf{N}}
\def\R{\mathbf{R}}
\def\Q{\mathbf{Q}}
\def\Z{\mathbf{Z}}
\def\C{\mathbf{C}}
\begin{document}
\begingroup
\mySfFamily
This should be sans-serif : $\R, \Q, \N, \Z, \C$ are sets.
\endgroup
\bigskip
This should be serif : $\R, \Q, \N, \Z, \C$ are sets.
\end{document}
但正如你所见,它不适用于数学。我选择这个字体是\fontfamily{cmbr}
因为这个帖子。
答案1
该sansmath
软件包提供了一个命令(\sansmath
)和环境(sansmath
),目的正是如此:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{sansmath}
\def\mySfFamily{\fontfamily{cmbr}\selectfont\sffamily\sansmath}
\def\N{\mathbf{N}}
\def\R{\mathbf{R}}
\def\Q{\mathbf{Q}}
\def\Z{\mathbf{Z}}
\def\C{\mathbf{C}}
\begin{document}
\begingroup
\mySfFamily
This should be sans-serif : $\R, \Q, \N, \Z, \C$ are sets.
\endgroup
\bigskip
This should be serif : $\R, \Q, \N, \Z, \C$ are sets.
\end{document}
为了“自动”应用此功能,我会将其破解到\sffamily
and\rmmfamily
命令中。(我更喜欢\appto
从etoolbox
包中执行此操作,但也可以使用通常的\let\OLDmacro\macro
and\renewcommand\macro{\OLDmacro <extension>}
习语。):
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{sansmath,etoolbox}
\renewcommand{\sfdefault}{cmbr}
\appto{\sffamily}{\sansmath}
\appto{\rmfamily}{\unsansmath}
\def\N{\mathbf{N}}
\def\R{\mathbf{R}}
\def\Q{\mathbf{Q}}
\def\Z{\mathbf{Z}}
\def\C{\mathbf{C}}
\begin{document}
\sffamily
This should be sans-serif : $\R, \Q, \N, \Z, \C$ are sets.
\rmfamily
This should be serif : $\R, \Q, \N, \Z, \C$ are sets.
\end{document}
答案2
前段时间我问过同样的问题,答案是定义一个新的数学字母表并将其融入到 的定义中\sffamily
。所以我建议关闭这个问题,因为它是重复的,但在悬赏结束之前是无法完成的。
这是基于 egreg 的答案构建的代码。
\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
为了进行比较,以下是在 ConTeXt 中从无衬线字体切换到衬线字体并切换回的方法。
\def\N{{\bf N}}
\def\R{{\bf R}}
\def\Q{{\bf Q}}
\def\Z{{\bf Z}}
\def\C{{\bf C}}
\startbuffer
Some random text: $\R, \Q, \N, \Z, \C$ are sets.
\stopbuffer
% To format the examples
\setuphead[subject][style=bold, after=]
\starttext
\subject{Default} \getbuffer
\subject{Sans math}
\switchtobodyfont[ss]
\appendtoks \ss \to \everymathematics
\getbuffer
\subject{Serif math}
\switchtobodyfont[rm]
\appendtoks \rm \to \everymathematics
\getbuffer
\stoptext
您还可以使用组{...}
来限制字体变化的效果。
答案4
使用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)中的字母或sf
Libertinus Math 中的字母混合在一起的数学版本。
目前,您可以将 FakeBold 应用于 Fira Math:
\setmathfont[version=boldsans, FakeBold=1.2]{Fira Math}
然后,您可以更改标题的格式以\sffamily\bfseries\mathversion{boldsans}
获得粗体无衬线数学符号。