Précédent: , Monter: \write   [Table des matières][Index]


27.5.4 \write18

Synopsis :

\write18{commande_shell}

Émet une commande vers l’interpréteur du système d’exploitation. Le système d’exploitation exécute la commande et l’exécution de LaTeX est bloquée jusqu’à ce que cela soit fini.

La séquence suivante (sur Unix)

\usepackage{graphicx}  % dans le préambule
  ...
\newcommand{\numerofig}{1}
\immediate\write18{cd pix && asy figure\numerofig}
\includegraphics{pix/figure\numerofig.pdf}

exécute Asymptote (le programme asy) sur le fichier pix/figure1.asy, de sorte que le document peut par la suite lire le graphique en résultant (voir \includegraphics). Comme pour tout \write, ici LaTeX développe les macros contenues dans commande_shell de sorte que \numerofig est remplacé par ‘1’.

Un autre exemple est que vous pouvez exécuter automatiquement BibTeX au début de chaque exécution de LaTeX (voir Using BibTeX) en incluant \immediate\write18{bibtex8 \jobname} comme première ligne du fichier. Notez que \jobname se développe par défaut en le nom de base du fichier racine, ou bien l’argument de l’option --jobname si celle-ci est passée sur la ligne de commande.

Il peut arriver que vous ayez besoin de plusieurs étapes pour obtenir l’information désirée. L’exemple suivant insère en entrée une liste de tous les fichiers PDF du répertoire courant (voir aussi texosquery plus bas) :

\immediate\write18{ls *.pdf > tmp.dat}
\input{tmp.dat}

Le comportement standard de tout \write est d’attendre jusqu’à la prochaine éjection de page avant de développer les macros ou d’écrire dans le flux (voir \write). Mais il se peut que vous désiriez que cela soit immédiat. Pour cela, utilisez \immediate\write18{commande_shell}.

Autoriser l’usage de commandes système au sein d’un fichier LaTeX pose des problèmes de sécurité évidents. Si vous télécharger un fichier depuis la Toile et qu’il contient des commandes pour détruire tous vos fichiers, cela vous rendrait bien malheureux. Le réglage standard dans les distributions modernes est d’interdire l’accès complet à l’interpréteur de commande du système d’exploitation. Vous pouvez l’autoriser, si vous êtes sûr qu’il n’y a pas de danger, en compilant avec latex --enable-write18 nomfichier (voir Command line options). (L’option --shell-escape est un synonyme dans TeX Live.)

Au lieu de l’accès complet, les distributions modernes par défaut utilisent une version restreinte qui permet à certaines commandes de fonctionner, telles que celles qui font tourner Metafont pour générer les polices manquantes, même si vous n’utilisez pas l’option enable-write18. Par défaut cette liste de commandes autorisées est courte et ne fait figurer que les commandes qui sont sous contrôle des mainteneurs de la distribution (voir Command line options).

Certains paquetages ont besoin d’exécuter des commandes système externes. Par exemple sagetex vous permet de faire faire des calculs ou tracer des graphiques au logiciel de mathématiques Sage, puis d’incorporer ces sorties dans votre document. Pour cela vous devez exécuter LaTeX avec la fonction \write18 pleinement débridée.

Le texte commande_shell est toujours passé à /bin/sh sur les systèmes d’exploitation unixiens, et à l’interpréteur de commande DOS cmd.exe sur Windows. LaTeX ignore tout réglage d’un autre interpréteur de commande par l’utilisateur, ainsi que la variable d’environnement SHELL.

Si votre besoin c’est d’avoir de l’information sur le système, comme le nom du système d’exploitation, celui de la locale, ou le contenu d’un répertoire, alors jeter un coup d’œil au paquetage texosquery qui fournit une interface commode et sûre pour cela, contrairement aux exemples donnés plus haut utilisant \write18 à l’état brut : https://ctan.org/pkg/texosquery.


Précédent: , Monter: \write   [Table des matières][Index]