Depuis quelques mois, je bidouille tout doucement avec LaTeX pour rédiger quelques documents ou faire certains devoirs quand j'ai le temps... Aujourd'hui, je suis en pleine rédaction du rapport de mon projet sécurité de la semaine passé et j'ai dit que je rendrais ce rapport en LaTeX alors voilà le contexte.

Parmi les nombreux avantages (et aussi inconvénients) de LaTeX, on trouve entre autres la possibilité d'inclure des fichiers en tout genre dans notre fichier principal (un peu comme des include en PHP) afin d'y insérer du code dans devoir le copier et s'embéter à la mettre à jour à chaque modification.

Cet article n'a pas pour but de troller sur LaTeX versus les autres outils de bureautique mais de vous faire partager de manière simplifiée mes longues recherches sur le sujet (je suis gentil hein ?).

Minted

Minted est un package pour LaTeX qui va utiliser Pygments (colorateur syntaxique de Pyhton) pour rendre de manière très esthétique votre code. Avant de l'utiliser dans votre code Tex, vous allez devoir l'installer sur votre machine...

Installation

Si vous n'avez pas installé Python, alors faites-le et débrouillez-vous pour avoir une version >= 2.6 et pianotez ceci dans votre Terminal :

~% python --version
Python 2.6.1  
~% sudo easy_install Pygments

Ensuite, il vous faudra minted.sty que vous trouverez dans le paquet texlive-latex-extra de MacPorts, sinon, vous pouvez directement télécharger le fichier .STY à cette adresse pour l'inclure manuellement.
Une fois installé, vous n'aurez qu'à l'inclure comme n'importe quel autre package avec la ligne suivante :

\usepackage{minted}

Cependant, étant donné que le package fait appel à Pygments, vous devez rajouter un paramètre lorsque vous compilez votre fichier .TEX. Pour ma part, j'utilise TextMate donc, j'affiche simplement les préférences du Bundle LaTeX et j'ajoute le nouveau paramètre :

Utilisation

De manière très simple, Minted s'utilise comme n'importe quel environnement :

\begin{minted}[options]{langage}
% code
\end{minted}

Et pour la coloration de fichier :

\inputminted[options]{langage}{fichier}

Vous trouverez beaucoup plus de détails dans la documentation du package. Lisez-là, c'est court et concis !

Exemple

Voici donc le bout de code (tiré du guide du Cache de Symfony2) que nous allons colorer dans notre document .TEX :

<?php  
// app/AppCache.php
class AppCache extends HttpCache  
{
    protected function invalidate(Request $request)
    {
        if ('PURGE' !== $request->getMethod()) {
            return parent::invalidate($request);
        }

        $response = new Response();
        if (!$this->store->purge($request->getUri())) {
            $response->setStatusCode(404, 'Not purged');
        } else {
            $response->setStatusCode(200, 'Purged');
        }

        return $response;
    }
}
?>

Prenons un document LaTeX simple et allons-y (lisez la doc' pour la description des options) :

% foo.tex
\documentclass[11pt,a4paper]{report}
\usepackage{fullpage, lmodern, minted}
\usepackage[T1]{fontenc}
\definecolor{lightgray}{gray}{.95}
\begin{document}
    \begin{minted}[linenos=true, bgcolor=lightgray, tabsize=4, gobble=8, fontfamily=courier, fontsize=\small, xleftmargin=5pt, xrightmargin=5pt]{php}
        getMethod()) {
                    return parent::invalidate($request);
                }

                $response = new Response();
                if (!$this->store->purge($request->getUri())) {
                    $response->setStatusCode(404, 'Not purged');
                } else {
                    $response->setStatusCode(200, 'Purged');
                }

                return $response;
            }
        }
        ?>
    \end{minted}
\end{document}

Observons le rendu :

La ligne de déclaration de l'environnement Minted est un peu longue, je vous l'accorde... Mais ils ont pensé à tout car, en effet, recopier cette même ligne autant de fois qu'il y a du code inline, ben c'est très lourd et surtout pas DRY !
Voici la solution qui permet de faire les choses comme il faut :

% En-têtes précédentes
\newminted{php}{
    linenos=true,
    bgcolor=lightgray,
    tabsize=4,
    gobble=8,
    fontfamily=courier,
    fontsize=\small,
    xleftmargin=5pt,
    xrightmargin=5pt
}
\begin{document}
    \begin{phpcode}
        % code PHP
    \end{phpcode}
\end{document}

Le résultat sera le même et l'appel bien plus simplifié... Bon, par contre, je n'ai pas trouvé de moyen de dynamiser cela via une commande perso' afin de rendre dynamique la nature du langage, cela nous éviterai de dupliquer la commande \newminted autant de fois qu'il y a de langages différents dans le document.
Après quelques essais, je n'ai pas trouvé de façon de faire la même choses avec la commande \inputminted donc on est obligé de recopier à chaque fois tout le pâté d'options...

Si vous êtes calé en LaTeX et que vous savez comment optimiser encore plus le bazar, alors je vous en serais très reconnaissant.


Joris Berthelot