如何在有限范围内使用 Fira Sans 和 sfmath

如何在有限范围内使用 Fira Sans 和 sfmath

我正在尝试定义一个文档模板,其中我有一个用于正文和数学的衬线字体,但仅对于我的图表(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}

没有 SFMATH 的结果


SFMATH 的结果

请问,有人可以指出我正确的方向,如何在保留正文的衬线字体的情况下,将 Fira Sans 用于情节中的数学运算吗?

答案1

您可能希望使用sansmathsiunitx代替旧的和不太灵活的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 无法使用)。我可以建议以下解决方法:使用externalTikz 库并仅在处理图形时添加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}  

相关内容