在衬线文档中包含带有无衬线字体的 .pgf 图

在衬线文档中包含带有无衬线字体的 .pgf 图

我正在使用创建论文的图表和图形matplotlib,并将它们保存为.pgf我使用的文件

\begin{figure}
    \input{myfigure.pgf}
    \caption{A caption}
\end{figure}

默认情况下,使用与文档中相同的字体排版图形中的所有数学和标签。但我希望我的图表和图形使用无衬线字体,同时使用 palatino 作为主文档字体。

到目前为止,我尝试了以下内容:添加mpl.rcParams["font.family"] = "sans-serif"到绘图生成代码中以获取以无衬线字体排版的所有非数学文本,并以无衬线字体获取数学运算,我使用的sansmath包如下:

% preamble
\usepackage{sansmath}
% more preamble
\begin{document}

\begin{figure}
    \begin{sansmath}
    \input{myfigure.pgf}
    \end{sansmath}
    \caption{A caption}
\end{figure}

\end{document}

这对于图中的所有标签和数学都很有效除了希腊字母。使用该选项\usepackage[eulergreek]{sansmath}也无济于事。

有没有人有好的解决方案来包含所有无衬线字体的 pgf 文件?最好是一个不需要更改 matplotlib rcParams 的解决方案,因为我可能想在其他地方以不同的格式重复使用这些图形。

答案1

好的,我找到了一个效果很好的解决方案。基本上,主要问题是数学字体不遵循周围的字体系列。即,段落中用无衬线字体排版的数学不会用无衬线字体排版。因此,需要确保数学也能在无衬线字体系列中正确排版,方法是在序言中添加以下内容:

\DeclareMathVersion{sans}
\SetSymbolFont{operators}{sans}{OT1}{kurierm}{m}{n}
\SetSymbolFont{letters}{sans}{OML}{kurier}{m}{it}
\SetSymbolFont{symbols}{sans}{OMS}{kurier}{m}{n}
\SetMathAlphabet{\mathit}{sans}{OT1}{kurier}{m}{sl}
\SetMathAlphabet{\mathbf}{sans}{OT1}{kurier}{bx}{n}
\SetMathAlphabet{\mathtt}{sans}{OT1}{kurier}{m}{n}
\SetSymbolFont{largesymbols}{sans}{OMX}{kurier}{m}{n}

\DeclareMathVersion{boldsans}
\SetSymbolFont{operators}{boldsans}{OT1}{kurierm}{b}{n}
\SetSymbolFont{letters}{boldsans}{OML}{kurier}{b}{it}
\SetSymbolFont{symbols}{boldsans}{OMS}{kurier}{b}{n}
\SetMathAlphabet{\mathit}{boldsans}{OT1}{kurier}{b}{sl}
\SetMathAlphabet{\mathbf}{boldsans}{OT1}{kurier}{bx}{n}
\SetMathAlphabet{\mathtt}{boldsans}{OT1}{kurier}{b}{n}
\SetSymbolFont{largesymbols}{boldsans}{OMX}{kurier}{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}}

并保持mpl.rcParams["font.family"] = "sans-serif"使所有情节都无衬线。

相关内容