Python 描述中的Matplotlib tex宏
我正在使用Python 描述中的Matplotlib tex宏,python,matplotlib,pgf,Python,Matplotlib,Pgf,我正在使用matplotlib生成pgf文件。 基于这些,我使用独立的tex文件,其中只包括必要的设置和前面构建的pgfs。 在这种情况下,在打印文件中使用自定义tex宏进行描述时会出现错误 这里是一个示例pgf生成器: import matplotlib as mpl mpl.use("pgf") mpl.rcParams.update({ "pgf.texsystem": "pdflatex", "pgf.preamble": [ #r"\newcommand
matplotlib
生成pgf
文件。
基于这些,我使用独立的tex
文件,其中只包括必要的设置和前面构建的pgf
s。
在这种情况下,在打印文件中使用自定义tex宏进行描述时会出现错误
这里是一个示例pgf
生成器:
import matplotlib as mpl
mpl.use("pgf")
mpl.rcParams.update({
"pgf.texsystem": "pdflatex",
"pgf.preamble": [
#r"\newcommand{\foo}{foo}",
r"\usepackage{import}",
r'\subimport{./}{foo.tex}'
]
})
import matplotlib.pyplot as plt
plt.figure(figsize=(4.5,2.5))
plt.plot(range(5))
plt.xlabel(r'\foo{}')
plt.savefig('foo.pgf')
可在具有以下foo.tex
文件的目录中使用:
\newcommand{\foo}{foo}
运行此操作将导致以下错误:
ValueError: Error processing '\foo{}'
LaTeX Output:
! Undefined control sequence.
<argument> ....000000}{12.000000}\selectfont \foo
{}
<*> ...ze{10.000000}{12.000000}\selectfont \foo{}}
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on texput.log.
ValueError:处理'\foo{}'时出错
乳胶产量:
! 未定义的控制序列。
..…000000}{12.000000}\selectfont\foo
{}
…ze{10.000000}{12.000000}\selectfont\foo{}
! ==> 发生致命错误,未生成输出PDF文件!
记录在texput.log上。
请注意,这是编译我的独立文件时由matplotlib
和not生成的错误。
还要注意的是,当\foo
宏作为pgf.preamble的一部分提供时,错误就会消失
(该行注释掉)相反。
我检查了这个变体生成的pgf
,它确实使用了\foo{}
我很难把问题进一步缩小。
以下是我的具体问题:
为什么matplotlib
调用pdflatex
?
我正在生成pgf
输出,因此不需要pdflatex
。
(供参考:Istrace
d上面的脚本,并且确实知道正在调用pdflatex
)
有没有办法保存matplotlib
试图编译的临时文件?
错误引用了texput.log
(当然)该文件之后不存在
为什么我不能在另一个tex文件中提供的标签中使用宏
tl;dr包括tex
-在matplotlib
的pgf.preamble
中的文件需要绝对路径
对于将来的调试,我建议使用以下pdflatex
“替换脚本”:
#!/usr/bin/env bash
MAIN=/usr/bin/pdflatex
cat /dev/stdin | tee /some/abs/path/to/dbg.tex | "${MAIN}" "${@}"
确保将其保存为pdflatex
,确保其可执行,确保/usr/bin/pdflatex
是您的实际pdflatex
,并确保此包装首先在您的路径中找到(参见哪个pdflatex
)。
当运行python
生成器时,我们将最后的tex
输入保存在dbg.tex
中。
答案是(2)
考虑到输出,我们看到:
\documentclass{minimal}
\usepackage{import}
\subimport{./}{foo.tex}
\begin{document}
text $math \mu$
\typeout{pgf_backend_query_start}
\sbox0{\sffamily\fontsize{10.000000}{12.000000}\selectfont lp}
\typeout{\the\wd0,\the\ht0,\the\dp0}
\sbox0{\sffamily\fontsize{10.000000}{12.000000}\selectfont 0}
\typeout{\the\wd0,\the\ht0,\the\dp0}
\sbox0{\sffamily\fontsize{10.000000}{12.000000}\selectfont 1}
\typeout{\the\wd0,\the\ht0,\the\dp0}
\sbox0{\sffamily\fontsize{10.000000}{12.000000}\selectfont 2}
\typeout{\the\wd0,\the\ht0,\the\dp0}
\sbox0{\sffamily\fontsize{10.000000}{12.000000}\selectfont 3}
\typeout{\the\wd0,\the\ht0,\the\dp0}
\sbox0{\sffamily\fontsize{10.000000}{12.000000}\selectfont 4}
\typeout{\the\wd0,\the\ht0,\the\dp0}
\sbox0{\sffamily\fontsize{10.000000}{12.000000}\selectfont \foo{}}
\typeout{\the\wd0,\the\ht0,\the\dp0}
我不知道那有什么用。
但是我猜matplotlib
正在尝试调整字体设置,它试图编译这个“测试”文档。
这(某种程度上)回答了(1)
现在得出的结论(事后看来很明显):
matplotlib
在临时目录中编译此示例文档。
显然,此目录中没有可用的foo.tex
,因此子导入失败。
从那时起,\foo
显然将不可用
虽然不是最干净的解决方案,
这可以通过通过绝对路径包含foo.tex
来解决。
使用python生成器最终回答(3):
(我使用python3
和pathlib
。
对于python2
import matplotlib as mpl
import pathlib
mpl.use("pgf")
mpl.rcParams.update({
"pgf.texsystem": "pdflatex",
"pgf.preamble": [
r"\usepackage{import}",
f'\subimport{{{pathlib.Path.cwd().resolve()}/}}{{foo.tex}}']
})
import matplotlib.pyplot as plt
plt.figure(figsize=(4.5,2.5))
plt.plot(range(5))
plt.xlabel(r'\foo{}')
plt.savefig('foo.pgf')