![如何在有限范围内使用 Fira Sans 和 sfmath](https://linux22.com/image/453313/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9C%89%E9%99%90%E8%8C%83%E5%9B%B4%E5%86%85%E4%BD%BF%E7%94%A8%20Fira%20Sans%20%E5%92%8C%20sfmath.png)
我正在尝试定义一个文档模板,其中我有一个用于正文和数学的衬线字体,但仅对于我的图表(tikz / pgfplots),我希望有一个无衬线字体,即 Fira Sans。
我可以在序言中加载 Fira Sans 包,并成功在衬线字体和无衬线字体之间切换。如果我启用\usepackage(sfmath}
,则绘图看起来不错,而正文中的公式也使用无衬线字体设置。另一方面,如果我禁用% \usebackage{sfmath}
,则绘图中的数学运算将设置为衬线字体。
这里有一个小例子......
\documentclass{article}
\usepackage{Fira Sans}
% \usepackage{sfmath} <-- enable/disable here!
\usepackage{units}
\usepackage{xcolor}
\usepackage{lipsum}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\lipsum[2]
\begin{equation}
\Gamma(\phi) = \oint \alpha(\phi)\,\textrm{d}\phi
\end{equation}
\begin{figure}[!h]
\centering
\begin{tikzpicture}
\sffamily
\def\curvea{287*100/x/1000}
\def\curveb{287*300/x/1000}
\def\curvec{287*500/x/1000}
\begin{axis}[
minor x tick num=3, minor y tick num=3,
xlabel={spec. Volume $v$ in $\unitfrac{m^3}{kg}$},
ylabel={Pressure $p$ in $\unit{kPa}$},
domain=0:3, y domain=0:300,
xmin=0, xmax=3, ymin=0, ymax=300,
samples=100,
]
\addplot[thick, solid]{\curvea} node[inner sep=2, fill=white, rotate=-10, pos=0.982] {\tiny $T=\Ta~\unit{K}$};
\addplot[thick, solid]{\curveb} node[inner sep=2, fill=white, rotate=-10, pos=0.993] {\tiny $T=\Tb~\unit{K}$};
\addplot[thick, solid]{\curvec} node[inner sep=2, fill=white, rotate=-10, pos=0.998] {\tiny $T=\Tc~\unit{K}$};
\end{axis}
\end{tikzpicture}
\caption{Caption}
\label{fig:my_label}
\end{figure}
\lipsum[4]
\end{document}
请问,有人可以指出我正确的方向,如何在保留正文的衬线字体的情况下,将 Fira Sans 用于情节中的数学运算吗?
答案1
您可能希望使用sansmath
来siunitx
代替旧的和不太灵活的units
。
\documentclass{article}
\usepackage{Fira Sans}
\usepackage{sansmath}
\usepackage{siunitx}
\usepackage{xcolor}
\usepackage{lipsum}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{document}
\lipsum[2]
\begin{equation}
\Gamma(\phi) = \oint \alpha(\phi)\,\textrm{d}\phi
\end{equation}
\begin{figure}[!h]
\centering
\begin{tikzpicture}
\sffamily\sansmath
\sisetup{detect-all}
\def\curvea{287*100/x/1000}
\def\curveb{287*300/x/1000}
\def\curvec{287*500/x/1000}
\def\Ta{3}\def\Tb{4}\def\Tc{5}% guess, fix it
\begin{axis}[
minor x tick num=3,
minor y tick num=3,
xlabel={spec.\@ Volume $v$ in \unit{m^3/kg}},
ylabel={Pressure $p$ in \unit{kPa}},
domain=0:3,
y domain=0:300,
xmin=0,
xmax=3,
ymin=0,
ymax=300,
samples=100,
]
\addplot[thick, solid]{\curvea} node[inner sep=2, fill=white, rotate=-10, pos=0.982]
{\tiny $T=\qty{\Ta}{K}$};
\addplot[thick, solid]{\curveb} node[inner sep=2, fill=white, rotate=-10, pos=0.993]
{\tiny $T=\qty{\Tb}{K}$};
\addplot[thick, solid]{\curvec} node[inner sep=2, fill=white, rotate=-10, pos=0.998]
{\tiny $T=\qty{\Tc}{K}$};
\end{axis}
\end{tikzpicture}
\caption{Caption}
\label{fig:my_label}
\end{figure}
\lipsum[4]
\end{document}
答案2
据我所知,如果没有的话,在 LaTeX 中来回切换数学字体并不容易unicode-math
(pdflatex 无法使用)。我可以建议以下解决方法:使用external
Tikz 库并仅在处理图形时添加sfmath
包,如下所示:
\documentclass{article}
\ifx\tikzexternalrealjob\undefined
\else
\usepackage[lining]{Fira Sans}
\usepackage{sfmath}
\fi
\usepackage{units}
\usepackage{xcolor}
\usepackage{lipsum}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
\lipsum[2]
\begin{equation}
\Gamma(\phi) = \oint \alpha(\phi)\,\textrm{d}\phi
\end{equation}
\begin{figure}[!h]
\centering
\begin{tikzpicture}
\sffamily
\def\curvea{287*100/x/1000}
\def\curveb{287*300/x/1000}
\def\curvec{287*500/x/1000}
\begin{axis}[
minor x tick num=3, minor y tick num=3,
xlabel={spec. Volume $v$ in $\unitfrac{m^3}{kg}$},
ylabel={Pressure $p$ in $\unit{kPa}$},
domain=0:3, y domain=0:300,
xmin=0, xmax=3, ymin=0, ymax=300,
samples=100,
]
\addplot[thick, solid]{\curvea} node[inner sep=2, fill=white, rotate=-10, pos=0.982] {\tiny $T=100~\unit{K}$};
\addplot[thick, solid]{\curveb} node[inner sep=2, fill=white, rotate=-10, pos=0.993] {\tiny $T=300~\unit{K}$};
\addplot[thick, solid]{\curvec} node[inner sep=2, fill=white, rotate=-10, pos=0.998] {\tiny $T=500~\unit{K}$};
\end{axis}
\end{tikzpicture}
\caption{Caption}
\label{fig:my_label}
\end{figure}
\lipsum[4]
\end{document}
但是这种方法也有缺点。首先,你必须用--shell-escape
标志来构建文档。其次,文档将被多次处理,因此编译速度较慢。第三,有时 Tikz 无法识别需要重建图片(例如,当你更改序言时),这需要手动删除它们。
答案3
如果我理解正确的话,您希望在文档中本地更改字体,而不全局更改 LaTeX 的默认字体。您可以使用命令在{\fontfamily{FiraSans-TLF}\selectfont yourtext}
本地更改字体,或者更通用的命令{\usefont{encoding}{family-name}{series}{shape}{size}\selectfont yourtext}
。对于您的情况,例如{\usefont{FiraSans-TLF}{T1}{m}{up}\selectfont yourtexthere}
。请注意,要使上述操作有效,您必须知道family name
字体的,通常不是其官方名称。作为参考,您可以在这里查看:Latex2e 非官方参考手册
以下是一个例子:
\documentclass[12pt]{article}
\usepackage[a4paper,body={180mm,247mm},left=10mm,top=20mm]{geometry}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\begin{document}
This sentence is written with \LaTeX default font
{\sffamily This sentence is written with \LaTeX default Sans Serif font}
{\fontfamily{FiraSans-TLF}\selectfont This sentence is written with Fira Sans font}
{\usefont{T1}{FiraSans-TLF}{bb}{it} \textit{This sentence is written with Fira Sans font}}
This sentence is written again with \LaTeX default font
\end{document}