LaTeX : Boucles conditionnelles et compilation

Il n’est pas rare d’avoir à publier plusieurs documents ne comportant que quelques différences mineures. Le plus simple est bien sûr de disposer de deux fichiers sources différents, mais le plus classe est d’utiliser les boucles conditionnelles. Dans un premier temps, je vais vous montrer comment réaliser ces boucles. Ensuite, je vous donnerai une astuce pour définir des variables lors de la compilation, et plus généralement, comment passer n’importe quelle commande \LaTeX lors de la compilation.

Définition de la boucle

C’est le package ifthen qui permet les boucles if. La commande s’utilise comme suit :

\def\VariableTest{Condition}  % Définition de la variable test
\ifthenelse{
	\equal{\VariableTest}{Condition}
}{texte si vrai}{texte si faux}

Si la variable VariableTest est égale à Condition, alors on affiche « texte si vrai », « texte si faux » sinon (vrai dans notre exemple).

Mais si on a des différences de version éparpillées dans tous le document, c’est pas terrible de se taper tout ce bloc. Donc l’idée est d’utiliser une macro via la commande \newcommand. Exemple :

\newcommand{\Version}[2]{%
	\ifthenelse{
		\equal{\ChoixDeVersion}{A}
	}{#1}{#2}
}

Maintenant, on peut définir les deux versions n’importe où dans le texte grâce à la commande \Version :

Cet exemple montre\Version{la version A du document.}{la version B sinon.}

Pour résumer, voici un exemple minimaliste de fichier compilable :

\documentclass[a4paper, 12pt]{minimal}
\usepackage{ifthen}
\def\ChoixDeVersion{B}        % Choix de la version a compiler (A ou B)
\newcommand{\Version}[2]{%
	\ifthenelse{
		\equal{\ChoixDeVersion}{A}
	}{#1}{#2}
}
 
\begin{document}
	Cet exemple montre\Version{la version A du document.}{la version B sinon.}
\end{document}

Je profite du fait que l’on parle de macros pour vous rappeler d’utiliser le package xspace, comme développé dans un précédent billet.

Définition des variables lors de la compilation

Comme on est un peu fainéants, on trouve ça fatigant d’ouvrir le .tex pour changer la valeur de la variable Version. L’idée est donc de définir sa valeur lors de la compilation :

pdflatex --jobname=versionA '\def\ChoixDeVersion{A}\input{source.tex}'
pdflatex --jobname=versionB '\def\ChoixDeVersion{B}\input{source.tex}'

Bien entendu, il faut enlever/commenter la ligne de définition de ChoixDeVersion dans l’exemple précédent. Ces deux lignes généreront deux fichiers (versionA.pdf et versionB.pdf). Ici, on ne compile pas directement le fichier, mais le contenu des guillemets ; d’où l’utilisation de la commande \input. Avec cette méthode, on peut donc passer n’importe quelle commande \LaTeX dans le compilateur.

Si on a souvent ce genre de double compilation à faire, il peut être intéressant de définir une macro dans son éditeur \LaTeX préféré ou d’écrire ça sous forme de script.

Bonne compilation !

LaTeX  : Boucles conditionnelles et compilation
4.8 (95 %) 4 votes
  • guillaume

    Merci Dorian pour cette page qui a répondu à mon besoin : compilation conditionnelle en passant les variables dans la ligne de commande pdflatex sans toucher aux sources .tex
    Cdlt,
    G