我一直在研究如何加快我的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}}
这将调用mtxrun
ConTeXt 的包装器脚本,该脚本计算文件的 md5 和(并将其存储为filename.md5
),并且仅在存储了 md5 和的情况下才调用程序。这比运行要快vim
,但仍然很慢,因为必须执行新进程(mtxrun
)。为了加快速度,我将整个命令包装在一个命令中,\doifmode{*first}
以便mtxrun
仅在多运行编译的第一次运行期间调用。
为了进一步加快速度,在 MkIV 中,我使用了 ConTeXt lua 函数job.files.run
,它将 md5 存储在tuc
文件中(类似于aux
LaTeX 中的文件)。因此对外部程序的调用大致等于
\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}{}
}
这样,我现在可以使用我的旧draft
documentclass 选项在快速但不完美的编译和缓慢但最终的编译之间切换。
答案3
我目前正在维护minted
,并且刚刚在v2.0alpha 版本. 初步测试表明,速度至少可以提高 5 倍。
在 LuaTeX 和 pdfTeX 下,我使用\pdf@mdfivesum
frompdftexcmds
进行哈希处理。在 XeTeX 下,我使用通过 执行的 Python 脚本\write18
。
答案4
我刚刚遇到了与 minted 包相同的问题。我采用了 Aditya 的缓存方法,想出了一个pygmentize 包装器(仍然很丑,但对我来说有用)。
也许它对某些人有用。