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
    。 (供参考:I
    strace
    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')