避免在matplotlib图形的PGF导出中指定字体族。

13

概述

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

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

如果文本来自同一字体系列,则文本可以从全局文档字体继承字体,但如果全局字体来自不同的字体系列,则文本将恢复为默认的sffamily字体。

我的进展

我认为我已经找到了问题所在:如果我编辑PGF文档并简单地删除任何文本条目的\sffamily部分,则该问题不再存在,并且全局字体被继承。删除不会影响LaTeX正确编译它,我不会收到错误信息。

因为以上发现,我认为问题与rcParams或任何LaTeX导言(无论是在Python中还是在实际的LaTeX文档中)无关。

最小工作示例

我只是在最简单的情节上尝试了一下,并成功地重现了这个问题:

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并呈现它将允许它继承字体族。

简而言之

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

3个回答

4

我无法提供解决方案,但可以借助 @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}

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


在这种情况下,我会避免使用center环境,因为它会增加额外的垂直间距。 - samcarter_is_at_topanswers.xyz
至于@samcarter的评论,我在我的情况下使用\begin{figure} - krg

2

有另外一个解决办法是在导入pgf文件之前,用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}

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。"Original Answer"翻译成"最初的回答"。

好的,这个想法是在PGF文件中根本不指定字体系列,这样如果我在LaTeX文件中更改了图形的字体,它也会随之更改。 - krg
从链接的文档中可以看到:“如果 matplotlib 使用的字体配置与 LaTeX 文档中的字体设置不同,则导入的图形中的文本元素对齐可能会出错。如果您不确定 matplotlib 用于布局的字体,请检查您的 .pgf 文件的标头。” 因此,mathplotlib 需要知道你正在使用哪些字体。 - Ralf Stubner
确实,matplotlib需要字体,如果我尝试移除字体规格,则它会恢复到DejaVu的默认值(由rcParamsDefault指定)。所以我明白为什么需要为matplotlib指定字体规格,但很烦人的是它强制作用于pgf文档。不过,您的其他答案处理得很好。 - krg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接