Message bizarre

Bonsoir à tous,

Vous est-il arrivé de recevoir ce message lors d'une tentative de compilation :
"emergency stop" ?

Pour info : 4 lignes avant ça compilait sans problèmes, et lorsque j'ai reçu ce message j'ai mis les 4 lignes en commentaires, sans succès.

J'ai réussi à m'en sortir à l'aide d'une sauvegarde du fichier tex. Après plusieurs copier-coller j'ai récupéré mon fichier intact, et ça compile à nouveau. Mais je ne comprends pas ce qui s'est passé, et j'aimerais bien savoir comment éviter ce genre d'écueils à l'avenir.

Merci d'avance

Martial

Réponses

  • Bonsoir Martial,

    Je ne peux pas te dire précisément ce qui a causé l'apparition de ce message d'erreur, mais ce n'est pas quelque chose de rare. D'après le TeXbook p. 299, TeX dit “emergency stop” quand il ne peut pas rectifier le tir (après une erreur) sans ton aide, et que « tu » lui as justement refusé toute aide en utilisant \batchmode ou \nonstopmode (ce qu'a sans doute fait pour toi ton éditeur de textes ou environnement de compilation : TeXmaker, TeXstudio, AUCTeX...).

    Si ce n'est pas clair, rappelle-toi ou apprends que par défaut, TeX rectifie comme il peut les erreurs qu'il trouve pour pouvoir continuer la compilation (par exemple, tu peux avoir un “missing dollar inserted” si tu utilises en mode non-maths un truc qui ne peut apparaître qu'en mode maths). Cela signifie que pour pouvoir continuer, TeX a fait comme si ton code source avait un dollar à l'endroit indiqué (le dollar a été inséré en RAM dans l'espace mémoire du processus TeX, pas dans ton fichier). Cette rectification automatique des erreurs n'est pas une fonctionnalité très utile de nos jours, car avec les ordinateurs rapides dont on dispose, il vaut presque toujours mieux s'arrêter à la première erreur, la corriger et relancer (la rectification automatique peut être à l'origine d'autres erreurs qui n'auraient pas existé sans le problème initial...). Mais lorsque TeX a été écrit, il ne fallait pas arrêter la compilation pour un rien, donc cela a été jugé utile.

    Dans certains cas, TeX ne sait pas comment corriger automatiquement un problème. Par exemple, si \input n'est pas suivi d'un nom de fichier, TeX s'arrête et demande à l'utilisateur d'entrer un nom de fichier pour pouvoir continuer la compilation. Mais ceci n'est possible que si TeX n'est ni en \batchmode ni en \nonstopmode, par définition. Comme les éditeurs de texte supportent rarement l'interaction avec TeX, il utilisent justement l'un de ces modes la plupart du temps. On a alors droit à “emergency stop” pour les erreurs que TeX ne peut pas « corriger » (en RAM !) sans l'aide de l'utilisateur.

    Tu as eu la bonne approche : souvent sauvegarder son travail pour ne pas se retrouver dans une mauvaise situation.
  • Voici une petite illustration qui peut être reproduite dans un terminal. Pour le 2), préparer un fichier bla.tex ne contenant que la commande \bye et le placer par exemple dans le dossier depuis lequel 'tex' va être lancé.

    1) En \nonstopmode, \input d'un fichier qui n'existe pas :
    $ tex -interaction=nonstopmode '\input "Et si tu n_existais pas..." \bye'
    This is TeX, Version 3.14159265 (TeX Live 2020/Debian) (preloaded format=tex)
    ! I can't find file `"Et si tu n_existais pas..."'.
    <*> \input "Et si tu n_existais pas..." 
                                            \bye
    (Press Enter to retry, or Control-D to exit)
    Please type another input file name
    [b]! Emergency stop.[/b]
    <*> \input "Et si tu n_existais pas..." 
                                            \bye
    No pages of output.
    Transcript written on texput.log.
    $
    
    2) Dans le mode par défaut (qui semble correspondre à l'option -interaction=errorstopmode avec TeX Live), correction « en live » de l'erreur :
    $ tex '\input "Et si tu n_existais pas..." '
    This is TeX, Version 3.14159265 (TeX Live 2020/Debian) (preloaded format=tex)
    ! I can't find file `"Et si tu n_existais pas..."'.
    <*> \input "Et si tu n_existais pas..."
                                           
    (Press Enter to retry, or Control-D to exit)
    Please type another input file name: bla
    (./bla.tex )
    No pages of output.
    Transcript written on bla.log.
    $
    
  • Merci, Brian, tu me rassures !
    Ce que tu m'expliques correspond assez bien à une impression que j'ai souvent lors de la compilation : j'ai un message d'erreur alors que le pdf qui apparaît est impeccable.

    Tu as entièrement raison dans ta dernière phrase : si je n'avais pas eu de sauvegarde j'étais mort, je n'avais plus qu'à réécrire tout le chapitre.

    Ce que je ne comprends pas c'est pourquoi mon bidouillage m'a permis de récupérer la main... alors que je n'ai strictement rien changé, je n'ai fait que des copier-coller.

    Dernière question : j'utilise TeXStudio avec MiKTeX. Sais-tu comment désactiver \batchmode ou \nonstopmode ?
  • Il y avait certainement quelque chose de différent dans ton fichier... ou dans un des fichiers qu'il a chargés au moment du problème (par exemple, cela pouvait être dans le fichier .aux qui est lu et réécrit automatiquement à chaque compilation d'un document LaTeX...).

    Les options dont j'ai parlé (-interaction=nonstopmode et Cie) sont bien expliquées ici et . Je crois que ce que tu voudrais, c'est que TeX s'arrête à la première erreur. Pour cela, il faut (ou plutôt suffit de) combiner -interaction=nonstopmode et -halt-on-error. Avec TeXstudio, tu peux mettre ça dans la ligne correspondant à la commande de compilation utilisée, dans Options -> Configure TeXstudio -> Commands (dans l'exemple ci-dessous, je n'ai mis -halt-on-error que pour la commande 'pdflatex').

    Si ça ne marche pas, essaie --interaction=nonstopmode et --halt-on-error (i.e., deux tirets au début de chaque option) ; mais je ne pense pas que cela soit nécessaire.115648
  • OK, merci beaucoup, Brian.
    Bonne nuit
  • Avec plaisir. Un truc que tu aurais pu essayer avant de remplacer ton .tex par une sauvegarde : effacer les fichiers générés qui sont lus par LaTeX (ils rendent donc le processus de compilation “stateful” : tu peux le voir comme un automate fini). Il s'agit des .aux, .toc, .lof, .lot ainsi que .ind et autres fichiers éventuellement générés pour l'index ou la bibliographie. Et après, relancer la compilation, bien sûr.
  • C'est bon à savoir...
  • ça m'est déjà arrivé d'avoir le même genre de problèmes que Martial et d'essayer de supprimer les fichiers de compilation, sans succès.

    Il a fallu que j'utilise la même entourloupe : le copier-coller
  • Il n'y a pas de magie. En pareil cas, faire une copie du .tex qui pose problème. Une fois le problème réparé (avec récupération depuis sauvegarde, copier/coller ou que sais-je), faire un 'diff -u' entre le .tex qui ne marche pas et le .tex « réparé ». S'il n'y a aucune différence, c'est qu'un des fichiers lus par LaTeX n'a pas été effacé (tester au besoin dans un dossier vierge où seul le fichier .tex à tester a été copié).
Connectez-vous ou Inscrivez-vous pour répondre.