3

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

这会减慢排版速度,并且当多次使用宏时(因此 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 次(可能更多,具体取决于您的乳胶内存设置)。

非常感谢您的帮助

4

3 回答 3

3

我承认我不知道如何管理 LaTeX 的内存。但是,LaTeX 有比旧的图片环境更好的绘图框架,它似乎不支持填充的贝塞尔路径。想到的两个是现代风格的PGF 和 Tikz(另见示例)以及更古老的Metapost

于 2010-04-10T15:09:35.927 回答
3

由于历史原因,TeX 可用的内存位于一个静态池中,其中分配的大小是硬编码的。您可以使用此设置重新编译 TeX 为更大的大小,并且某些版本允许在运行时对其进行配置。 此常见问题解答条目更详细地讨论了它。

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

于 2010-04-10T15:23:56.963 回答
1

在我看来,我的问题并没有简单而全面的答案。正如 Little Bobby Tables 所建议的那样,使用更高级的绘图包会导致乳胶能够以一定的内存大小(+ - 2 倍以上)绘制更多图片,但是当绘制更多图片时,仍然会发生错误。

正如 ConcernedOfTunbridgeWells 建议的那样扩大内存然后重新编译是我想要避免的。它也和小鲍比的建议有同样的问题:你可以把它放大100倍,但是当排版100倍长的文档时,它又不够用了。

解决方案是完全重写乳胶,因为我发现这只是使其不足以满足我的目的的问题之一,或者使用一些更好的排版引擎(有什么想法吗?)。因为我觉得这太难了,所以我将被迫扩大记忆。

于 2010-04-24T16:48:10.003 回答