我正在编写一个 LaTeX 文档,并matplotlib
在其中包含一些图表,.pgf
格式为\include{file.pgf}
。与将matplotlib
图表导出到.pdf
或.eps
格式相比,它的优点在于字体与我的文档中的字体相匹配,可能还有其他优点,但这不是主要问题。
在我的 LaTeX 文档中,我使用了siunitx
包,我也想用它来绘制matplotlib
图表。例如,某些轴可能是以米为单位的距离,所以我想使用Distance (\si{\meter})
而不是Distance (m)
。
通过对 Python 文件中的大量 Google 研究.py
,我得出了以下示例:
import matplotlib as mpl
mpl.use('pgf')
mplparams = {"pgf.rcfonts": False}
mpl.rc('text', usetex=True)
mpl.rcParams.update(mplparams)
import matplotlib.pyplot as plt
plt.rc('text', usetex=True)
if "siunitx" not in plt.rcParams["text.latex.preamble"]:
plt.rcParams["text.latex.preamble"].append(r"\usepackage{siunitx}")
X = [0, 1, 2, 3, 4, 5]
Y = [-2, 7 , 3 , 8 , 7, 5]
plt.plot(X, Y)
plt.xlabel('Distance (\si{\meter})')
plt.savefig('file.pgf')
但是它不起作用并产生错误消息:
File "(...)\Anaconda3\lib\site-packages\matplotlib\backends\backend_pgf.py", line 375, in get_width_height_descent
raise ValueError(msg % (text, e.latex_output))
ValueError: Error processing 'Distance (\si{\meter})'
LaTeX Output:
! Undefined control sequence.
<argument> ...12.000000}\selectfont Distance (\si
{\meter })
<*> ....000000}\selectfont Distance (\si{\meter})}
No pages of output.
Transcript written on texput.log.
如果我\si{\meter}
用替换m
,它确实有效。
因此我无法在 Python 中使用该siunitx
包。我该如何让它工作?
答案1
这可能不是提出这个问题的正确地方,因为问题是关于 Matplotlib 和 Python 而不是关于 LaTeX,恕我直言。我使用siunitx
以下方式:
pgf_with_latex = { # setup matplotlib to use latex for output
"pgf.texsystem": "pdflatex", # change this if using xetex or lautex
"text.usetex": True, # use LaTeX to write all text
"font.family": "serif",
"font.serif": [], # blank entries should cause plots
"font.sans-serif": [], # to inherit fonts from the document
"font.monospace": [],
"axes.labelsize": 10, # LaTeX default is 10pt font.
"font.size": 10,
"legend.fontsize": 8, # Make the legend/label fonts
"xtick.labelsize": 8, # a little smaller
"ytick.labelsize": 8,
"figure.figsize": figsize(0.9), # default fig size of 0.9 textwidth
"pgf.preamble": "\n".join([ # plots will use this preamble
r"\usepackage[utf8]{inputenc}",
r"\usepackage[T1]{fontenc}",
r"\usepackage[detect-all,locale=DE]{siunitx}",
])
}
mpl.rcParams.update(pgf_with_latex)
因此您必须更新pgf.preamble
以包括r"\usepackage{siunitx}"
。