加速 Minted 编译

加速 Minted 编译

我一直在研究如何加快我的pdflatex编译时间,现在速度非常快。

只有一件事仍然非常慢:使用minted包编译源代码。

我想知道是否没有办法加快这个速度(也许像只需要运行一次然后包含结果的tikz外部化)。\tikzexternalize

我正在考虑创建一个新环境,将minted环境放在环境内部tikz,以便可以应用规则\tikzexternalize,但我还没有真正弄清楚如何做到这一点(简单地将其放在 tike 节点内部是行不通的)。

答案1

我是 ConTeXt 模块的作者t-vim它类似于,minted但使用vim而不是pygmentize生成语法突出显示。该t-vim模块实际上将运行外部程序的任务委托给t-filter模块,它提供了在环境内容上调用外部程序所需的管道。

默认情况下,该t-filter模块的行为与包相同minted:它将环境的内容写入外部文件,调用外部程序,并将结果输入回 TeX。但是,为了处理速度慢的外部程序,过滤器模块提供了一个continue=yes选项。启用此选项后,每个文件的内容都会写入单独文件并计算每个文件的 md5 值。只有当 md5 值发生变化时,才会运行外部过滤器。

在 MkII 中,此功能可通过使用以下方式调用外部程序来启用

 \doifmode{*first}
    {\executeexternalcommand{mtxrun --ifchanged=\inputfile \externalprogram}}

这将调用mtxrunConTeXt 的包装器脚本,该脚本计算文件的 md5 和(并将其存储为filename.md5),并且仅在存储了 md5 和的情况下才调用程序。这比运行要快vim,但仍然很慢,因为必须执行新进程(mtxrun)。为了加快速度,我将整个命令包装在一个命令中,\doifmode{*first}以便mtxrun仅在多运行编译的第一次运行期间调用。

为了进一步加快速度,在 MkIV 中,我使用了 ConTeXt lua 函数job.files.run,它将 md5 存储在tuc文件中(类似于auxLaTeX 中的文件)。因此对外部程序的调用大致等于

 \ctxlua{job.files.run("\inputfile", "\externalprogram")}

原则上,同样的方法可以在 中实现minted。事实上,该mtxrun --ifchanged方法可以很容易地纳入,假设 minted 将每个环境写入单独的文件中(目前它还不这么做)。

答案2

在我现在正在编辑的文档中,我有大约二十个代码清单,这导致编译速度非常慢(大约 10 秒)。

但是,如果我从序言中删除这几行:

\usepackage{minted}
\newminted{c}{}

我添加了这些:

\usepackage{fancyvrb}
\DefineVerbatimEnvironment{ccode}{Verbatim}{}

然后编译时间会降到 1 秒以下,这确实可以接受。而且我得到的输出几乎相同(虽然显然没有颜色 :-),因为\fvset“指令”不需要更改。

我想知道这种技巧是否可以集成到 minted 本身中,例如以选项的形式draft?(就像 graphicx 或 beamer 等软件包尊重draft加快编译速度的选项一样)

编辑:我刚刚意识到我也可以使用草案包(感谢 tex.SE !)。我的序言现在包含以下代码片段:

\usepackage{ifdraft}
\ifdraft{
  \usepackage{fancyvrb}
  \DefineVerbatimEnvironment{ccode}{Verbatim}{}
}{
  \usepackage{minted} % syntax coloring. 
  \newminted{c}{}
}

这样,我现在可以使用我的旧draftdocumentclass 选项在快速但不完美的编译和缓慢但最终的编译之间切换。

答案3

我目前正在维护minted,并且刚刚在v2.0alpha 版本. 初步测试表明,速度至少可以提高 5 倍。

在 LuaTeX 和 pdfTeX 下,我使用\pdf@mdfivesumfrompdftexcmds进行哈希处理。在 XeTeX 下,我使用通过 执行的 Python 脚本\write18

答案4

我刚刚遇到了与 minted 包相同的问题。我采用了 Aditya 的缓存方法,想出了一个pygmentize 包装器(仍然很丑,但对我来说有用)。

也许它对某些人有用。

相关内容