Pourquoi l'erreur ''TeX capacity exceeded''?
Si
vous indique cette erreur, il y a de très très fortes
chances pour que votre document soit mal écrit et consomme trop de
mémoire. Il arrive que certains documents produisent cette erreur
alors qu'ils sont bien écrits, par exemple s'ils contiennent des pages
très compliquées, ou s'ils utilisent énormément de fontes, ou s'ils
incluent un nombre faramineux d'images.
La capacité de
est limitée de manière interne. Cela
signifie que ce sont des variables de
qui fixent le nombre de
variables (et la taille mémoire) maximal que
s'autorisera à
utiliser. Si vous utilisez plus de variables que prévu,
s'arrêtera sur le message d'erreur :
sorry, TeX capacity exceeded
suivi du nom de la zone saturée.
Il s'agit d'un reste de l'époque maintenant lointaine où a été
écrit. En ces temps lointains, les systèmes d'exploitation n'étaient
en général pas capable d'allouer de la mémoire à un programme
n'importe quand. Un programme devait donc demander une quantité de
mémoire au début de son exécution, et s'en contenter durant tout le
cours de son exécution.
a donc été écrit pour ne jamais
redemander de mémoire au système. Il en prend une quantité fixée au
démarrage et n'en redemandera plus jusqu'à la fin.
Cette façon de faire permet, en outre, de localiser certains problèmes
très vite. Un document mal écrit, qui consomme trop de mémoire (une
boucle infinie, ou quelque chose comme ça) va provoquer rapidement une
erreur: au moment où il sera arrivé au bout de la mémoire demandée par
– et non pas au moment où il sera arrivé au bout de la mémoire
de la machine et de tout l'espace disque disponible comme mémoire
virtuelle.
Dans les distributions récentes, le fichier
texmf.cnf
contient plusieurs variables qui fixent la taille
mémoire utilisable par ; celle-ci est divisée en plusieurs
zones, chacune de taille fixée au début de la compilation. Par
exemple, la zone qui sert à stocker les fontes n'est pas la même que
celle qui stocke les noms de macros ou les noms de fichiers, ou encore
les contenus des pages, etc. Selon celle qui a saturé pendant la
compilation, il faut adapter certaines tailles. Par exemple, si le
message d'erreur précise
[main memory size=…]
, on peut
augmenter la valeur des variables extra_mem_top
et/ou
extra_mem_bot
(à la rigueur la valeur de
main_memory
mais il faudra alors refaire les formats).
Si le message précise
[pool size=…]
et que le
document comporte un grand nombre de flottants, les buffers de
sont saturés. Une solution consiste alors à vider régulièrement ces
buffers en forçant la place des flottants (par des
\clearpage
par
exemple pour laisser la place nécessaire aux figures…).