TeX 的杂耍技巧有多厉害?

TeX 的杂耍技巧有多厉害?

我最近改编了pgfpages它允许人们收集几个排版页面,然后按照某种布局将它们布置在几个物理页面上(原始版本pgfpages只允许一个物理页面)。考虑到其他可能的扩展,我开始想知道 TeX 一次可以在内存中保存多少个排版页面。在对 Village 的自我回答的评论中如何对页面顺序进行排序以便可以将其打印在折叠书中?,有迹象表明 TeX 在实际发送任何页面之前可以保存大量页面。当我想到我对 PDF 文档的了解甚少时,似乎 TeX 必须处理整个文档才能实际将单个页面写入输出(我相信 PDF 必须在开始时说明它有多长)。

PGFPages 的工作方式是将页面存储在盒子中,因此这可能与 TeX 在将页面写入文件之前存储实际页面的方式略有不同。如果不同,我更感兴趣的是 TeX 一次可以容纳多少个盒子。

我意识到这也可能与系统有关,在这种情况下,我想了解它是如何依赖的,以及“stock TeX”可以做什么,因为我不想仅仅为了这种杂耍能力而修改内存能力。

那么 TeX 在面临丢失它们的风险之前可以处理多少个盒子呢?

答案1

在限制范围内,您可以调整分配内存的大小,texmf.cnf但使用未修改的默认 TL2012 显示默认值(后续版本应该有类似的值)

$ pdftex "\def\n{100}\input box.tex"
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
 restricted \write18 enabled.
entering extended mode
(./box.tex )
No pages of output.
Transcript written on box.log.

这样就可以了,但要增加 10 倍,

$ pdftex "\def\n{1000}\input box.tex"
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
 restricted \write18 enabled.
entering extended mode
(./box.tex
! TeX capacity exceeded, sorry [main memory size=3000000].
\body ->\hbox {}
                \advance \a 1 \ifnum \a < 1000 
\next ->\body 
              \let \next \iterate \else \let \next \relax \fi \next 
\kbox ...{}\advance \a 1 \ifnum \a < 1000 \repeat 
                                                  }
\body ->\hbox {\kbox 
                     }\advance \a 1 \ifnum \a < \n 
\next ->\body 
              \let \next \iterate \else \let \next \relax \fi \next 
l.17 \repeat
            }
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on box.log.

测试文件如下所示:

\newcount\a

\def\kbox{{\a=0
\loop
\hbox{}%
\advance\a 1
\ifnum\a< 1000
\repeat}}


\setbox0\hbox{%
\a=0
\loop
\hbox{\kbox}%
\advance\a 1
\ifnum\a < \n
\repeat}

\bye

另一方面,如果你切换引擎,则需要一段时间,但是:

$ time luatex "\def\n{10000}\input box.tex"
This is LuaTeX, Version beta-0.70.2-2012062812 (TeX Live 2012)
 restricted \write18 enabled.
(./box.tex )
No pages of output.
Transcript written on box.log.

real    0m17.010s
user    0m15.381s
sys     0m1.575s

但如果你运气太好的话:

$ time luatex "\def\n{100000}\input box.tex"
This is LuaTeX, Version beta-0.70.2-2012062812 (TeX Live 2012)
 restricted \write18 enabled.
(./box.tex
! TeX capacity exceeded, sorry [node memory size=197283195].
\body ->\hbox {}
                \advance \a 1 \ifnum \a < 1000 
\next ->\body 
              \let \next \iterate \else \let \next \relax \fi \next 
\kbox ...{}\advance \a 1 \ifnum \a < 1000 \repeat 
                                                  }
\body ->\hbox {\kbox 
                     }\advance \a 1 \ifnum \a < \n 
\next ->\body 
              \let \next \iterate \else \let \next \relax \fi \next 
l.17 \repeat
            }
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on box.log.

real    0m56.810s
user    0m33.539s
sys     0m4.055s

答案2

当我开发booklet将页面放入框中并在处理一定数量的页面后一次性输出所有框的软件包时,我注意到 TeX 可以处理的框数量取决于页面的内容。框中的页面越复杂,内存溢出前的框就越少。我从未量化过这种关系。因此,根据 David 的回答,我的观点是:这完全取决于情况。

相关内容