Structure d’un projet LaTeX

17/05/2012 Comments off

Je connais pas une seule personne qui a la même structure de projet LaTeX. Autant il existe des grandes conventions dans les projets de programmation en C ou en Java (notamment avec Maven). Mais pour le LaTeX, c’est un peu le vide intersidéral. Moi même, j’ai mis très longtemps à trouver quelque chose de stable. Pour la rédaction de mon dernier article, j’ai mis à l’épreuve une idée que j’avais depuis un petit moment. C’est le format que j’ai choisi pour la thèse.

Problèmes d’un projet LaTeX

  • Un projet LaTeX inclue des macros de l’utilisateur. Et potentiellement il voudrait bien réutiliser ses macros sur un autre projet
  • Certains packages doivent respecter un ordre d’inclusion
  • Les packages sont accompagnés par des paramétrages qui sont bien souvent toujours les mêmes
  • Le contenu du document doit être séparé en plusieurs fichiers pour être manipulable
  • Les chemins d’inclusions sont relatifs à partir du fichier maître (donc les dossiers sont lourds à manipuler)
  • Pour la raison précédente, tous les fichiers sont au même endroit sinon c’est chiant

Voilà, je viens de lister tout ce qui m’a bien saoulé pendant un bon moment. Je pense que vous êtes dans le même cas. Bon, arrêtons de tourner autour du pot. Voilà la structure de fichier.

Gestion de l’inclusion

Résolvons directement le problème de l’inclusion. Ce que je souhaite faire est la chose suivante : je décris la structure de mon document et de ses includes avec mon système de fichier. Par exemple, pour chaque chapitre, je fais un dossier, pour chaque section je fais un fichier à l’intérieur de ce dossier. Et si je souhaite regrouper mes chapitres en parties, je les regroupes dans un autre dossier. Ceci étant dit : comment on se débrouille maintenant ?

Prenons le chapitre introduction, voilà la structure que nous souhaitons faire :

introduction
|____contexte.tex
|____problematique.tex
|____objectif.tex
|____demarche.tex
|____plan.tex

Vous remarquez que ce dossier a un ordre. Les ruses habituelles pour trier tout ça est de renommer en 1-contexte 2-problematique etc… Bon c’est pas top hein. Ici on introduit un fichier .order qui contiendra l’ordre d’inclusion des fichiers.

$ cat introduction/.order
contexte
problematique
objectif
demarche
plan

Vous n’êtes pas obligé de mettre un fichier .order ou même de mentionner tous les fichiers. Si tel est le cas, les fichiers non-mentionnés seront inclus dans le désordre. Maintenant il faut un fichier pour inclure le tout, appeler la primitive \chapter (et faire un petit texte pour présenter le chapitre). Et c’est là que c’est joli. Ne mettez aucun \input ! Faites juste votre présentation.

$ cat introduction.tex
\chapter{Chapitre d'introduction}

Ce premier chapitre fait des trucs blabla

Voilà la tête de votre structure de fichier maintenant :

introduction
|____.order
|____contexte.tex
|____demarche.tex
|____objectif.tex
|____plan.tex
|____problematique.tex
introduction.tex

Vous pouvez imbriquer vos dossiers dans tous les sens du moment que vous respectez les principes que je vous ai montré.

Bon c’est bien gentil ce que tu nous fait Loïc mais c’est pas très compilable ton truc. Pas de panique, voici un script qui va vous ajouter les inputs qui vont bien à la fin de tous les fichiers qui ont un dossier avec leur nom. Vous pouvez trouver le script bash ici. Si ne mettez pas d’argument, il appliquera à tous les fichiers qu’il peut trouver dans la racine et sous-répertoires. Vous pouvez aussi lui mettre un pattern de recherche pour éviter de tout régénérer.

Les macros et les packages

Bon ça c’était la partie la plus tordue. Maintenant on va exploiter à mort cette structure pour gérer tout le reste ! Je vais donc faire un dossier inc qui contiendra encore deux dossiers packages et macros. Chaque fichier dans ces dossiers représente un bloc réutilisable ailleurs. Par exemple, voici mon fichier babel.tex qui introduit tous les packages qui vont bien pour faire du LaTeX en français :

$ cat packages/babel.tex
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{eurosym}
\usepackage[babel=true]{csquotes}

Accumulez les packages qui vont bien (utf8, fullpage, babel, indent, wrapfigures…). Si vous avez un package qui nécessite une grosse configuration vous pouvez en profiter pour le customiser un peu. C’est le cas de listings qui est moche par défaut mais qu’avec le bon custom qui va bien : ça envoie du lourd.

De même pour les macros. Je me suis formé des fichiers qui rassemble des macros que j’ai pu faire au fur et à mesure :

$ cat macros/commonmath.tex
%Ensembles
\def\R{\mathbb{R}}
\def\C{\mathbb{C}}
\def\N{\mathbb{N}}
\def\Z{\mathbb{Z}}
...

Notez que vous pouvez utiliser le fichier .order pour résoudre les conflits d’ordre d’inclusion. Aussi, si vous voulez généraliser un fichier macros qui nécessite l’inclusion de packages vous pouvez utiliser des tricks qui permettent de tester avant d’inclure. Par exemple :

\ifx\colorbox\undefined\usepackage{color}\fi

Personnellement, j’aime bien aussi mettre un fichier title.tex dans le dossier inc qui contiendra toutes les méta-données de votre document (titre, auteur, date).

Le projet final

Petit bilan, vous avez de quoi gérer les macros/packages et vous avez une structure pour votre texte qui envoie du paté. Bon, ben c’est pas mal ça ! Pour le reste, voilà la structure que je vous conseille

Projet
|____ Master.tex
|____ bib
|____ template
|____ lib
|____ fig
  |____ src
|____ src
  |____ inc
  |____ tex

Expliquons un peu. Votre dossier bib contiendra tous vos fichiers bibtex. Le dossier template contient le cls (ou sty) du template que vous allez utiliser pour votre document. Il peut inclure des figures qui seront dans ce dossier aussi. Votre dossier lib contiendra des sty qui ne seront pas dans votre texmf (conseillé si vous travaillez en collaboratif et que vous avez besoin d’un package pas très courant, ou avec une version différente des distributions standardes). Évidemment, fig contiendra les figures qui peuvent être inclues dans votre document. Personnellement, je conseille de créer un dossier src à l’intérieur pour mettre les versions sources (svg, graphml, psd etc…). A vous de gérer la structure de vos sources par la suite. Et enfin, vous avez le dossier src qui contiendra tout vos .tex avec la séparation header/contenu.

Donc là si vous avez déjà tenté ce genre de structure vous êtes en train de penser que je vous enfume. Ouais ! Genre mon includepackage il va pas marcher si c’est dans lib. Scandale ! Petits chanceux, j’ai réponse à votre haine. Il est possible de changer le PATH de latex dans votre source. Mettez ce bout de code, soit dans votre Master.tex, soit dans le fichier inc.tex (suivant si vous avez un cls à inclure en gros) :

\makeatletter \def\input@path{{lib/}{template/}{fig/}{src/}} \makeatother

Et youpi, LaTeX va trouver vos figures, vos packages tout seul. Attention, les bib doivent être placés appelés correctement (car bibtex ne supporte pas le \input@path). Vous n’avez plus qu’à rédiger votre Master.tex qui va bien :

\documentclass[...]{...}
\input{inc}

\begin{document}
    \input{tex}

    \bibliographystyle{...}
    \bibliography{bib/...,bib/...}
\end{document}

Si ça c’est pas la classe !? Comme dit un collègue : How cool is that ?

Plus ?

Voilà en l’état où j’en suis sur mes structures de projet. Par la suite, il faudrait que je me trouve/me fabrique un gestionnaire de macros ou de packages couramment utilisés afin de pouvoir au mieux réutiliser les fichiers créés. Genre, vous êtes à la racine et youpi vous tappez un truc latexproject et vous avez une ligne de commande interactive. Après vous pouvez lister les macros que vous avez déjà fait, les inclure dans le projet (avec des liens symboliques !), supprimer une macro du projet etc… Bref ça enverrait du pâté !

Enjoy !

Categories: Informatique, LaTeX