为什么 pgf 不遵守我针对 matplotlib 生成的图形所选择的字体?

为什么 pgf 不遵守我针对 matplotlib 生成的图形所选择的字体?

我想在 matplotlib 图的轴描述中使用欧元符号,这些图使用 pgf 后端保存为 pgf 文件。当我使用以下代码时:

import numpy as np
import matplotlib.pyplot as mplot
import matplotlib.cm as cm
import matplotlib
import scipy.optimize

def f(x,sign=1.0):
        out = sign*(5*x + 6e-1*np.pi*(1/x))
        return out

mplot.close('all')
x = np.linspace(0.1,1)
y = f(x)
mplot.plot(x,y)
mplot.grid(1)
mplot.axis([0,1,0,20])
mplot.xlabel(r'$\log(\frac{d_a}{d_i})$')
mplot.ylabel(r'$\frac{\euro}{a}$')
mplot.savefig('minimum.pgf')

结果出现以下错误:

ValueError: Error processing '\(\displaystyle \frac{\euro}{a}\)'
LaTeX Output:
! Undefined control sequence.
<argument> \euro 

<*> ...lectfont \(\displaystyle \frac{\euro}{a}\)}

No pages of output.
Transcript written on texput.log.

通常建议的解决方案是让 matplotlib 始终使用 LaTeX:

# coding: utf-8

# In[2]:

import numpy as np
import matplotlib.pyplot as mplot
import matplotlib.cm as cm
import matplotlib
from mpl_toolkits.mplot3d import Axes3D as m3d
import scipy.optimize


# In[3]:

#matplotlib.use("pgf")
pgf_with_xelatex = {
'text.usetex': True,
'text.latex.unicode': True,
'pgf.rcfonts': False,
'font.family': 'sans-serif',
"pgf.texsystem": "xelatex",
"pgf.preamble": [
r"\usepackage{amssymb}",
r"\usepackage{amsmath}",
r"\usepackage{fontspec}",
r"\setmainfont{Gentium Book Basic}",
r"\setsansfont{Open Sans Light}",
r"\usepackage{unicode-math}",
r"\setmathfont{TeX Gyre Termes Math}"
]
}

matplotlib.rcParams.update(pgf_with_xelatex)


# In[4]:

def f(x,sign=1.0):
    out = sign*(5*x + 6e-1*np.pi*(1/x))
    return out


# In[5]:

mplot.close('all')
x = np.linspace(0.1,1)
y = f(x)
mplot.plot(x,y)
mplot.grid(1)
mplot.axis([0,1,0,20])
mplot.xlabel(r'$\log(\frac{d_a}{d_i})$')
mplot.ylabel(r'$\frac{\euro}{a}$')
mplot.savefig('minimum.pgf')

python代码执行没有错误,但是有两个问题。

  1. matplotlib 图中缺少欧元符号(参见纵坐标轴),并且所有内容都是衬线的,而我期望它是无衬线的:

matplotlib qt 窗口

  1. 生成的 pgf 图像有欧元符号,但所有内容都是衬线的,而且似乎不符合我的字体选择:

matplotlib pgf 输出

使用 matplotlib 生成的类似 pgf 图像,但未在 matplotlib 配置中指定 LaTeX,则会生成以下图:

具有所需轴刻度字体的示例

轴刻度字体是 Open Sans Light。我想使用衬线数学字体来描述轴,其他内容保持不变。

无衬线刻度文本在 pgf 中用以下行指定:

\begin{pgfscope}%
\pgftext[x=2.550000in,y=0.544444in,,top]{{\sffamily\fontsize{12.000000}{14.400000}\selectfont 5}}%
\end{pgfscope}%

在带有衬线刻度的 pgf 中,刻度文本指定如下:

\begin{pgfscope}%
\pgftext[x=1.000000in,y=0.544444in,,top]{{\sffamily\fontsize{12.000000}{14.400000}\selectfont \(\displaystyle 0.0\)}}%
\end{pgfscope}%

这是我为 pgf 图形制作的 LaTeX MWE:

\documentclass{scrartcl}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{pgf}
\usepackage{graphicx}
\usepackage{unicode-math}
\usepackage{array}
\usepackage{fonts}

\DeclareMathOperator*{\argmax}{arg max}

\begin{tabular}{m{5cm}m{0.8\textwidth}}
\raggedleft \begin{equation*} \argmax_{x} f_{\mathrm{H}1}(x) = \begin{pmatrix} 8.6997998 \\ 6.7664998 \end{pmatrix} 
\end{equation*} & \resizebox{0.8\textwidth}{!}{\input{minimum.pgf}}
\end{tabular}
\end{document}

fonts.sty 包含:

\setmathfont{TeX Gyre Termes Math}
\setmainfont{Gentium Book Basic}
\setsansfont{Open Sans Light}

相关内容