如何防止乳胶内存溢出

时间:2010-04-10 14:41:08

标签: memory memory-management latex macros tex

我有一个制作小图片的乳胶宏。在那张照片中,我需要绘制区域。该区域的边界是二次贝塞尔曲线,该区域将被填充。我不知道该怎么做所以目前我正在通过在里面画出大量贝塞尔曲线来“填充”该区域...

这会降低typeseting的速度,当多次使用宏时(因此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次(可能更多取决于您的乳胶内存设置)。

非常感谢您的帮助

3 个答案:

答案 0 :(得分:3)

我承认我不知道如何管理LaTeX的记忆。但是,LaTeX的绘图框架比旧的图片环境更好,它似乎不支持填充的bezier路径。我想到的两个是现代风格的PGF and Tikz(另见examples)和更古老的Metapost

答案 1 :(得分:3)

由于历史原因,TeX可用的内存位于静态池中,其中分配的大小是硬编码的。您可以将此集重新编译为更大的TeX,并且某些版本允许在运行时配置它。 This FAQ entry discusses更详细一点。

This page讨论在MikTeX中配置内存。根据您使用的发行版,细节会有所不同,但大多数现代TeX发行版都可以进行类似的操作。一些较旧的可能需要您修改源。

答案 2 :(得分:1)

在我看来,我的问题不是简单而且都是解决问题。 使用更高级的图片绘制包作为Little Bobby Tables建议使乳胶能够绘制更多具有一些内存大小的图片(+ - 2倍以上)但是当绘制更多时仍然会出现错误。

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

解决方案是完全重写乳胶,因为我发现只有一个问题导致我的目的不足或使用更好的排版引擎(任何想法?)。当我发现这太难了,我将被迫只是扩大记忆。