Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
2_programmation:compilation:write18 [2021/04/05 22:23] – Suppression d'un paragraphe encore en anglais. Changement du titre. Ajout d'une référence. jejust | 2_programmation:compilation:write18 [2022/11/30 11:30] (Version actuelle) – Usage de ⟨...⟩ dbitouze |
---|
====== Comment lancer un sous-processus pendant la compilation? ====== | ====== Comment lancer un sous-processus pendant la compilation? ====== |
| |
===== Que fait la commande ”\write18” ? ===== | Vous avez peut-être constaté que LaTeX vous parle de la commande ''\write18'' |
| au début de chaque compilation. |
| Cette commande sert à exécuter un sous-programme à partir de LaTeX. |
| Voici comment: |
| |
| ===== Que fait la commande “\write18” ? ===== |
| |
La primitive <latex>\TeX</latex> ''[[5_fichiers:ecrire_un_fichier_texte_a_partir_de_tex|\write]]'' est utilisée pour écrire dans différents « flux » de fichiers. <latex>\TeX</latex> fait référence à chaque fichier ouvert par un numéro, non par un nom de fichier. À l'origine, TeX écrivait dans un fichier connecté à un flux numéroté de 0 à 15. Plus récemment, un « flux 18 » spécial a été implémenté : il n'écrit pas dans un fichier mais indique à <latex>\TeX</latex> de demander au système d'exploitation de faire quelque chose. Pour exécuter une commande, il faut la placer comme argument de ''\write18''. Ainsi, pour exécuter l'utilitaire ''epstopdf'' sur un fichier dont le nom est stocké sous la forme ''\epsfilename'', nous écririons : | La primitive <latex>\TeX</latex> ''[[5_fichiers:ecrire_un_fichier_texte_a_partir_de_tex|\write]]'' est utilisée pour écrire dans différents « flux » de fichiers. <latex>\TeX</latex> fait référence à chaque fichier ouvert par un numéro, non par un nom de fichier. À l'origine, TeX écrivait dans un fichier connecté à un flux numéroté de 0 à 15. Plus récemment, un « flux 18 » spécial a été implémenté : il n'écrit pas dans un fichier mais indique à <latex>\TeX</latex> de demander au système d'exploitation de faire quelque chose. Pour exécuter une commande, il faut la placer comme argument de ''\write18''. Ainsi, pour exécuter l'utilitaire ''epstopdf'' sur un fichier dont le nom est stocké sous la forme ''\epsfilename'', nous écririons : |
Oui, il y a un problème de sécurité. Si vous téléchargez du code <latex>\TeX</latex> ou <latex>\LaTeX</latex> à partir d'Internet, il pourrait très bien contenir des commandes (peut-être cachées) pouvant nuire à votre ordinateur (comme supprimer tous les fichiers de votre disque dur ou envoyer son contenu à un serveur distant). Face à ce problème, MiKTeX et <latex>\TeX</latex> Live ont, depuis un certain temps, désactivé ''\write18'' par défaut. Pour la réactiver, les deux distributions prennent en charge un argument supplémentaire lors du démarrage de <latex>\TeX</latex> à partir de la ligne de commande : | Oui, il y a un problème de sécurité. Si vous téléchargez du code <latex>\TeX</latex> ou <latex>\LaTeX</latex> à partir d'Internet, il pourrait très bien contenir des commandes (peut-être cachées) pouvant nuire à votre ordinateur (comme supprimer tous les fichiers de votre disque dur ou envoyer son contenu à un serveur distant). Face à ce problème, MiKTeX et <latex>\TeX</latex> Live ont, depuis un certain temps, désactivé ''\write18'' par défaut. Pour la réactiver, les deux distributions prennent en charge un argument supplémentaire lors du démarrage de <latex>\TeX</latex> à partir de la ligne de commande : |
| |
<code latex> | <code bash> |
(pdf)(la)tex --shell-escape <file> | (pdf)(la)tex --shell-escape ⟨file⟩ |
</code> | </code> |
| |
Notez que le système <latex>\TeX</latex> peut vous dire que le mécanisme est en cours d'utilisation, en indiquant au démarrage : | Notez que le système <latex>\TeX</latex> peut vous dire que le mécanisme est en cours d'utilisation, en indiquant au démarrage : |
| |
<code latex> | <code> |
This is pdfTeX, Version 3.1415926-1.40.11 (TeX Live 2010) | This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020) (preloaded format=pdflatex) |
restricted \write18 enabled. | restricted \write18 enabled. |
</code> | </code> |
| |
| |
| ===== Comment récupérer la sortie du sous-processus ? ===== |
| |
| Dans son usage le plus commun, le sous-processus lancé depuis LaTeX va produire un résultat |
| (code LaTeX, tableau de données...) que vous voudrez récupérer pour l'utiliser dans votre document. |
| |
| On peut imaginer passer par des fichiers temporaires, que l'on lira avec la commande ''\input'': |
| |
| <code latex> |
| \immediate\write18{ls *.data > listefichiers.tmp} |
| \input{listefichiers.tmp} |
| </code> |
| |
| Ceci permet éventuellement de récupérer plusieurs fichiers. |
| |
| Si le sous-processus envoie ses résultats sur sa sortie standard, il existe une syntaxe simple pour les récupérer |
| sans passer par un fichier intermédiaire (ajoutée vers 2013 aux différents moteurs TeX): |
| |
| <code latex> |
| \input|"ls -1 *.data" |
| </code> |
| |
| Ceci inclura la sortie de la commande « ''ls -1 *.data'' » dans votre document. |
| |
| <WRAP column half> |
| <note important> |
| Il reste indispensable d'utiliser l'option ''-''''-shell-escape'' du compilateur pour autoriser le lancement du sous-processus, sinon vous aurez une erreur ressemblant à ceci: |
| |
| <WRAP clear /> |
| <WRAP column 42ex> |
| <code> |
| runpopen command not allowed: ls |
| |
| ! I can't find file `"|ls -1 *.data"'. |
| l.4 \input|"ls -1 *.data" |
| </code> |
| </WRAP> |
| <WRAP clear /> |
| </note> |
| </WRAP> |
| <WRAP column half> |
| <note> |
| La commande ''\immediate'' fait que le ''\write18'' est exécuté immédiatement. |
| Sinon, il ne le serait qu'au moment où la page en cours est envoyée vers la sortie |
| (ce comportement par défaut de ''\write'' permet de n'écrire des fichiers externes qu'une fois que les numéros des pages sont fixés). |
| </note> |
| </WRAP> |
| <WRAP clear /> |
| |
----- | ----- |
* [[faquk>FAQ-spawnprog|Spawning programs from (La)TeX: “\write18”]], | * [[faquk>FAQ-spawnprog|Spawning programs from (La)TeX: “\write18”]], |
* [[https://tex.stackexchange.com/questions/20444/what-are-immediate-write18-and-how-does-one-use-them|What are “\immediate” & “\write18” and how does one use them?]] | * [[https://tex.stackexchange.com/questions/20444/what-are-immediate-write18-and-how-does-one-use-them|What are “\immediate” & “\write18” and how does one use them?]] |
| * [[http://tug.ctan.org/info/latex2e-help-texinfo-fr/latex2e-fr.html#g_t_005cwrite|Documentation de la commande “\write”]] (//Manuel de référence officieux de LaTeX2ε//, version française). |
| |
{{htmlmetatags>metatag-keywords=(LaTeX,write18,lancer un sous-programme,lancer un programme,sous-processus,exécuter une commande) | {{htmlmetatags>metatag-keywords=(LaTeX,write18,lancer un sous-programme,lancer un programme,sous-processus,exécuter une commande) |