
Aktivierte Caching-Optionen für minted
und tikz
führen zu unerwartetem und ineffizientem Caching. Für jede tikz
ausgelagerte Abbildung minted
werden alle Codeblöcke des Hauptdokuments im tikz
Cache-Verzeichnis zwischengespeichert. Bei Dokumenten mit z. B. >50 Abbildungen und >100 Codeauflistungen dauert das Caching lange und verbraucht mehr Speicherplatz als nötig wäre.
Als Beispiel betrachten wir dieses 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}
Daraus ergibt sich die Verzeichnisstruktur:
.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
wo die *.pygtex
Dateien redundant sind. Ich vermute, das liegt an der Art und Weise, tikz
wie der Systemaufruf die einzelnen Zahlen verarbeitet, d. h. alle minted
Umgebungen werden im externen pdflatex
Job berücksichtigt.
Irgendwelche Ideen, wie man das Problem lösen kann? Übersehe/konfiguriere ich etwas falsch?
Antwort1
Dies liegt an der Art und Weise, wie tikz
Externalisierung funktioniert. Wenn Sie im PGF/TikZ-Handbuch unter Externalisierung unter „Details zum Prozess“ nachsehen (Abschnitt 50.4.5, Seite 625 im Handbuch der Version 3.0.0), werden Sie sehen, dass Externalisierung funktioniert, indemKompilieren der gesamten Dateieinmal für jedes Bild, das ausgelagert wird. Während dieses Kompilierungsprozesses werden alle Teile des Dokuments, die nicht mit dem aktuellen Bild in Zusammenhang stehen, „stillschweigend weggeworfen“. Leiderminted
Ausgabewird verworfen, minted
prüft aber trotzdem, ob zwischengespeicherter Inhalt vorhanden ist, und erstellt ihn, wenn nicht. Aufgrund der Art und Weise, wie die Kompilierung für die ausgelagerten Bilder funktioniert, minted
kann der vorhandene Cache beim Hauptlauf nicht erkannt werden und erstellt einen neuen Cache.
Es gibt vielleicht Dinge, die von der Seite aus verbessert werden können tikz
; ich weiß nicht genug über die technischen Details des Externalisierungsprozesses. Von der Seite aus kann das Problem der Duplizierung durch bedingtes minted
Laden gelöst werden (dafür ist 2.0 erforderlich):minted
minted
\ifcsname tikzexternalrealjob\endcsname
\usepackage[draft]{minted}
\else
\usepackage[cache]{minted}
\fi
Wenn das Makro \tikzexternalrealjob
vorhanden ist (wenn die Datei nur kompiliert wird, um ein Bild zu externalisieren), wird es minted
im Entwurfsmodus geladen. Im Entwurfsmodus werden keine externen Dateien erstellt und Python (Pygments) wird nie aufgerufen. (Ungenutzte Cache-Verzeichnisse für die Bilder werden weiterhin erstellt... Ich werde versuchen, das tikz
in der nächsten Version zu beheben und möglicherweise eine Externalisierungserkennung hinzuzufügen minted
:Problemverfolgung.) Wenn \tikzexternalrealjob
es nicht vorhanden ist, handelt es sich um eine normale Kompilierung, die minted
normal fortgesetzt wird.