[英]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{}
。
我無法將問題進一步縮小。 這是我的具體問題:
matplotlib
調用pdflatex
? 我正在生成pgf
輸出,因此不需要pdflatex
。 (作為參考:我strace
了上面的腳本,並且確實知道正在調用pdflatex
。) matplotlib
嘗試編譯的臨時文件? 錯誤引用texput.log
是(當然)此后該文件不存在。 TL;博士包含tex
在-files pgf.preamble
的matplotlib
需要絕對路徑。
為了將來,我建議使用以下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')
(我使用python3
和pathlib
。對於python2
我們寧願退回到os.getcwd 。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.