在树中使用 TikZ foreach 子项时出现 TeX 内存大小错误

在树中使用 TikZ foreach 子项时出现 TeX 内存大小错误

几乎完全相同: 如何扩展 TeX 的“主内存大小”?(pgfplots 内存过载)


我得到了与其他问题相同的错误,但那里的答案没有解决我的问题。我认为其他问题的错误是由于使用许多同一文件中的图像;我的错误是由于(我认为)内存使用量很大图像本身。因此,外部化解决方案似乎不起作用。

我正在尝试为正在撰写的论文生成树形图。它涉及节点以 3 为单位的指数增长,最高可达 3^8 = 6,561,总共约 9,000 个节点。

以下是代码:

\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{tikz}
\usetikzlibrary{shapes,trees}
\usetikzlibrary{external}
\tikzexternalize

\begin{document}

\begin{tikzpicture}
[grow cyclic,
level 1/.style={level distance=30mm,sibling angle=120},
level 2/.style={level distance=30mm,sibling angle=60},
level 3/.style={level distance=10mm,sibling angle=50},
level 4/.style={level distance=6mm,sibling angle=30},
level 5/.style={level distance=4mm,sibling angle=10},
level 6/.style={level distance=2mm,sibling angle=7},
level 7/.style={level distance=2mm,sibling angle=7},
every node/.style={circle,draw,inner sep=1.5pt},
dot/.style={circle,fill,inner sep=0.5pt}]
\node {\tiny{you!}}
  child foreach \x in {1,2,3} {node[dot] {}
 {child foreach \x in {1,2,3} {node[dot] {}
 {child foreach \x in {1,2,3} {node[dot] {}
 {child foreach \x in {1,2,3} {node[dot] {}
 {child foreach \x in {1,2,3} {node[dot] {}
 {child foreach \x in {1,2,3} {node[dot] {}
 {child foreach \x in {1,2,3} {node[dot] {}}}}}}}}}}}}}};

\end{tikzpicture}

\end{document}

我尝试通过 调用它pdflatex -shell-escape file,但似乎最后一次迭代会终止它。如果我只删除其中一个迭代步骤,它就会生成正常。换句话说,3^6 个节点可以工作,但 3^7 个节点不行。我实际上想转到 3^8。

有什么建议么?


pdflatex -shell-escape file以下是运行时停止的确切错误:

! Package tikz Error: Sorry, the system call 'pdflatex -shell-escape -halt-on-e
rror -interaction=batchmode -jobname "test-figure0" "\def\tikzexternalrealjob{t
est}\input{test}"' did NOT result in a usable output file 'test-figure0' (expec
ted one of .pdf:.jpg:.jpeg:.png:). Please verify that you have enabled system c
alls. For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it is also name
d 'write 18' or something like that. Or maybe the command simply failed? Error 
messages can be found in 'test-figure0.log'. If you continue now, I'll try to t
ypeset the picture.

再次,只使用较少的级别运行就可以很好地编译(没有-shell-escape或外部化),所以我不认为此消息表明我的代码有任何问题,但我可能是错的。

答案1

如果您编译代码时不使用外部化,pdflatex确实会抱怨内存大小超出。一个简单的解决方案是使用lualatex而不是进行编译pdflatex,这似乎没有内存大小限制(或者至少没有足够高的限制)。8 个级别与 LuaLaTeX 完美配合(尽管编译确实需要一些时间)。

对于外部化,你需要告诉 TikZ 使用 LuaLaTex:

\tikzset{external/system call={lualatex \tikzexternalcheckshellescape -halt-on-error
-interaction=batchmode -jobname "\image" "\texsource"}}

答案2

感谢@Caramdir 的建议,但即使使用外部化,我的记忆力也会下降。我认为从我读过的内容来看,如果要生成许多较小的图形,外部化就会起作用;我的图形实际上是一个接近 10,000 个节点/子节点的巨大迭代。

我最终按照说明进行操作这篇博文(当然这个信息也存在于其他地方)增加到 1000 万(从默认的 300 万)。

$ kpsewhich texmf.cnf 然后使用以下命令以 root 身份打开该文件

$ sudo emacs /usr/share/texmf/web2c/texmf.cnf 很可能会提示您输入管理员密码。输入密码并搜索以以下内容开头的行,例如

main_memory = 3000000 % inimemory 可用字数;也适用于 inimf&mp 将值“3000000”更改为“10000000”,即从 300 万更改为 1000 万。保存编辑并退出编辑器。然后发出命令

$ sudo fmtutil-sys --all 并再次编译该书。

我不知道这是否可靠。例如,我使用 Arch Linux,它可能会在下一次 TexLive 更新时覆盖此设置。

但是,就目前而言,解决方案是允许我在树中深度达到 8 级,并且以 3 为单位增长(从 n=0 到 n=8 的总和,共 3^n 个节点)。

相关内容