pdfTeX

pdfTeX

pdflatex该命令对于输入文件的页数是否存在一些限制?

我编纂时的最高页数是 90 页,没有任何问题。(2008 年)

目前正在准备另一份文件,总长约 170 页。

编辑:感谢大家的回答。它们很有帮助。

答案1

TeX 的设计对内存的要求非常有限(基本上一页被发送出去后就没了)longtable,早在 1990 年代我就有人生成过包含数万页的文档,因此在现代机器上,我认为 170 页不会给系统带来太大压力。

比页数更重要的是页面复杂度:如果你用 tikz 或图片模式或类似方式制作了一个高分辨率的图,那么最终会变成一堆可怕的方框在同一页上。这就是为什么有时生成诸如要包含的外部图形之类的东西会有所帮助。除非它们在每次运行时都会发生变化,否则即使内联计算它们不超过内存要求,这通常会加快速度。

答案2

pdfTeX

页面存储在页面结构中,即平衡树。顶部节点包含一个整数,表示页面数。PDF 和 TeX 中的最大整数为 2 31 −1(2,147,483,647)。但是,需要间接对象来存储 PDF 格式的页面(PDF 规范):

  • 每页 1 个 Page 节点;
  • 每页 1 个资源对象(pdfTeX 为每个页面生成对象,即使资源对象相同且可以共享);
  • 每页 1 个内容对象(理论上相同的页面可以共享同一个对象,但 pdfTeX 不支持,并且真实文档也不太可能支持)。
  • 带有附加子节点的页面树结构的开销;
  • 并且该文档还有一些附加对象(例如目录、信息)。

因此每页需要 3 个以上的间接对象。但间接对象(间接对象是可以通过对象编号引用并记录在交叉引用部分中的 PDF 对象)的数量是有限的:2 23 −1(8,388,607)。

以下测试文件探索了 pdfTeX 的最大页面数。它仅生成最小页面,没有字体和注释。页面完全是空的(\shipout\hbox{})。

% pdftex --ini test.tex
\catcode`\{=1
\catcode`\}=2
\pdfoutput=1
\iffalse
  \pdfobjcompresslevel=2
  \pdfcompresslevel=9
\else
  \pdfobjcompresslevel=0
  \pdfcompresslevel=0
\fi
\pdfminorversion=5
\countdef\pageno=0
\chardef\one=1
\countdef\max=255
\max=2621437
\def\x{%
  \advance\pageno\one
  \shipout\hbox{}%
  \ifnum\max=\pageno
    \let\x\relax
  \fi
  \x
}
\x
\end

使用 pdfTeX 3.1415925-2.4-1.40.13 (TeX Live 2012) 进行测试。结果:

Pages: 2,621,437
File size: 862,082,448 bytes
PDF without object stream compression

如果页码增加一,则 pdfTeX 会发出错误消息:

! TeX capacity exceeded, sorry [indirect objects table size=8388607].

PDF-1.5 的 PDF 对象流压缩会减小文件大小,但会消耗间接对象来存储对象流。这会减少最大页数。为了进行测试,请将上例中的 替换为 ,\iffalse\iftrue使用 的设置\max。结果:

Pages: 2,603,538
File size: 329,412,496
PDF with object stream compression

实际上,注释尤其会耗费对象(因此也会耗费页面),而字体可以在整个文档中重复使用。

概括

带有 pdfTeX 的 PDF 文件的理论最大页数为2,621,437(空白页且没有 PDF-1.5 的对象流压缩)。

LuaTeX 0.95.0

LuaTeX 源自 pdfTeX,因此空页面使用的对象数量与 pdfTeX 相同。页面树存储的对象数量较少,因为 pdfTeX 在页面树节点中使用 6 个子节点,但 LuaTeX 将每个页面树节点的对象数量增加到 10 个子节点。

因此,LuaTeX 可以创建更多页面。硬性限制是 PDF 文件中间接对象的数量 (2 23 -1)。

LuaTeX 0.95.0 的测试文件带有选项--ini

\catcode`\{=1
\catcode`\}=2
\directlua{tex.enableprimitives("",{"outputmode"})}
\outputmode=1
\directlua{
  \iffalse
     pdf.setobjcompresslevel(2)
     pdf.setcompresslevel(9)
  \else
    pdf.setobjcompresslevel(0)
    pdf.setcompresslevel(0)
  \fi
  pdf.setminorversion(5)
}
\countdef\pageno=0
\chardef\one=1
\countdef\max=255
\max=2696336
\def\x{%
  \advance\pageno\one
  \shipout\hbox{}%
  \ifnum\max=\pageno
    \let\x\relax
  \fi
  \x
}
\x
\end

结果:

Pages: 2,696,336
File size: 821,034,398 bytes
PDF without object stream compression

概括

LuaTeX 可以使用以下方式生成 PDF 文档2,696,336空白页。

特克斯

XeTeX 使用该程序xdvipdfmx作为 PDF 的输出驱动程序。它以与 pdfTeX 或 LuaTeX 类似的方式生成带有空白页的 PDF 文件。但是,它比其他 TeX 编译器使用更多的页面树节点(间接对象)。LuaTeX 运行 2,400,000 页需要近一分钟,而 XeTeX 运行大约 18 分钟。

测试文件:

\catcode`\{=1
\catcode`\}=2
\countdef\pageno=0
\chardef\one=1
\countdef\max=255
\max=2400000
\def\x{%
  \advance\pageno\one
  \shipout\hbox{}%
  \ifnum\max=\pageno
    \let\x\relax
  \fi
  \x
}
\x
\end

带有关闭压缩选项的命令调用:

xetex -ini -output-driver="xdvipdfmx -C 0x0040 -z 0" test.tex

2,400,001 页生成错误消息:

xdvipdfmx:fatal: Page number 2400002l too large!

包含 2,400,000 个空白页的文件大小:901,335,935 字节

XeTeX 的版本是3.14159265-2.6-0.99996 (TeX Live 2016),xdvipdfmx 的版本是20160307

概括

XeTeX 可以使用以下方式生成 PDF 文档2,400,000空白页,但它比 pdfTeX 或 LuaTeX 慢得多。

答案3

除了 PDF 的架构限制(根据 ISO-32000:2008,PDF 中的间接对象数量限制为 8Mi,数字限制为 2Gi)外,没有已知的限制。如果内存允许并且您的磁盘足够大,pdfTeX 应该能够生成最多几 TiBytes 的 PDF。它最终会失败——压缩 xref 表中的偏移大小目前限制为 2 40(5 字节)——但扩展该限制很容易。

答案4

几年前,我编译了一份Beamer有 10,000 页和 30,000 个公式的文档,没有任何问题。一位同事的博士论文也编译得很好:1,500 页,其中 1,300 页是整页图像,每页有 5-10 行标题,最终生成一个 4.5 GB 的 PDF 文件。

因此在可以想象的范围内没有限制。

但是,您可能会遇到并发辅助文件数量的限制。创建数百个不同的索引或浮点列表可能会导致这些限制出现问题。我记得 TeX 可以写入的并发文件流有 17 个。

相关内容