Comment créer un fichier à la volée ?#

Que ce soit dans le cadre d’un travail collaboratif ou par exemple pour poser une question avec ECM, il est parfois nécessaire de fournir, en plus d’un fichier principal (.tex), des fichiers externes (.tex, .bib, etc.) destinés à être insérés dans le fichier principal. Il peut alors être pratique que les fichiers externes soient créés à la volée lors de la compilation du fichier principal. C’est classiquement le cas pour créer un fichier .bib ou d’autres fichiers de données similaires à partir du fichier principal, de sorte à rendre autonome ce dernier. De même, cela peut être utile pour créer un fichier personnalisé de style (une extension) ou de classe, rendant ainsi encore le source autonome.

C’est ce que permet l’environnement filecontents dont la syntaxe est  :

\begin{filecontents}[⟨option(s)⟩]{⟨nom de fichier⟩}
⟨texte⟩
\end{filecontents}

ou

\begin{filecontents*}[⟨option(s)⟩]{⟨nom de fichier⟩}
⟨texte⟩
\end{filecontents*}

Ces instructions créent, par défaut dans le répertoire courant, un fichier nommé ⟨nom de fichier⟩ dont le contenu est ⟨texte⟩. Par défaut un fichier déjà existant n’est pas écrasé.

La version non étoilée de l’environnement filecontent préfixe le contenu du ficher créé d’une en-tête de commentaires voir l’exemple ci-dessous. La version étoilée filecontent* n’inclut par l’en-tête.

Les options possibles sont :

  • force ou overwrite: écrase le fichier s’il existe ;

  • noheader : omet l’en-tête. Équivalent à utiliser filecontents* ;

  • nosearch : vérifie uniquement si un fichier existe dans le répertoire courant, non dans le chemin complet de recherche.

Cet environnement peut être utilisé n’importe où dans le préambule, bien qu’il apparaisse souvent avant la commande \documentclass.

Par exemple, la compilation du fichier test.tex suivant :

\documentclass[french]{article}
  \usepackage[T1]{fontenc}    % Encodage T1 (adapté au français)
  \usepackage{lmodern}        % Caractères plus lisibles
  \usepackage{babel}          % Réglages linguistiques (avec french)
  \pagestyle{empty}           % N'affiche pas de numéro de page

  \begin{filecontents}{JH.sty}
  \newcommand{\monnom}{Jim Hef{}feron}
  \end{filecontents}
  \usepackage{JH}

\begin{document}
Un article de \monnom.
\end{document}

produit le fichier JH.sty :

%% LaTeX2e file `JH.sty'
%% generated by the `filecontents' environment
%% from source `test' on 2015/10/12.
%%
\newcommand{\monnom}{Jim Hef{}feron}

Un autre exemple, faisant usage de la commande \jobname, est le suivant :

% Fichier externe de bibliographie
\begin{filecontents}[noheader,force]{\jobname.bib}
@mvbook{knuth:ct,
  author         = {Knuth, Donald E.},
  title          = {Computers \& Typesetting},
  date           = {1984/1986},
  volumes        = 5,
  publisher      = {Addison-Wesley},
  location       = {Reading, Mass.},
  langid         = {english},
  langidopts     = {variant=american},
  sorttitle      = {Computers & Typesetting},
  indexsorttitle = {Computers & Typesetting},
}
\end{filecontents}

% Fichier externe de données à utiliser avec `pgfplots`
\begin{filecontents}[noheader,force]{donnees-\jobname.dat}
Temps Rep1 Rep2
0     1    1
1     10   0.1
2     100  0.01
\end{filecontents}

% Fichier principal
\documentclass[french]{article}
  \usepackage[T1]{fontenc}    % Encodage T1 (adapté au français)
  \usepackage{lmodern}        % Caractères plus lisibles
  \usepackage{babel}          % Réglages linguistiques (avec french)
  \pagestyle{empty}           % N'affiche pas de numéro de page
  \usepackage[a4paper]{geometry}
  \usepackage{pgfplots}
  \usepackage{csquotes}
  \usepackage{biblatex}

  \pgfplotsset{compat=1.18}

  \addbibresource{\jobname.bib}

\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \addplot table[
    x=Temps,y=Rep1
    ]{donnees-\jobname.dat};
  \end{axis}
\end{tikzpicture}

On pourra avec profit lire \autocite{knuth:ct}.

\printbibliography
\end{document}

Cette FAQ utilise souvent cette possibilité pour proposer des exemples complets sans avoir à stocker des fichiers sur le serveur hébergeant cette FAQ (voir, par exemple, « Comment configurer la commande \cite ? »).