Le carnet web de florence

Aller au contenu | Aller au menu | Aller à la recherche

Mot-clé - Latex

Fil des billets

mardi 8 février 2011

Comment inclure du code source dans un document Latex, le tout en utf-8 ?

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 :

  1. on crée un fichier source-c/foo.c contenant le code C à inclure dans le document ;
  2. on ajoute dans le document un \include{source-c/foo} au bon endroit ;
  3. on complie avec $ make.

Et voilà ! Encore une victoire pour {Python, LaTeX} !