加速 latex/lua/tikz

加速 latex/lua/tikz

我有一个相当大的 LaTeX 文档,它使用 lua 生成了大量的 LaTeX 代码(.tex磁盘上的文件很小,但生成的 LaTeX 代码量很大)。编译速度非常慢,大约需要 1 小时。

几乎所有的 TeX 代码都是由几个 lua 函数生成的。目前,我绕过了大部分代码,直到需要时才使用,但我很好奇在渲染完整文档时是否有某种方法可以加快编译过程。

有什么方法可以分析代码并可能加快速度吗?我不确定瓶颈在哪里,但本质上(伪)代码如下所示:

latex:
   for i = 1, n {
      \myluafunction{\arg{i}}
   }

lua:
   function myluafunction(arg) { ... tex.print(result) }

使用 lpeg解析myluafunctionarg,然后使用 生成大量 TikZ 代码tex.print。lua 代码相当复杂。虽然我还没有尝试过,但我相信不能在 中使用编译后的 lua 代码lualatex,即使可以,我也不确定会有多大区别?

我想象tex.print,即使有大量代码,也会相对较快?

显然,使用 TikZ 渲染了很多几何图形。myluafunction本质上打印了一堆 LaTeX TikZ 命令。可能是 TikZ 是这里的问题?

有什么想法通常是什么瓶颈以及如何潜在地改进它?(虚拟驱动器是否可以用于文件.aux等...)

答案1

我猜想瓶颈在于运行代码TikZ。但是,为了通过经验检查是否存在瓶颈,一个可行的选择是复制您正在使用的文件并添加:

function makefile(file)
   f = io.open(file,"w")
   f:write("\\documentclass{article}")
   -- you could put the rest of your preamble here, or just copy paste it later
   f:write("\\begin{document}")
end

和,

function closefile()
   f:write("\\end{document}"}
   f:close()
end

到该lua部分。然后,制作包装纸:

\def\start#1{\directlua{makefile("\luatexluaescapestring{#1}")}}

\def\stop{\directlua{closefile()}}

tex序言中。然后您可以搜索/替换tex.printf:write运行您的文件,如下所示:

\documentclass{article}
\usepackage{luacode}
\begin{luacode*} % or use a .lua file

function makefile(file)
   f = io.open(file,"w")
   f:write("\\documentclass{article}")
   f:write("\\usepackage{...}")
   f:write("\\begin{document}")
end

function closefile()
   f:write("\\end{document}"}
   f:close()
end

--your lua stuff here

\end{luacode*}

\def\start#1{\directlua{makefile("\luatexluaescapestring{#1}")}}
\def\stop{\directlua{closefile()}}

% your other preamble here

\begin{document}
\start{myfile.tex}

% your code

\stop{}
\end{document}

上述的一些变体应该会给你一个可编译的.tex文件。运行它将把lua东西从等式中剔除。因此,如果编译需要近一个小时,你就知道瓶颈在 TikZ 方面,或者至少可以了解运行代码实际占用了多少编译时间,而不是通过 生成代码lua。如果事实证明lua占用了编译时间的很大一部分,以下几个资源可能会帮助你加快速度:

http://www.lua.org/gems/sample.pdf

http://trac.caspring.org/wiki/LuaPerformance

如果您可以确认 TikZ 耗时过长,则应认真考虑使用 TikZ 的外部库或独立包。两者都可以显著加快包含许多 tikz 图片的文档的处理速度(它们针对略有不同的用例进行了优化)。

相关内容