如何在数学普通字体和无衬线字体之间轻松切换?

如何在数学普通字体和无衬线字体之间轻松切换?

我想轻松切换到无衬线字体,即使是数学符号。可以吗?

到目前为止我已经尝试过:

\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}

在此处输入图片描述

为了“自动”应用此功能,我会将其破解到\sffamilyand\rmmfamily命令中。(我更喜欢\apptoetoolbox包中执行此操作,但也可以使用通常的\let\OLDmacro\macroand\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)中的字母或sfLibertinus Math 中的字母混合在一起的数学版本。

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

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

然后,您可以更改标题的格式以\sffamily\bfseries\mathversion{boldsans}获得粗体无衬线数学符号。

相关内容