如何防止LaTeX内存溢出

3
我有一个制作小图片的 LaTeX 宏。在这个图片中,我需要绘制一个区域。该区域的边界是二次贝塞尔曲线,并且需要填充该区域。由于不知道如何实现,所以目前我通过在其中绘制大量的贝塞尔曲线来“填充”该区域... 这会减慢排版速度,当多次使用宏时(因此 TeX 实际上正在绘制大量的二次贝塞尔曲线),会产生以下错误:
! TeX capacity exceeded, sorry [main memory size=3000000].

我该如何防止这个错误?(通过在宏或其他操作后释放内存...)甚至更好的方法是如何填充由两个二次贝塞尔曲线确定的区域?

导致错误的代码:

\usepackage{forloop}
\usepackage{picture}
\usepackage{eepic}
...
\linethickness{\lineThickness\unitlength}%
\forloop[\lineThickness]{cy}{\cymin}{\value{cy} < \cymax}{%
  \qbezier(\ax, \ay)(\cx, \value{cy})(\bx, \by)%
}%

以下是一些变量的示例值:
\setlength{\unitlength}{0.01pt}
\lineThickness=20
%cy is just a counter - inital value is not important
\cymin=450 \cymax=900
%from following only the difference between \ax and \bx is important
\ax=0 \ay=0 \bx=550 \by=0

注:为了重现错误,此代码需要执行约150次(根据您的LaTeX内存设置可能更多)。

非常感谢任何帮助。


你使用哪个文本发行版?在哪个操作系统上? - Jack
我正在使用MiKTex 2.8、Latex2e、XeLatex和Windows 7。 - Rasto
3个回答

3

我承认我不知道如何管理LaTeX的内存。然而,对于LaTeX而言,有比旧的picture环境更好的绘图框架,似乎也不支持填充的贝塞尔路径。其中两个我想到的是现代风格的PGF和Tikz(另请参见示例)和更古老的Metapost


谢谢您的建议。我已经写了相当多的代码,所以学习新的包并重新编写所有内容对我来说似乎是很多工作。我更喜欢另一种解决方案。 - Rasto
无论如何,这是我迄今为止找到的最佳选择,因此我正在使用PGF和Tikz重写整个内容。我认为这对我来说是最好的解决方案,并且回答了问题。 - Rasto
所以我错了。我已经用PGF和Tikz重写了整个包,但仍然出现错误。我需要比以前更多次地使用宏,但是如果我绘制足够多的图表,我仍然会遇到相同的错误。 - Rasto

3
由于历史原因,TeX可用的内存位于静态池中,其分配大小已硬编码。您可以重新编译TeX并将其设置为更大的大小,某些版本允许在运行时进行配置。此FAQ条目稍微详细地讨论了它。 此页面讨论了在MikTeX中配置内存的方法。根据您使用的发行版,细节会有所不同,但大多数现代TeX发行版都可以进行类似的操作。一些较旧的版本可能需要您修改源代码。

谢谢你的提示。我相信它们对我或者其他人来说都会有用处。 - Rasto

1

在我看来,我的问题似乎没有简单而全面的答案。像Little Bobby Tables建议的使用更高级的图片绘制包可以使latex能够绘制更多的图片,并且具有一些内存大小(+- 2倍),但是当绘制超过这个数量时,错误仍然会发生。

像ConcernedOfTunbridgeWells建议的扩大内存然后重新编译是我想避免的。它也与Little Bobby的建议有同样的问题:你可以将其扩大100倍,但当排版100倍长的文档时,它仍然不足。

解决方案是完全重写latex,因为我发现这只是使其不足以满足我的目的或使用更好的排版引擎(有任何想法吗?)。由于我认为这太难了,所以我将被迫扩大内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接