Que signifie l’erreur : « No room for a new ⟨registre⟩ » ?#

Message:

No room for a new ⟨registre⟩

Origine:

Les extensions chargées dans le document demandent plus de registres internes que ce que peut proposer. Il faut compiler le document avec et charger également l’extension .

La technologie disponible pour Donald Knuth au moment de l’écriture de s’avérait particulièrement médiocre dans la gestion du stockage dynamique. Par conséquent, une grande partie du stockage utilisé dans se fait par l’allocation de tableaux fixes, dans les implémentations de référence. Beaucoup de ces tableaux fixes sont extensibles dans les implémentations modernes de mais la taille des tableaux de « registres » est écrite dans la spécification comme étant 256 (généralement). Cette valeur ne doit d’ailleurs pas être changé si vous souhaitez toujours appeler le résultat (voir la question « Comment être sûr que c’est vraiment  »).

Si vous saturez un de ces tableaux de registres, vous obtenez un message d’erreur indiquant :

! No room for a new \⟨truc⟩.

Le \⟨truc⟩ en question peut être :

  • \count, l’objet sous-jacent à la commande \newcounter de

  • \skip, l’objet sous-jacent à la commande \newlength de

  • \box, l’objet sous-jacent à la commande \newsavebox de

  • \dimen ;

  • \muskip ;

  • \toks ;

  • \read (limité à 16 objets) ;

  • \write (limité à 16 objets) ;

  • \language.

1.  L’évolution de cette contrainte#

Les formats actuels de sont toujours construits avec les extensions activées, ce qui signifie qu’il y a 32768 registres disponibles pour les éléments autres que \read et \write. Pour sa part, LuaLaTeX étend cela plus loin avec 65536 registres pour la plupart des éléments, 256 flux \write mais toujours 16 flux \read.

Aussi, à l’heure actuelle, si vous obtenez cette erreur maintenant pour des éléments autres que les flux de fichiers, c’est parce que vous avez un ancien format (antérieur à 2015) qui vérifie la limite d’origine de 256, même si un étendu est utilisé. La mise à jour vers une version actuelle de devrait résoudre le problème. Si vous avez vraiment utilisé 32768 registres, il est fort probable que vous ayez une erreur de programmation qui provoque une boucle pour allouer tous les registres disponibles et donc un étendu ne vous aiderait pas. Vous pouvez cependant essayer avec LuaLaTeX qui a des limites plus grandes dans la plupart des cas.

Le nombre de flux d’écriture est limité à 16 (ou 256 pour LuaTeX) même avec un étendu. Toutefois, l’extension morewrites peut fournir l’illusion d’un plus grand nombre de \write disponible.

2.  Des erreurs proches#

Une erreur connexe est celle indiquant que le nombre de commandes \inserts a été dépassé. Cette commande est indirectement liée aux registres \count, \dimen et \skip, ce qui la limite à 256 insertions. Il est peu probable que vous obteniez cette erreur sur un format postérieur à 2015. Cependant si vous devez utiliser un ancien format, l’extension morefloats augmente le nombre d’insertions disponibles pour le mécanisme des flottants.

Dans d’autres cas, une solution parfois plus simple suffit. Par exemple, dans certains exemplaires de la documentation de l’extension epsf, il était indiqué qu’il fallait placer la commande suivante à chaque fois qu’une image EPS était insérée.

  \input epsf

En suivant cette consigne dans un document contenant plusieurs images, on arrivait systématiquement à l’erreur suivante :

! No room for a new \read .

En fait, à chaque fois que epsf.tex est chargé, il s’attribue un nouveau emplacement de lecture de fichier pour vérifier la figure pour sa boîte englobante… et il n’y a tout simplement pas assez de ces éléments. Dès lors, la solution est simple : remplacer la séquence de commandes

  ...
  \input epsf
  \epsffile{...}
  ...
  \input epsf
  \epsffile{...}

par un simple

  \input epsf

placé plutôt au début du document. Puis ajouter les commandes \epsffile avec un simple ajustement par la commande \epsfxsize si nécessaire.


Sources