Matplotlib的PGF后端使用pdflatex/lualatex时出现输入栈容量超限错误
Matplotlib PGF后端使用pdflatex/lualatex报错问题解决
核心问题定位
报错中pdftex.def找不到和输入栈溢出,主要由以下原因导致:
- TeX Live版本过旧:你使用的TeX Live 2013距今超过10年,很多基础包(如包含
pdftex.def的graphicx)可能缺失或与Matplotlib 3.5.1不兼容,旧版本TeX对新LaTeX语法和包的支持不足。 - 配置冲突:
utf8x是已废弃的编码包,会与现代TeX环境产生加载冲突;针对lualatex时错误加载了仅适用于pdftex的inputenc和fontenc包,引发栈溢出。 - 保存流程问题:直接保存为PDF时,PGF后端的TeX编译流程因配置错误卡住,触发连锁报错。
解决方案
1. 升级TeX Live环境(优先推荐)
直接将TeX Live升级到2020及以后的版本,新版本默认包含pdftex.def等基础文件,且与Matplotlib 3.5.1兼容性更好,能彻底解决大部分版本匹配问题。
2. 调整Matplotlib配置
根据使用的TeX引擎修改pgf.preamble:
- 使用pdflatex时:
替换过时的utf8x为标准utf8(新版pdflatex可直接省略inputenc):import matplotlib.pyplot as plt plt.rcParams.update({ "pgf.texsystem": "pdflatex", "pgf.preamble": "\n".join([ # r"\usepackage[utf8]{inputenc}", # 新版pdflatex可删除该行 r"\usepackage[T1]{fontenc}", r"\usepackage{cmbright}", ]), }) - 使用lualatex时:
移除inputenc和fontenc,改用fontspec配置字体:import matplotlib.pyplot as plt plt.rcParams.update({ "pgf.texsystem": "lualatex", "pgf.preamble": "\n".join([ r"\usepackage{fontspec}", r"\setmainfont{CMU Bright}", r"\usepackage{cmbright}", ]), })
3. 优化保存方式
推荐先保存为.pgf格式,再嵌入到LaTeX文档中,避免直接编译PDF的潜在问题:
# 保存为PGF格式(适合LaTeX嵌入) fig.savefig('/user/home/test.pgf', backend='pgf') # 若需直接保存PDF,确保后端指定正确 plt.savefig('/user/home/test.pdf', backend='pgf')
4. 临时修复(无法升级TeX时)
如果暂时无法升级TeX Live,通过TeX Live Manager安装graphicx包,确保pdftex.def文件存在并被TeX环境识别;同时删除utf8x相关配置,避免冲突。
内容的提问来源于stack exchange,提问作者PeterW
相关产品推荐
相关产品推荐

