簡體   English   中英

Matplotlib tex-macro的描述

[英]Matplotlib tex-macro in description

我正在使用matplotlib生成pgf文件。 基於這些,我使用獨立的tex文件,該文件僅包含必要的設置和預先構建的pgf 在這種情況下,將自定義tex-macros用於繪圖文件中的描述時出現錯誤。

這里是一個示例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.

請注意,這是matplotlib生成的錯誤,而不是編譯我的獨立文件。 另請注意,當將\\foo宏作為pgf.preamble一部分(注釋掉的行)提供時,錯誤消失了。 我檢查了此變體產生的pgf ,確實使用了\\foo{}

我無法將問題進一步縮小。 這是我的具體問題:

  1. 為什么matplotlib調用pdflatex 我正在生成pgf輸出,因此不需要pdflatex (作為參考:我strace了上面的腳本,並且確實知道正在調用pdflatex 。)
  2. 有沒有一種方法可以保留matplotlib嘗試編譯的臨時文件? 錯誤引用texput.log是(當然)此后該文件不存在。
  3. 為什么不能在另一個tex文件中提供的標簽中使用宏?

TL;博士包含tex在-files pgf.preamblematplotlib需要絕對路徑。


為了將來,我建議使用以下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並確保在您的PATH首先找到該包裝器(參見which 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 ,因此子subimport失敗。 從那時起,很明顯\\foo將不可用。

盡管不是最干凈的解決方案,但可以通過絕對路徑包含foo.tex來解決此問題。 工作的python生成器最終回答(3):

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')

(我使用python3pathlib 。對於python2我們寧願退回到os.getcwd 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM