Si te encuentras con alguna parte que no entiendes puedes dejarlo en la sección de comentarios y te responderemos rápidamente.
Solución:
pdfTeX
Las páginas se almacenan en una estructura de página, un árbol equilibrado. El nodo superior contiene un número entero con el número de páginas. El número entero máximo en PDF y TeX es 231−1 (2.147.483.647). Sin embargo, se necesitan objetos indirectos para almacenar páginas en formato PDF (especificación PDF):
- 1 nodo de página por página;
- 1 Objeto de recursos por página (pdfTeX genera el objeto para cada página, incluso si los objetos de recurso son los mismos y se pueden compartir);
- 1 Objeto de contenido por página (en teoría, páginas iguales podrían compartir el mismo objeto, pero no es compatible con pdfTeX y es poco probable que se trate de documentos reales).
- Sobrecarga de la estructura del árbol de la página con nodos adicionales para niños;
- Y el documento tiene algunos objetos adicionales (por ejemplo, catálogo, información).
Por tanto, se necesitan más de 3 objetos indirectos por página. Pero el número de objetos indirectos (los objetos indirectos son objetos PDF a los que se puede hacer referencia mediante el número de objeto y se registran en la sección de referencia cruzada) es limitado: 223−1 (8.388.607).
El siguiente archivo de prueba explora el número máximo de páginas con pdfTeX. Solo genera páginas mínimas sin fuentes, anotaciones. Las páginas están completamente vacías (shipouthbox
).
% pdftex --ini test.tex
catcode`=1
catcode`=2
pdfoutput=1
iffalse
pdfobjcompresslevel=2
pdfcompresslevel=9
else
pdfobjcompresslevel=0
pdfcompresslevel=0
fi
pdfminorversion=5
countdefpageno=0
chardefone=1
countdefmax=255
max=2621437
defx%
advancepagenoone
shipouthbox%
ifnummax=pageno
letxrelax
fi
x
x
end
Probado con pdfTeX 3.1415925-2.4-1.40.13 (TeX Live 2012). Resultado:
Pages: 2,621,437
File size: 862,082,448 bytes
PDF without object stream compression
Si el número de página aumenta en uno, pdfTeX se queja con un mensaje de error:
! TeX capacity exceeded, sorry [indirect objects table size=8388607].
La compresión de secuencias de objetos PDF de PDF-1.5 reduce el tamaño del archivo, pero cuesta objetos indirectos para almacenar las secuencias de objetos. Eso disminuye el número máximo de páginas. Para probar, reemplace iffalse
por iftrue
en el ejemplo anterior y juegue con la configuración de max
. Resultado:
Pages: 2,603,538
File size: 329,412,496
PDF with object stream compression
En la práctica, especialmente las anotaciones cuestan objetos (y por lo tanto páginas), mientras que las fuentes se pueden reutilizar en todo el documento.
Resumen
El número máximo teórico de páginas para archivos PDF con pdfTeX es 2,621,437 (páginas vacías y sin compresión de flujo de objetos de PDF-1.5).
LuaTeX 0.95.0
LuaTeX derivado de pdfTeX, por lo que la página vacía utiliza la misma cantidad de objetos que en el caso de pdfTeX. El árbol de páginas se almacena con menos objetos, porque pdfTeX usa 6 niños en un nodo de árbol de páginas, pero LuaTeX ha aumentado el número a 10 niños por nodo de árbol de páginas.
Por lo tanto, LuaTeX puede crear un poco más de páginas. La limitación estricta es la cantidad de objetos indirectos en el archivo PDF (223-1).
Archivo de prueba para LuaTeX 0.95.0 con opción --ini
:
catcode`=1
catcode`=2
directluatex.enableprimitives("","outputmode")
outputmode=1
directlua
iffalse
pdf.setobjcompresslevel(2)
pdf.setcompresslevel(9)
else
pdf.setobjcompresslevel(0)
pdf.setcompresslevel(0)
fi
pdf.setminorversion(5)
countdefpageno=0
chardefone=1
countdefmax=255
max=2696336
defx%
advancepagenoone
shipouthbox%
ifnummax=pageno
letxrelax
fi
x
x
end
Resultado:
Pages: 2,696,336
File size: 821,034,398 bytes
PDF without object stream compression
Resumen
LuaTeX puede generar un documento PDF con 2.696.336 páginas vacías.
XeTeX
XeTeX usa el programa xdvipdfmx
como controlador de salida para PDF. Genera el archivo PDF con páginas vacías de forma similar a pdfTeX o LuaTeX. Sin embargo, utiliza más nodos (objetos indirectos) para el árbol de la página que los otros compiladores de TeX. La ejecución de LuaTeX con 2,400,000 páginas tomó casi un minuto, pero la ejecución de XeTeX alrededor de 18 minutos.
Archivo de prueba:
catcode`=1
catcode`=2
countdefpageno=0
chardefone=1
countdefmax=255
max=2400000
defx%
advancepagenoone
shipouthbox%
ifnummax=pageno
letxrelax
fi
x
x
end
Llamada de comando con opciones para desactivar la compresión:
xetex -ini -output-driver="xdvipdfmx -C 0x0040 -z 0" test.tex
2.400.001 páginas generan el mensaje de error:
xdvipdfmx:fatal: Page number 2400002l too large!
Tamaño de archivo con 2,400,000 páginas vacías: 901,335,935 bytes
La versión de XeTeX es 3.14159265-2.6-0.99996 (TeX Live 2016)
y la versión de xdvipdfmx es 20160307
.
Resumen
XeTeX puede generar un documento PDF con 2,400,000 páginas vacías, pero es mucho más lento que pdfTeX o LuaTeX.
TeX está diseñado para tener requisitos de memoria muy limitados (básicamente, una vez que se envía una página, desaparece). longtable
documentos con decenas de miles de páginas en la década de 1990, así que en las máquinas modernas no creo que 170 páginas estresen demasiado el sistema.
Lo que es más importante que el recuento de páginas es la complejidad de la página: si tiene una trama de alta resolución hecha en tikz o en modo de imagen o algo así, eso termina siendo una gran cantidad de cajas en la misma pagina. Es por eso que a veces ayuda generar elementos como la inclusión de gráficos externos. A menos que cambien en cada ejecución, esto generalmente acelerará las cosas incluso si calcularlos en línea no excede los requisitos de memoria.
Aparte de los límites arquitectónicos de PDF (el número de objetos indirectos en un PDF está limitado a 8Mi según ISO-32000: 2008, y los números están limitados a 2Gi), no existen límites conocidos. Si la memoria lo permite y su disco es lo suficientemente grande, pdfTeX debería poder generar PDF hasta algunos TiBytes. Eventualmente fallará; el tamaño de compensación en la tabla de referencias externas comprimida está actualmente limitado a 240(5 bytes), pero ampliar ese límite es fácil.