我有一个相当大的 LaTeX 文档,它使用 lua 生成了大量的 LaTeX 代码(.tex
磁盘上的文件很小,但生成的 LaTeX 代码量很大)。编译速度非常慢,大约需要 1 小时。
几乎所有的 TeX 代码都是由几个 lua 函数生成的。目前,我绕过了大部分代码,直到需要时才使用,但我很好奇在渲染完整文档时是否有某种方法可以加快编译过程。
有什么方法可以分析代码并可能加快速度吗?我不确定瓶颈在哪里,但本质上(伪)代码如下所示:
latex:
for i = 1, n {
\myluafunction{\arg{i}}
}
lua:
function myluafunction(arg) { ... tex.print(result) }
使用 lpeg解析myluafunction
arg,然后使用 生成大量 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.print
并f: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 图片的文档的处理速度(它们针对略有不同的用例进行了优化)。