Almacenamiento en caché acuñado en el trabajo de externalización de tikz

Almacenamiento en caché acuñado en el trabajo de externalización de tikz

Opciones de almacenamiento en caché habilitadas mintedy tikzconducen a un almacenamiento en caché inesperado e ineficiente. Por cada tikzfigura que se externaliza, todos mintedlos bloques de código del documento principal se almacenan en caché dentro del tikzdirectorio de caché. Para documentos con, por ejemplo, >50 cifras y >100 listados de códigos, el almacenamiento en caché lleva mucho tiempo y utiliza más espacio en disco del que sería necesario.

Para dar un ejemplo, considere este 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}

Esto lleva a la estructura del directorio:

.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

donde los *.pygtexarchivos son redundantes. Supongo que esto se debe a la forma en tikzque el sistema llama para procesar las figuras individuales, es decir, todos mintedlos entornos se consideran en el pdflatextrabajo externo.

¿Alguna idea de como resolver esto? ¿Me falta o estoy configurando mal algo?

Respuesta1

Esto se debe a la forma en que tikzfunciona la externalización. Si busca en el manual de PGF/TikZ, en externalización, en "Detalles sobre el proceso" (Sección 50.4.5, página 625 en el manual de la versión 3.0.0), verá que externalizar funciona mediantecompilando el archivo completouna vez por cada imagen que se exterioriza. Durante este proceso de compilación, todas las partes del documento que no están relacionadas con la imagen actual se "desechan silenciosamente". Desafortunadamente, mientrasminted producciónse desecha, mintedseguirá comprobando si existe contenido en caché y, si no, lo creará. Debido a la forma en que funciona la compilación para las imágenes externalizadas, mintedno se puede detectar el caché existente desde la ejecución principal y se creará un nuevo caché.

Puede haber cosas que se puedan mejorar desde el tikzexterior; No sé lo suficiente sobre los detalles técnicos del proceso de externalización. Desde un mintedlado, el problema de la duplicación se puede resolver cargando mintedcondicionalmente (esto necesita minted2.0):

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

Si la macro \tikzexternalrealjobexiste (si el archivo se está compilando únicamente para externalizar una imagen), se cargará minteden modo borrador. En el modo borrador, no se crean archivos externos y nunca se llamará a Python (Pygments). (Se seguirán creando directorios de caché no utilizados para las imágenes... Veré cómo solucionarlo y posiblemente agregar tikzdetección de externalización en la próxima mintedversión:rastreador de problemas.) Si \tikzexternalrealjobno existe, entonces se trata de una compilación normal y mintedcontinúa normalmente.

información relacionada