tikz 外部化ジョブでの Minted キャッシュ

tikz 外部化ジョブでの Minted キャッシュ

およびのキャッシュ オプションを有効にする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ためであると考えられます。tikzmintedpdflatex

これを解決する方法について何かアイデアはありますか? 何かが欠けている/誤って設定されているのでしょうか?

答え1

これは外部化の仕組みによるものですtikz。PGF/TikZマニュアルの外部化の「プロセスの詳細」(バージョン3.0.0マニュアルのセクション50.4.5、625ページ)を見ると、外部化は次のように動作することがわかります。ファイル全体をコンパイルする外部化される画像ごとに1回ずつコンパイルされます。このコンパイルプロセス中、現在の画像に関係のないドキュメントのすべての部分は「黙って破棄されます」。残念ながら、minted 出力破棄されますが、mintedキャッシュされたコンテンツが存在するかどうかを確認し、存在しない場合は作成します。外部化されたイメージのコンパイル方法により、mintedメイン実行から既存のキャッシュを検出できず、新しいキャッシュが作成されます。

側面から改善できる点があるかもしれませんtikz。外部化プロセスの技術的な詳細についてはよくわかっていません。側面から見るとminted、条件付きでロードすることで重複の問題を解決できます(これには2.0mintedが必要です)。minted

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

マクロが\tikzexternalrealjob存在する場合 (ファイルがイメージを外部化するためだけにコンパイルされている場合)、これはドラフト モードで読み込まれます。ドラフト モードでは、外部ファイルは作成されず、Python (Pygments) は呼び出されません。(イメージの未使用のキャッシュ ディレクトリは引き続き作成されます...次のリリースでこれを修正し、外部化検出mintedを追加する予定です。tikzminted問題追跡)\tikzexternalrealjobが存在しない場合は、通常のコンパイルとなり、minted通常どおり続行されます。

関連情報