Entrée/sortie console

\openin & \openout
Synopsis :

\openin numéro=nomfichier

ou :

\openout numéro=nomfichier

Ouvre un fichier pour y lire, ou pour y écrire. Pour la plupart des moteurs, le numéro doit être entre 0 et 15, comme dans \openin3, dans LuaLaTeX numéro peut être entre 0 et 127.
Ici TeX ouvre le fichier le fichier presidents.tex en lecture.

\newread\fichierpresidents
\openin\fichierpresidents=presidents
\typeout{fichierpresidents vaut \the\fichierpresidents}
\read\fichierpresidents to\presidentligne
\typeout{\presidentligne}

La commande \newread alloue des numéros de flux d’entrée de 0 à 15 (il y a aussi une commande \newwrite). La variable \fichierpresidents est plus facile à mémoriser mais sous le capot ce n’est rien de plus qu’un numéro ; le premier \typeout donne quelque chose du genre de ‘fichierpresidents vaut 1’. De plus, \newread garde la trace de l’allocation de sorte que si vous en utilisez trop alors vous obtiendrez une erreur du genre de ‘! No room for a new \read’. Le second \typeout produit la première ligne du fichier, quelque chose du genre de ‘1 Bonaparte, Louis-Napoléon’.
D’ordinaire TeX n’essaie pas d’ouvrir le fichier jusqu’à la prochaine éjection de page. Pour changer cela, utilisez \immediate\openin numéro=nomfichier ou \immediate\openout numéro=nomfichier.
Fermez les fichiers avec \closein numéro et \closeout numéro.
La façon dont LaTeX manipule les noms de fichiers varie selon les distributions, et peut même varier d’une version à l’autre d’une même distribution. Si le nom de fichier n’a pas d’extension alors TeX y ajoute un .tex. L’exemple suivant crée presidents.tex, y écrit une ligne, et le ferme.

\newwrite\fichierpresidents
\openout\fichierpresidents=presidents
\write\fichierpresidents{1 Bonaparte, Louis-Napoléon}
\closeout\fichierpresidents

Mais les noms de fichier avec un point peuvent causer des problèmes : si TeX tombe sur un nomfichier comme presidents.dat il se peut qu’il cherche d’abord presidents.dat.tex et ensuite presidents.dat, ou bien le contraire. La documentation de votre distribution devrait en dire plus, et si cela fonctionne pour vous tant mieux, mais pour assurer une portabilité complète le mieux et d’utiliser des noms de fichier ne contenant que les vingt-six lettres ASCII (insensible à la casse) et les dix chiffres, ainsi que les tirets de 8 ‘_’ et de 6 ‘-’, et en particulier sans point ni espace.
Pour \openin, si TeX ne peut pas trouver le fichier alors il ne produit pas une erreur. Il ne fait que considérer que ce flux n’est pas ouvert (ce qu’on peut vérifier avec \ifeof ; on peut également recourir à la commande \InputIfFileExists, voir Class and package commands). Si vous essayer d’utiliser le même numéro deux fois, LaTeX ne produit pas d’erreur. Si vous essayer d’utiliser un mauvais numéro, alors vous obtiendrez un message d’erreur du genre de ‘! Bad number (16). <to be read again> = l.30 \openin16=test.jh’.

\read
Synopsis :

\read numéro tomacro

Fait que la commande macro contienne la ligne suivante d’entrée du flux de texte numéro, comme dans \read5 to\data.
L’exemple suivant ouvre le fichier mel.tex en lecture, me le contenu de la première ligne dans la commande \courriel, et ensuite ferme le fichier.

\newread\fichierreception
\openin\fichierreception=mel
\read\fichierreception to\courriel
\typeout{Adresse mél : \courriel}
\closein\fichierreception

Si numéro est hors de l’intervalle de 0 à 15 ou si aucun fichier avec ce numéro n’est ouvert, ou si le fichier est à sa fin, alors \read prend son entrée à partir du terminal. Notez, cependant, que la méthode naturelle en LaTeX de prendre en entrée à partir du terminal est \typein (voir \typein).
Pour lire un fichier entier en une fois utilisez \input (voir \input) ou \include (voir \include & \includeonly).
Une raison usuelle de vouloir lire d’un fichier de données est de faire du publipostage. CTAN a plusieurs paquetage pour cela ; parmi lesquels datatool.

\typein[cmd]{msg}
Synopsis :

\typein[\cmd]{msg}

\typein tape msg sur la console et fait que LaTeX s’arrête et attend que vous saisissiez une ligne d’entrée, en la terminant par un retour chariot. Si l’argument optionnel \cmd est omis, l’entrée tapée est traitée comme si elle avec été incluse dans le fichier d’entrée à la place de la commande \typein. Si l’argument \cmd est présent, cela doit être un nom de commande. Ce nom de commande est alors défini, ou redéfini, pour se développer en le texte en entrée qui a été tapé.

\typeout{msg}
Synopsis :

\typeout{msg}

Tape msg sur le terminal et dans le journal (fichier log). Les commandes dans msg qui sont définies avec \newcommand ou \renewcommand (entre autres) sont remplacées par leurs définitions avant d’être tapées.
Les règles usuelles de LaTeX pour le traitement de plusieurs espaces comme un seul espace et pour ignorer les espaces après un nom de commande s’appliquent à msg. Une commande \space dans msg provoque un unique espace tapé, indépendant des espaces qui l’entourent. Un ^^J dans msg tape un saut à la ligne.

\write
Synopsis :

\write numéro{chaîne}

Écrit chaîne vers le fichier journal (.log), vers le terminal, ou vers un fichier ouvert par \openout. Par exemple, \write6 écrit vers le flux textuel numéro 6
Si le code suivant apparaît dans le fichier fichierbase.tex alors cela ouvre le fichier fichierbase.jh, y écrit ‘Bonjour tout le monde !’ et un saut le ligne, et ferme ce fichier.

\newwrite\monfichier
\immediate\openout\monfichier=\jobname.jh % \jobname est le nom
                                       % de base du fichier racine
...
\immediate\write\monfichier{Bonjour tout le monde !}
  ...
\immediate\closeout\monfichier

Le \newwrite alloue un numéro de flux, en lui donnant un nom symbolique pour se faciliter la vie, de sorte que flux \newwrite\monfichier\the\monfichier produit quelque chose du genre de ‘flux 3’. Ensuite \openout associe le numéro de flux avec le nom de fichier fourni. Et puis à la fin TeX exécute \write3 ce qui place la chaîne dans le fichier.
Typiquement numéro est compris entre 0 et 15, parce que typiquement les auteurs LaTeX suivent l’exemple précédent et le numéro est alloué par le système. Si numéro est hors de l’intervalle de 0 à 15 ou si il n’est pas associé à un fichier ouvert alors LaTeX écrit chaîne vers le fichier journal. Si numéro est positif alors en plus LaTeX écrit chaîne vers le terminal. Ainsi, test \write-1{Bonjour tout le monde !} place ‘Bonjour tout le monde !’ suivi d’un saut de ligne dans le fichier journal (c’est ce que la commande \wlog fait ; voir \wlog). Et \write100{Bonjour tout le monde !} met la même chose dans le fichier journal mais aussi met ‘Bonjour tout le monde !’ suivi d’un saut de ligne dans la sortie terminal. (Mais 16, 17, et 18 sont des valeurs spéciales de numéro ; voir ci-dessous.)
Dans LuaTeX, au lieu de 16 flux de sortie il y en a 256 (voir TeX engines).
Utilisez \write\@auxout{chaîne} pour écrire vers le fichier .aux courant qui est associé soit au fichier racine soit au fichier inclus courant ; et utilisez \write\@mainaux{chaîne} pour écrire le fichier .aux principal. Ces noms symboliques sont définis par LaTeX.
Par défaut LaTeX n’écrit pas chaîne vers le fichier immédiatement. C’est ainsi parce que, par exemple, vous pourriez avoir besoin de \write pour sauvegarder le numéro de page courant, mais au moment où TeX rencontre une commande \write typiquement il ne connaît pas quel est le numéro de page, puisque il n’a pas encore découpé la sortie en pages. Ainsi, vous utilisez \write dans l’un des trois contextes suivants :

\immediate\write\@auxout{chaîne}     %1
\write\@auxout{chaîne}              %2
\protected@write\@auxout{}{chaîne}   %3

Avec le premier, LaTeX écrit chaîne vers le fichier immédiatement. Toutes les macros dans chaîne sont développées à fond (exactement comme dans \edef de sorte que pour empêcher le développement vous devez utiliser \noexpand, un toks, etc. mais avec la différence que vous devez utiliser # au lieu de ##).
Avec le deuxième, chaîne est stockée dans la liste courante des choses (comme un élément « extraordinaire » de TeX) et conservé jusqu’à ce que la page soit éjectée et de la même manière les macros ne sont pas développées jusqu’à l’éjection (\shipout). Au moment du \shipout, chaîne est développée à fond.
Le troisième, \protected@write, est semblable au deuxième sauf que vous pouvez utiliser \protect pour éviter le développement. Le premier argument qui est en plus vous permet d’insérer localement des définitions supplémentaires pour que plus de macros soient protégées ou pour avoir d’autres définitions spéciales pendant l’écriture.
Voici un exemple simple de développement avec \write dans lequel chaîne contient une séquence de contrôle \triplex que l’on a définie comme le texte ‘XYZ’ :

\newwrite\fichierjh
\openout\fichierjh=test.jh
\newcommand{\triplex}{XYZ}
\write\fichierjh{test \triplex test}

Ceci résulte en ce que le fichier test.jh contienne le texte ‘test XYZtest’ suivi d’un saut de ligne.
Les cas où numéro vaut 16, 17, ou 18 sont spéciaux. À cause du comportement de \write quand numéro est hors de l’intervalle de 0 à 15 qu’on a déjà décrit plus haut, dans Plain TeX \write16 et \write17 étaient parfois utilisés pour écrire dans le fichier journal et le terminal ; toutefois, dans LaTeX, la façon naturelle de faire ceci est d’utiliser \typeout (voir \typeout). La commande \write18 est encore plus spéciale ; les systèmes TeX modernes l’utilisent pour passer des commandes au système d’exploitation (voir \write18).
D’ordinaire \write produit en sortie une unique ligne. On peut y insérer un saut de ligne avec ^^J. Ainsi, l’exemple suivant produit deux lignes dans le fichier journal :

\wlog{Les lignes parallèles ont beaucoup en commun.^^JMais elles ne se
rencontrent jamais.}

Un cas usuel dans lequel des auteurs tentent d’écrire dans leur propre fichier est pour les réponses à des exercices, ou dans quelque autre situation où vous désirez écrire en sortie verbatim, sans développer les macros. CTAN a plusieurs paquetages pour cela ; parmi lesquels answers.

\write et la sécurité
La possibilité d’écrire dans des fichiers soulève des problèmes de sécurité. Si vous compilez un fichier LaTeX téléchargé et qu’il écrase votre fichier de mots de passe alors vous serez à juste titre embêté.
Ainsi par défaut les systèmes TeX ne vous autorisent à ouvrir en écriture que les fichiers qui sont dans le répertoire courant ou dans un sous-répertoire. L’exemple suivant

\newwrite\fichierjh
\openout\fichierjh=../test.jh

produit une erreur du genre de :

Not writing to ../test.jh (openout_any = p).
! I can't write on file `../test.jh'

Il est possible d’avoir une telle erreur lorsqu’on essaie d’utiliser une commande telle que \include{../nomfichier} puisque LaTeX va essayer d’ouvrir ../nomfichier.aux. La solution la plus simple est de placer les fichiers inclus dans le même répertoire que le fichier racine, ou dans des sous-répertoires.

\message
Synopsis :

\message{chaîne}

Écrit chaîne vers le fichier journal en .log et le terminal.
Typiquement, les auteurs LaTeX utilisent \typeout (voir \typeout) qui permet d’utiliser \protect sur toute commande fragile au sein de chaîne (voir \protect). Mais la commande \typeout insère un saut de ligne à la fin de chaîne contrairement à \message, aussi cette dernière peut être utile.
Dans l’exemple ci-dessous dans le corps du document

avant\message{Un Deux}\message{Trois}\message{Quatre^^JLes}
\message{pouces vont se battre.}Après

dans certaines circonstances (voir ci-dessous) LaTeX écrit ce qui suit à la fois vers le terminal et le fichier journal.

Un Deux Trois Quatre
Les pouces vont se battre.

Un ^^J produit un saut de ligne. Aussi, dans le document en sortie, on a entre ‘avant’ et ‘Après’ un seul espace (issu de la fin de ligne suivant ‘Les}’).
Alors que \message vous permet de mieux contrôler le formatage, un truc à piger c’est que LaTeX peut très bien bousiller ce formatage là en insérant des sauts de ligne selon ce qu’il a déjà sorti. Comparez ce corps de document, où le ‘Deux’ a été déplacé, à celui donné en exemple plus haut.

avant\message{Un}\message{Deux Trois}\message{Quatre^^JLes}
\message{pouces vont se battre.}Après

La chose suivante peut se produire : lorsque LaTeX produit les messages en sortie vers le terminal, le message avec ‘Un’ désormais plus court tient à la fin de la ligne de terminal, et du coup LaTeX saute de ligne juste après lui et avant le ‘Deux Trois’. Ce saut de ligne apparaît également dans le fichier journal. Cette insertion de saut de ligne peut déprendre de, par exemple, la longueur des noms complet des fichiers inclus. C’est pourquoi il est difficile de produire des lignes formatées précisément et d’une façon qui soit portable, et de même de demander que votre message commence au début d’une ligne.

\wlog
Synopsis :

\wlog{chaîne}

Écrit chaîne vers le fichier journal .log.

\wlog{Pour tout n différent de 0, et tout x, (sin x)/n vaut six.}
\wlog{Ben oui, il suffit de simplifier par n.}

D’ordinaire chaîne apparaît sur une seule ligne séparée. Utilisez ^^J pour insérer un saut de ligne.

\wlog{C'est Helvetica qui téléphone à Times Roman :}
\wlog{Change de ligne !^^JJe t'entends très mal.}

\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.