Latex, C++ et les accents

Pour intégrer à un document Latex des morceaux de code en C++, j’utilise le package listings. Celui-ce est certainement le plus connu pour intégrer du code informatique à un document Latex tout en assurant une coloration syntaxique.

J’intègre du code à mes documents Latex principalement de deux façons :

  • en intégrant le morceau de code directement au document Latex, en le plaçant entre les balises \begin{lstlisting} et \end{lstlisting};
  • en important un fichier, avec la balise \lstinputlisting.

La principale difficulté vient de l’encodage des caractères.

Parfois, le code importé provient d’un code écrit sous Windows. L’encodage par défaut du fichier est cp1252. Chaque caractère est encodé sur un octet.

Parfois, le code importé provient d’un code écrit sous Mac OS X. L’encodage par défaut du fichier est applemac. Chaque caractère est encodé sur un octet.

Parfois, le code importé provient d’un code enregistré au format UTF-8. Certains caractères sont encodés sur deux octets.

Enfin, lorsque le code est directement intégré au document Latex, l’encodage est celui du document, en l’occurence UTF-8.

Voici un exemple :

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern,textcomp}
\usepackage[frenchb]{babel}
\usepackage{listings}
\lstset{
language=C++,
frame=single
}
\begin{document}
Voici du code intégré au document \LaTeX :
\begin{lstlisting}
#include 

int main() {
   std::cout << "Bonjour à tous\n";
   return 0;
}
\end{lstlisting}

Voici du code importé avec un encodage \texttt{Windows} :
\lstinputlisting[inputencoding=cp1252]{main_cp1252.cpp}

Voici du code importé avec un encodage \texttt{Latin1} :
\lstinputlisting[inputencoding=latin1]{main_latin1.cpp}

Voici du code importé avec un encodage \texttt{MacRoman} :
\lstinputlisting[inputencoding=applemac]{main_applemac.cpp}

Voici du code importé avec un encodage \texttt{UTF-8} :
\lstinputlisting{main_utf8.cpp}
\end{document}

Et bien ce code n’est pas compilable ! Le caractère à à la ligne 17 pose problème (c’est un caractère accentué, encodé sur deux octets en UTF-8).

Si, pour aller plus loin, on remplace temporairement ce caractère à par a, la compilation échoue maintenant au moment de l’importation du fichier main_utf8.cpp.

En fait, tout le problème vient du fait que peu importe l’encodage, la paquet listings ne supporte pas les caractères encodés sur plus d’un octet. Si vous souhaitez intégrer du code à un document Latex encodé en UTF-8, il n’y a donc qu’une solution : importer le code depuis un fichier externe encodé avec un format d’un octet par caractère. Dans l’exemple ci-dessus, les formats cp1252, Latin1 et MacRoman fonctionnent très bien.

One Response to “Latex, C++ et les accents”

  1. Merci beaucoup de l’astuce,
    j’avais tous mes fichiers en utf8 je ne comprenais pas le problème.