![tikz 外部化作业中的 Minted 缓存](https://linux22.com/image/309866/tikz%20%E5%A4%96%E9%83%A8%E5%8C%96%E4%BD%9C%E4%B8%9A%E4%B8%AD%E7%9A%84%20Minted%20%E7%BC%93%E5%AD%98.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 手册中的外部化部分,在“有关该过程的详细信息”(版本 3.0.0 手册中的第 50.4.5 节,第 625 页)下,你会看到外部化的工作原理是编译整个文件每张被外部化的图像都会被编译一次。在此编译过程中,文档中与当前图像无关的所有部分都会被“悄悄丢弃”。不幸的是,虽然minted
输出被丢弃,minted
仍将检查缓存内容是否存在,如果不存在,则创建缓存。由于外部化图像的编译方式,minted
无法从主运行中检测到现有缓存,因此将创建新缓存。
从侧面看,可能有些地方可以改进tikz
;我对外部化过程的技术细节了解不够。从侧面看minted
,可以通过有条件加载来解决重复问题minted
(这需要minted
2.0):
\ifcsname tikzexternalrealjob\endcsname
\usepackage[draft]{minted}
\else
\usepackage[cache]{minted}
\fi
如果宏\tikzexternalrealjob
存在(如果文件仅被编译用于外部化图像),则它将以草稿模式加载。在草稿模式下,不会创建任何外部文件,并且永远不会调用 Python(Pygments)。(仍将创建未使用的图像缓存目录……我将在下一篇文章中minted
考虑修复该问题,并可能添加外部化检测tikz
minted
外部化检测:问题追踪器.)如果\tikzexternalrealjob
不存在,那么这是一次正常编译,并且minted
正常进行。