![Кэширование Minted в tikz выводит работу на внешний уровень](https://rvso.com/image/309866/%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20Minted%20%D0%B2%20tikz%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83%20%D0%BD%D0%B0%20%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B8%D0%B9%20%D1%83%D1%80%D0%BE%D0%B2%D0%B5%D0%BD%D1%8C.png)
Включенные параметры кэширования для 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
она продолжается нормально.