Cache cunhado no trabalho de externalização do tikz

Cache cunhado no trabalho de externalização do tikz

Opções de cache habilitadas mintedlevam tikza um cache inesperado e ineficiente. Para cada tikzfigura externalizada, todos mintedos blocos de código do documento principal são armazenados em cache no tikzdiretório de cache. Para documentos com, por exemplo, >50 figuras e >100 listagens de códigos, o armazenamento em cache leva muito tempo e utiliza mais espaço em disco do que seria necessário.

Para dar um exemplo, 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}

Isso leva à estrutura de diretórios:

.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

onde os *.pygtexarquivos são redundantes. Presumo que isso se deva à forma como tikzo sistema chama para processar as figuras individuais, ou seja, todos mintedos ambientes são considerados no pdflatextrabalho externo.

Alguma ideia de como resolver isso? Estou faltando/configurando incorretamente alguma coisa?

Responder1

Isso se deve à forma como tikzfunciona a externalização. Se você olhar no manual PGF/TikZ, em externalização, em "Detalhes sobre o processo" (Seção 50.4.5, página 625 do manual da versão 3.0.0), verá que externalizar funciona porcompilando o arquivo inteirouma vez para cada imagem que está sendo externalizada. Durante este processo de compilação, todas as partes do documento não relacionadas à imagem atual são “jogadas fora silenciosamente”. Infelizmente, enquantominted saídafor jogado fora, mintedainda verificará se existe conteúdo em cache e, se não, criará-o. Devido à forma como a compilação funciona para as imagens externalizadas, mintednão será possível detectar o cache existente na execução principal e criará um novo cache.

Pode haver coisas que podem ser melhoradas lateralmente tikz; Não conheço o suficiente sobre os detalhes técnicos do processo de externalização. Do mintedlado de fora, o problema da duplicação pode ser resolvido carregando mintedcondicionalmente (isso precisa mintedde 2.0):

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

Se a macro \tikzexternalrealjobexistir (se o arquivo estiver sendo compilado apenas para externalizar uma imagem), ela será carregada mintedno modo rascunho. No modo rascunho, nenhum arquivo externo é criado e Python (Pygments) nunca será chamado. (Diretórios de cache não utilizados para as imagens ainda serão criados... Verei como consertar isso e possivelmente adicionar tikzdetecção de externalização na próxima mintedversão:rastreador de problemas.) Se \tikzexternalrealjobnão existir, então esta é uma compilação normal e mintedprossegue normalmente.

informação relacionada