Apprendre LaTeX : afficher et coloriser du code source

par Damien Mégy   latex verbatim tcolorbox listings verbatim minted pygments

Table des matières

Cet aide-mémoire présente les principaux outils disponibles pour inclure du code informatique dans un document LaTeX : les packages verbatim, fancyvrb, listings, minted, éventuellement en tandem avec tcolorbox. (Comme beaucoup d'autres billets de ce blog, il est avant tout destiné à l'auteur lui-même, qui doit réapprendre l'utilisation de ces packages environ une fois par an au moment de taper des notes de cours ou des sujets d'examen.)


L'environnement natif verbatim

L'environnement verbatim est le plus basique pour afficher du code dans LaTeX. Il permet d’insérer du texte brut, sans interprétation des caractères spéciaux.

Il est disponible nativement sans package supplémentaire.

Le package verbatim

Ce package fournit un environnement étoilé \begin{verbatim*} qui affiche les espaces et les tabulations. Il permet aussi d'inclure un fichier externe avec \verbatiminput{filename}. Enfin, il permet de définir un style global pour l'affichage de tous les environnements verbatim. Il est aussi nécessaire pour certains packages comme fancyvrb présentés plus bas.

Utilisation

\begin{verbatim}
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
\end{verbatim}

s de numérotation des lignes, pas de personnalisation avancée.

Le package fancyvrb

fancyvrb est une extension de verbatim qui offre plus de flexibilité : numérotation des lignes, cadre autour du code, gestion des espaces, etc.

Utilisation

\usepackage{fancyvrb}
\begin{Verbatim}[numbers=left,frame=single]
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
\end{Verbatim}

Avantages

  • Numérotation des lignes.
  • Possibilité d’ajouter un cadre.
  • Meilleure gestion des espaces et des tabulations.

Extensions

Le package fvextra permet d’étendre encore les fonctionnalités de fancyvrb.

Le package listings

Le package listings (page CTAN) est l’un des packages les plus populaires pour l’affichage de code. Il permet une personnalisation assez poussée : coloration syntaxique (basique), polices, styles, etc.

Utilisation

\usepackage{listings}
\lstset{
    language=Java,
    basicstyle=\ttfamily,
    numbers=left,
    frame=single,
    breaklines=true
}
...
\begin{lstlisting}
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
\end{lstlisting}

Avantages

  • Coloration syntaxique pour de nombreux langages.
  • Numérotation des lignes et gestion des sauts de ligne.
  • Très personnalisable.

Un problème avec le package listingsest qu'il ne prend pas en charge les caractères accentués. Or, il est courant d'avoir des commentaires avec des caractères unicode. Une solution est de préciser au package comment gérer ces caractères:

\lstset{literate=
{á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
{Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
{à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
{À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
{ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
{Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
{â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
{Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
{ã}{{\~a}}1 {ẽ}{{\~e}}1 {ĩ}{{\~i}}1 {õ}{{\~o}}1 {ũ}{{\~u}}1
{Ã}{{\~A}}1 {Ẽ}{{\~E}}1 {Ĩ}{{\~I}}1 {Õ}{{\~O}}1 {Ũ}{{\~U}}1
{œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
{ű}{{\H{u}}}1 {Ű}{{\H{U}}}1 {ő}{{\H{o}}}1 {Ő}{{\H{O}}}1
{ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {Ø}{{\O}}1 {å}{{\r a}}1 {Å}{{\r A}}1
{€}{{\euro}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1
{»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1 {¡}{{!`}}1
}

Pour plus d'informations sur listings :

Combinaison de listings avec tcolorbox

Pour un rendu encore plus soigné, on peut encapsuler un bloc lstlisting dans une tcolorbox, de la façon suivante :

\usepackage{tcolorbox}
\tcbuselibrary{listings}
\begin{tcblisting}{listing only,listing options={language=Java,numbers=left}}
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
\end{tcblisting}

Le nec plus ultra : minted

Le package minted (page CTAN, doc pdf) utilise le moteur de coloration syntaxique Pygments de Python.

Avantages :

  • Coloration syntaxique très précise et moderne.
  • Support d’un grand nombre de langages et de styles.

Inconvénients :

  • Nécessite d’avoir Python et Pygments installés.
  • Obligation de compiler avec l’option -shell-escape.

Utilisation

\usepackage{minted}
\begin{minted}{java}
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
\end{minted}

Installation de Pygments

Pygments utilise l'outil pygmentize de Pygments. On peut l'installer avec apt-get install python3-pygments sous linux, brew install pygments sous macOS et dieu sait comment sous Windows, peut-être pip install Pygments une fois que Python est installé.

Pour vérifier l'installation, on peut entrer pygmentize -Vdans un terminal et on doit normalement voir s'afficher quelque chose du genre suivant :

Pygments version 2.19.2, (c) 2006-2024 by Georg Brandl, Matthäus Chajdas and contributors.

Styles de coloration disponibles

La page https://pygments.org/styles/ répertorie les styles disponibles et on peut tester la coloration de son propre code à l'adresse https://pygments.org/demo/ en tapant son code dans un champ de texte ou en uploadant un fichier.

Styles Pygments

Utilisation avec tcolorbox

On peut aussi inclure les listings colorisés avec minteddans des tcolobox, comme pour listings.