tikz 外部化作業中的鑄造緩存

tikz 外部化作業中的鑄造緩存

啟用快取選項mintedtikz導致意外且低效的快取。對於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條件加載來解決(這個需要minted2.0):

\ifcsname tikzexternalrealjob\endcsname
    \usepackage[draft]{minted}
\else
    \usepackage[cache]{minted}
\fi

如果巨集\tikzexternalrealjob存在(如果僅編譯文件以外部化圖像),則將minted以草稿模式載入。在草稿模式下,不會建立任何外部文件,並且永遠不會呼叫 Python (Pygments)。 (仍會創建未使用的圖像快取目錄...我將tikz在下一個minted版本中解決該問題,並可能添加外部化檢測:問題追蹤器.) 如果\tikzexternalrealjob不存在,則這是正常編譯,並minted正常進行。

相關內容