Кэширование Minted в tikz выводит работу на внешний уровень

Кэширование Minted в tikz выводит работу на внешний уровень

Включенные параметры кэширования для 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файлы избыточны. Я предполагаю, что это из-за способа, tikzкоторым система вызывает обработку отдельных фигур, т. е. все mintedсреды рассматриваются во внешнем pdflatexзадании.

Есть идеи, как это решить? Я что-то упускаю/неправильно настраиваю?

решение1

Это связано с тем, как tikzработает экстернализация. Если вы посмотрите в руководстве PGF/TikZ, в разделе экстернализация, в разделе «Подробности о процессе» (Раздел 50.4.5, страница 625 в руководстве версии 3.0.0), вы увидите, что экстернализация работаеткомпиляция всего файлаодин раз для каждого изображения, которое выводится наружу. Во время этого процесса компиляции все части документа, не связанные с текущим изображением, "молчаливо отбрасываются". К сожалению, в то время какminted выходотбрасывается, mintedвсе равно проверит, существует ли кэшированное содержимое, и если нет, создаст его. Из-за того, как компиляция работает для внешних изображений, mintedне может обнаружить существующий кэш из основного прогона и создаст новый кэш.

Возможно, есть вещи, которые можно улучшить со tikzстороны; я не знаю достаточно о технических деталях процесса экстернализации. Со стороны minted, проблема дублирования может быть решена mintedусловной загрузкой (для этого нужна mintedверсия 2.0):

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

Если макрос \tikzexternalrealjobсуществует (если файл компилируется исключительно для экстернализации изображения), он загрузится mintedв черновом режиме. В черновом режиме внешние файлы не создаются, и Python (Pygments) никогда не будет вызываться. (Неиспользуемые каталоги кэша для изображений все равно будут созданы... Я посмотрю, как это исправить и, возможно, добавить tikzобнаружение экстернализации в следующем mintedвыпуске:трекер проблем.) Если \tikzexternalrealjobне существует, то это обычная компиляция, и mintedона продолжается нормально.

Связанный контент