Précédent: , Monter: Terminal input/output   [Table des matières][Index]


27.5 \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
  1. 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 ##).
  2. 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.
  3. 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.


Précédent: , Monter: Terminal input/output   [Table des matières][Index]