避免在matplotlib图形的PGF导出中指定字体系列

时间:2019-05-23 17:23:40

标签: matplotlib latex pgf

摘要

我正在将matplotlib图形导出为PGF,以便在LaTeX中使用。

将图形另存为PGF时,

matplotlib似乎为每个文本条目(轴标签,刻度线,图例条目,注释)添加了\sffamily。这将阻止它从全局文档字体正确继承字体。

如果文本来自同一家族,则可以从全局文档字体中插入字体,但是如果全局字体来自其他家族,则它将还原为默认的sffamily字体。

我要去哪里

我相信我已经隔离了问题:如果我编辑PGF文档并简单地删除任何文本输入的\sffamily部分,该问题将不再继续存在,并且将继承全局字体。删除并不会阻止LaTeX正确编译它,而且我也没有收到任何错误。

由于上述发现,我认为问题与rcParams或任何LaTeX前言(无论是在python中还是在实际的LaTeX文档中)均无关。

MWE

我只是在最简单的情节上尝试过,并且能够重现问题:

import matplotlib.pyplot as plt

fig = plt.figure()
plt.xlabel('a label')
fig.savefig('fig.pgf')

并且pgf文档将包含以下行:

\pgftext[x=3.280000in,y=0.240809in,,top]{\color{textcolor}\sffamily\fontsize{10.000000}{12.000000}\selectfont a label}%

因此添加了\sffamily。在LaTeX中渲染该字体将强制使用sans-serif字体。删除\sffamily并进行渲染将使其能够继承字体系列。

TLDR

有没有办法避免在matplotlib的PGF输出中包含字体家族?

3 个答案:

答案 0 :(得分:2)

还有另一种解决方法,即在将pgf文件导入tex文档中之前,用 sed 替换字体规范。

\documentclass{article}
\usepackage{pgf}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}

\begin{document}
\begin{figure}
    \begin{filecontents*}{tmpfile.sed}
# sed command file
s/\\color{textcolor}\\sffamily\\fontsize{.*}{.*}\\selectfont //\end{filecontents*}
    \immediate\write18{sed -i -f tmpfile.sed yourplot.pgf}
    \import{yourplot.pgf}
\end{figure}
\end{document}

答案 1 :(得分:1)

我无法提供解决方案,而是基于@samcarter的评论的变通方法:您可以在本地重新定义\sffamily,例如:

\documentclass{article}

\usepackage{pgf}
\usepackage{fontspec}
\setmainfont{DejaVu Serif}
\setsansfont{DejaVu Sans}
\setmonofont{DejaVu Sans Mono}

\begin{document}
Lorem ipsum {\sffamily Lorem ipsum}
\begin{center}
    \renewcommand\sffamily{}
    \input{fig.pgf}
\end{center}
Lorem ipsum {\sffamily Lorem ipsum}
\end{document}

您可以使用任何环境或center\begingroup代替\endgroup

答案 2 :(得分:1)

您可以在https://matplotlib.org/users/pgf.html#font-specification上构建:

import matplotlib as mpl
import matplotlib.pyplot as plt

pgf_with_rc_fonts = {
    "font.family": "serif",
}
mpl.rcParams.update(pgf_with_rc_fonts)


fig = plt.figure()
plt.xlabel('a label')
fig.savefig('fig.pgf')

通过这种方式使用\rmfamily代替\sffamily