使用 Pythonmatplotlib
生成图表时,我有时需要lualatex
引擎使用 matplotlib 的 pgf 后端来生成“较重”的图表(如 hexbin),否则 TeX 内存会超出并pdflatex
失败。使用时,lualatex
数学字体似乎会根据我的而改变pgf.preamble
,但是字体的其余部分不会改变,而是保持为 CM Roman。使用时pdflatex
,字体的行为符合我的要求。请注意,如果我转到www.overleaf.com并使用相同的前言并用pdflatex
或进行编译lualatex
,文档在数学和正文中都显示了我想要的字体。编辑:正文字体实际上在 overleaf 中不起作用,我弄错了。
更新:xelatex
行为与相同lualatex
,即仅更改了数学字体。
更新:通过\usepackage{fontspec}\usepackage[T1]{fontenc}
在序言开头使用来解决。我以为fontspec
T1 字体编码不会做任何事情,但它是必需的,而且它有效。
这个问题类似于:如何将 kpfonts 与 fontspec 一起使用?
代码:
import matplotlib as mpl
eng = 'lua' # issue with lua only <<<<<<<<
# eng = 'pdf' # no issue here
# eng = 'xe' # update: issue here as well
mpl.use('pgf')
mpl.rc('font', family='serif')
mpl.rcParams.update({
"pgf.rcfonts" : False,
"pgf.texsystem": eng + "latex",
"pgf.preamble" : '\\usepackage[utf8x]{inputenc}\\usepackage[light]{kpfonts}',
})
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0,6,100)
x = np.sin(t)
fig, ax = plt.subplots()
ax.plot(t, x, label='A line')
plt.title('A function, $f(x) = \sin(x)$')
plt.legend()
plt.savefig('example.pdf')
答案1
如果删除preamble
设置并更改example.pdf
为example.pgf?
,会发生什么情况?或者是否有理由使用 pdf 格式?
当我在 Matplotlib 中渲染一些将放入 Latex 中的内容时,我总是选择使用 Latex 渲染,并可能设置一些基本设置,如(无)衬线和字体大小,并选择输出格式pgf
。
执行此操作并选择不设置显式字体后,我以后可以切换字体而不必渲染另一个图形。这是因为实际绘图将在从 Latex 渲染 pdf 时绘制(在您的情况下,当您在 Overleaf 中单击“编译”时)。
如果您这样做,我认为您必须更改\includegraphics{example.pdf}
为\input{example.pgf}
,因为您想要包含的是 LaTeX 代码。
答案2
将“pgf.preamble”设置为:
\usepackage{fontspec}
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage[light]{kpfonts}