Si vous avez déjà essayé récemment de réaliser un document traitant
d’informatique en LaTeX, vous
vous êtes sûrement arraché les cheveux à cause du paquet listings
.
Celui-ci refuse non seulement d’inclure et de colorier du code contenant des
caractères utf-8, mais en plus il refuse d’être utilisé au sein d’un document
lui-même en utf-8. Damned!
Deux possibilité s’offrent alors à l’auteur exigeant (exigeant, donc pour qui utiliser LibreOffice n’est pas une option). La première, abandonner les jeux de caractères modernes, et revenir en ces temps anglo-centriques où un caractère était synonyme d’un octet, et utiliser la notation diacritique de LaTeX, qui non-seulement oblige à maltraiter ses poignets, et ne permet pas de profiter des belles polices de caractères unicode modernes (sans compte que modifier un texte déjà en utf-8, quelle galère…). Et ne parlons pas de jeux de caractères étendus… non, n’en parlons pas.
Refusons l’archaïsme en LaTeX, utilisons l’utf-8 ! C’est alors que
l’excellent Pygments vole à notre secours.
Ce module Python propose de la coloration
syntaxique pour de nombreux langages, est accessible en ligne de commande d’un
simple pygmentize, et propose… un export LaTeX ! (Dans le
système d’exploitation universel, c’est le
paquet python-pygments
.)
La seule contrainte : les fichiers de code doivent être dans un
fichier distinct de votre fichier principal. Si vous avez un exemple de code
dans le langage C, mettons exemple.c
, vous pouvez le convertir en
LaTeX par la commande suivante :
$ pygmentize -f latex -P encoding=utf8 -o exemple.tex exemple.c
Pygments a toutefois besoin d’inclure quelques paquets et de définir ses propres macros. Pour obtenir ces définitions, il faut lancer la commande :
$ pygmentize -f latex -P encoding=utf8 -O full -o exemple-full.tex exemple.c
qui elle donnera un document LaTeX complet. Il suffit de copier le préambule
de ce fichier, soit directement dans le préambule de notre document, soit en
l’incluant. Ensuite, il nous reste juste à inclure les fichiers de code
(sans préambule, donc convertis sans le -O full
) à l’aide
d’un :
\include{exemple}
L’obligation de convertir les fichiers de code étant plutôt contraignante,
il est possible d’automatiser cela à l’aide d’un fichier
Makefile
, et
de règles génériques. Suposons que nous regroupons tous les fichiers de code
source du langage C dans un répertoire source-c
. Voici (un bout
de) notre Makefile
:
# règles de dépendance des fichiers de code c
SAMPLE_C=$(wildcard source-c/*.c)
SAMPLE_C_TEX=$(SAMPLE_C:.c=.tex
# règles de production des fichiers tex à partir des fichiers c
source-c/%.tex: source-c/%.c
pygmentize -f latex -P encoding=utf8 -o $@ $<
# règle de production du document pdf
document.pdf: document.tex $(SAMPLE_C_TEX)
pdflatex document.tex
Une fois le Makefile
prêt et les macros nécessaires dans le prélude,
l’insertion d’un bout de code se fait simplement :
- on crée un fichier
source-c/foo.c
contenant le code C à inclure dans le document ; - on ajoute dans le document un
\include{source-c/foo}
au bon endroit ; - on complie avec
$ make
.
Et voilà ! Encore une victoire pour {Python, LaTeX} !