11

概括

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

\sffamily将图形保存为 PGF 时,matplotlib 似乎为每个文本条目(轴标签、刻度、图例条目、注释)添加了一个附加项。这将阻止它正确地从全局文档字体继承字体。

如果文本来自同一家族,则文本可以从全局文档字体继承字体,但如果全局字体来自不同家族,它将恢复为默认的 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 中渲染它会强制使用无衬线字体。删除\sffamily并渲染它将允许它继承字体系列。

TLDR

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

4

3 回答 3

3

我无法提供解决方案,但可以提供基于@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您可以使用任何环境或\begingroupand代替\endgroup

于 2019-05-24T05:38:06.947 回答
2

在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.

于 2019-05-24T05:47:17.247 回答
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}
于 2020-01-21T15:43:35.807 回答