Travailler avec des sous-fichiers

De nombreux manuels et cours sur LaTeX conseillent de travailler avec des sous-fichiers, permet­tant de scin­der ses docu­ments de travail en plusieurs fichiers (e.g. un fichier par chapitre pour l’écri­ture d’un livre).

Prendre l’ha­bi­tude d’une telle pratique peut-être une très bonne idée, mais il peut égale­ment être très inté­res­sant de pous­ser plus loin la réflexion. Dans la mesure où le docu­ment va être scin­der, il peut être inté­res­sant de pouvoir compi­ler chaque sous-fichier de manière indé­pen­dante. Pour cela j’ai écrit un petit package (que vous ne trou­ve­rez pas sur le CTAN) qui permet de compi­ler un fichier à l’in­té­rieur d’un plus géné­ral ou de manière indé­pen­dante, sans avoir à modi­fier à chaque fois le code source.

Concer­nant l’ap­pel des packages

Il est néces­saire d’écrire l’en­semble des appels de packages dans un fichier à part puisque ce dernier sera appelé par le docu­ment maître à la compi­la­tion, mais égale­ment par les sous-docu­ments lorsqu’on les compi­lera de manière indé­pen­dante.

Dans ce fichier vous pouvez appe­ler les packages que vous souhai­tez, aucun n’étant néces­saire au bon fonc­tion­ne­ment du package que j’ai écrit. Vous pouvez égale­ment y indiquer votre nom avec la commande \author{} et éven­tuel­le­ment une date avec la commande \date{}.

Avec le fichier maître…

Le fichier prin­ci­pal se construit globa­le­ment de la même manière que d’ha­bi­tude, seule­ment il est néces­saire d’ini­tia­li­ser un comp­teur parti­cu­lier qui servira lors de la compi­la­tion du docu­ment et d’ap­pe­ler le fichier de préam­bule créé préa­la­ble­ment. Le comp­teur en ques­tion s’ini­tia­lise de la manière suivante :

\newcounter{multipart}

Ainsi, un exemple mini­mal de fichier maître se présen­te­rait comme suivant :

\documentclass{book}
\input{preambule} % le fichier indépendant qui contient l'appel des packages et la définition de l'auteur grâce à la commande \author{}
\newcounter{multipart}
\title{Le titre}

\begin{document}
\maketitle
\input{le sous-fichier}
\end{document}

… et les fichiers esclaves

Il s’agit à présent de nous arrê­ter sur les sous-fichiers. Il s’agit tout d’abord d’in­té­grer le fichier multi­part.tex qui contient les indi­ca­tions néces­saires au bon fonc­tion­ne­ment du proces­sus (et que nous déve­lop­pe­rons plus bas). Ce fichier doit se trou­ver dans le même dossier que le fichier compilé. En cas d’uti­li­sa­tion de sous-dossiers pour les fichiers, il est néces­saire que ce fichier se trouve égale­ment dans ces dossiers. (Un simple lien symbo­lique permet de simu­ler la présence de ce fichier sans avoir à les mettre à jour à chaque modi­fi­ca­tion.)

Il convient ensuite d’ap­pe­ler la commande \debut­mul­ti­part{}{} qui demande deux argu­ments. Le premier corres­pond au titre du docu­ment. Il appa­raî­tra comme un titre de chapitre lorsque le docu­ment sera compilé en même temps que le fichier maître (qui corres­pond à un livre), mais il devien­dra le titre d’un article lorsque le fichier sera compilé seul (le docu­ment prenant alors la classe article). Le second argu­ment corres­pond simple­ment au chemin du fichier de préam­bule créé plus tôt (ce chemin est le chemin rela­tif depuis le sous-fichier, il servira lors de la compi­la­tion auto­nome).

À la suite de cela vous n’avez qu’à écrire votre docu­ment (avec un premier niveau de titre commençant à la section).

En fin de fichier, il vous suffit d’in­diquer la fin du sous-fichier par la commande \finmul­ti­part{}.

Un exemple mini­mal serait le suivant :

\input{./multipart}
\debutmultipart{Mon titre de chapitre (d'article)}{../preambule}

Le corps de texte de mon document.

\finmultipart{}

Le package multi­part

Il ne nous reste pus qu’à créer (dans votre cas copier) le package en lui-même, dans un fichier multi­part.tex.

\ifdefined\debutmultipart
\else
  \newcommand{\debutmultipart}[2]{%
    % Définition du titre du document
    \ifdefined\titre
      \renewcommand{\titre}[0]{#1}
    \else
      \newcommand{\titre}[0]{#1}
    \fi
    % si le compteur 'multipart' existe...
    \ifcsname c@multipart\endcsname\stepcounter{multipart}
      % ...alors c'est que le document est chargé par le document principal
      % et le préambule a déjà été chargé par le document principal
      % le titre est donc un chapitre
      \chapter*{\titre{}}
      \addcontentsline{toc}{chapter}{\titre{}}
    \else    
    % ...sinon c'est que le document est compilé en autonomie

      % on définit le type du document
      \documentclass[a4paper]{article}

      % on charge le préambule
      \input{#2}

      % le titre est donc le titre du document
      \title{\titre{}}

      % on commence le contenu
      \begin{document}

      % on met en place le titre du document
      \maketitle
    \fi
  }

  \newcommand{\finmultipart}[0]{%
    % si le compteur 'principal' existe...
    \ifcsname c@multipart\endcsname \stepcounter{multipart}    
      % ...alors ne rien faire car le document continue dans le document principal
    \else
      % sinon on termine le contenu
      \end{document}
    \fi
  }
\fi

Voilà, il ne vous reste plus qu’à compi­ler à votre conve­nance le docu­ment prin­ci­pal ou le sous-docu­ment pour obte­nir le fichier de votre choix.