matplotlib pgf 后端与 lualatex - 非数学字体不会改变

matplotlib pgf 后端与 lualatex - 非数学字体不会改变

使用 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}在序言开头使用来解决。我以为fontspecT1 字体编码不会做任何事情,但它是必需的,而且它有效。

这个问题类似于:如何将 kpfonts 与 fontspec 一起使用?

使用lua引擎: 在此处输入图片描述

使用 pdf 引擎: 在此处输入图片描述

代码:

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.pdfexample.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}

看:如何将 kpfonts 与 fontspec 一起使用?

相关内容