![tikz 外部化作業中的鑄造緩存](https://rvso.com/image/309866/tikz%20%E5%A4%96%E9%83%A8%E5%8C%96%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%9A%84%E9%91%84%E9%80%A0%E7%B7%A9%E5%AD%98.png)
啟用快取選項minted
並tikz
導致意外且低效的快取。對於tikz
外部化的每個圖形,minted
主文檔的所有程式碼區塊都會快取在tikz
快取目錄中。對於具有 >50 個圖形和 >100 個代碼清單的文檔,快取需要很長時間並且使用比所需更多的磁碟空間。
舉個例子,考慮這個 MWE:
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[cache]{minted}
\usepackage{pgf,tikz}
\usetikzlibrary{external}
\tikzsetexternalprefix{figures/cache/}
\tikzset{external/system call={pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzexternalize
\begin{document}
\begin{minted}[frame=none,fontsize=\small,linenos=true]{r}
plotdata <- data.frame(this = rnorm(20), that = rnorm(20))
\end{minted}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=3cm,
thick,main node/.style={circle,fill=blue!20,draw,font=\sffamily\Large\bfseries}]
\node[main node] (1) {1};
\node[main node] (2) [below left of=1] {2};
\node[main node] (3) [below right of=2] {3};
\node[main node] (4) [below right of=1] {4};
\path[every node/.style={font=\sffamily\small}]
(1) edge node [left] {0.6} (4)
edge [bend right] node[left] {0.3} (2)
edge [loop above] node {0.1} (1)
(2) edge node [right] {0.4} (1)
edge node {0.3} (4)
edge [loop left] node {0.4} (2)
edge [bend right] node[left] {0.1} (3)
(3) edge node [right] {0.8} (2)
edge [bend right] node[right] {0.2} (4)
(4) edge node [left] {0.2} (3)
edge [loop right] node {0.6} (4)
edge [bend right] node[right] {0.2} (1);
\end{tikzpicture}
\end{document}
這導致目錄結構:
.minted-mwe/
475544BE9F571FFAF1D26ACA3A0AB8D0502F9AF18E3C3312853333EF1520885B.pygtex
default.pygstyle
.minted-figures/
cache/
mwe-figure0/
475544BE9F571FFAF1D26ACA3A0AB8D0502F9AF18E3C3312853333EF1520885B.pygtex
default.pygstyle
figures/
cache/
mwe-figure0.aex
mwe-figure0.dpth
mwe-figure0.log
mwe-figure0.md5
mwe-figure0.pyg
文件*.pygtex
是多餘的。我認為這是因為tikz
系統呼叫處理各個數字的方式,即所有minted
環境都在外部作業中考慮pdflatex
。
關於如何解決這個問題有什麼想法嗎?我是否遺漏/錯誤配置了某些東西?
答案1
這是由於外部化的工作方式所造成的tikz
。如果您查看 PGF/TikZ 手冊,在外部化下的「詳細資料」下(3.0.0 版本手冊中的第 50.4.5 節,第 625 頁),您將看到外部化的工作原理是編譯整個文件對於正在外部化的每個圖像一次。在這個編譯過程中,文檔中與當前圖像無關的所有部分都被「默默地丟棄」。不幸的是,雖然minted
輸出被丟棄後,minted
仍會檢查快取內容是否存在,如果不存在,則建立它。由於外部化圖像的編譯工作方式,minted
無法從主運行中檢測到現有緩存,並將創建一個新緩存。
可能有一些事情可以從側面改進tikz
;我對外部化過程的技術細節了解不夠。從minted
側面看,重複的問題可以透過minted
條件加載來解決(這個需要minted
2.0):
\ifcsname tikzexternalrealjob\endcsname
\usepackage[draft]{minted}
\else
\usepackage[cache]{minted}
\fi
如果巨集\tikzexternalrealjob
存在(如果僅編譯文件以外部化圖像),則將minted
以草稿模式載入。在草稿模式下,不會建立任何外部文件,並且永遠不會呼叫 Python (Pygments)。 (仍會創建未使用的圖像快取目錄...我將tikz
在下一個minted
版本中解決該問題,並可能添加外部化檢測:問題追蹤器.) 如果\tikzexternalrealjob
不存在,則這是正常編譯,並minted
正常進行。