LaTeX et listings en UTF8: me concernant, j’encode toujours mes documents \(\LaTeX\) en utf88, et il m’arrive d’utiliser le package listings. Bien entendu, cela provoque quelques soucis. Aussi, lorsque j’ai vu ce topic sur mathemaTeX, et la solution proposé par MB, je me suis dis qu’il serait peut-être intéressant d’approfondir en écrivant cet article.
LaTeX et listings en UTF8: le bon package
Avant tout, laissons tomber listings pour le remplacer par listingsutf8, qui n’est autre qu’un patch à listings.
LaTeX et listings en UTF8 : notre objectif
J’aimerais créer un langage pour écrire des algorithmes naturels pour arriver à cela:
Le code \(\LaTeX\) pour le listing en UTF8
Nous allons définir un nouveau style pour notre listing, que nous appellerons “algo” ,à l’aide de la macro \lstdefinestyle:
\lstdefinestyle{algo}{<options>}
Les options sont les suivantes:
inputencoding = utf8, mathescape, basicstyle = \footnotesize\ttfamily, numberstyle = \scriptsize\ttfamily\color{gray}, showstringspaces = false, tabsize = 2, numbers = left, xleftmargin = 8mm, frame = lines, framexleftmargin = 8mm, framerule = 1pt, rulecolor = \color{green!50!black}, backgroundcolor = \color{green!5}, commentstyle = \color{gray}, morecomment = [l][commentstyle]{//}, classoffset = 0, keywords = {Pour, allant, Si, alors, Sinon, Fin}, keywordstyle = \color{blue!75}, classoffset = 1, morekeywords = {Afficher}, keywordstyle = \color{green!50!black}, classoffset = 0, morestring = [b]", stringstyle = \color{red!75} literate = {é}{{\'e}}{1}% {è}{{\`e}}{1}% {à}{{\`a}}{1}% {â}{{\^a}}{1}%%% {ç}{{\c{c}}}{1}% {œ}{{\oe}}{1}% {ù}{{\`u}}{1}% {É}{{\'E}}{1}% {È}{{\`E}}{1}% {À}{{\`A}}{1}% {Ç}{{\c{C}}}{1}% {Œ}{{\OE}}{1}% {Ê}{{\^E}}{1}% {ê}{{\^e}}{1}% {î}{{\^i}}{1}% {ï}{{\"i}}{1}%%% {ô}{{\^o}}{1}% {û}{{\^u}}{1}% {=}{$\leftarrow$}{1} {==}{$={}$}{1}
- inputencoding : spécifie l’encodage
- mathescape : permet d’insérer des formules en mode mathématique dans le listing
- basicstyle : style par défaut des caractères
- numberstyle : style par défaut des numéros de lignes
- showstringspaces = false : ne montre par les espaces (sinon, c’est très moche… mais quelque fois, c’est utile dans d’autres listings)
- tabsize : dimension des tabulations
- numbers = left : les numéros de lignes sont mis à gauche
- xleftmargin : marge de gauche (je décale ici de 8mm afin que les numéros de lignes soient au même niveau que le texte)
- frame = lines : définit le cadre (je ne veux que deux lignes en haut et en bas du listing)
- framexleftmargin : par défaut, les traits s’arrêtent avant les numéros de lignes, chose que je ne veux pas donc je fais en sorte de les prolonger de 8 mm, décalage de ces numéros
- framerule : épaisseur des traits
- rulecolor : couleur des traits
- backgroundcolor : couleur de fond
- commentstyle : définition du style d’écriture des commentaires
- morecomment : comment je souhaite montrer qu’il y a un commentaire ? [l] signifie “sur la ligne courante, tout ce qui suit…”; [commentstyle] signifie que l’on va donner comme style celui définit précédemment, et enfin {//} signifie que tout ce qui va suivre deux slashes sera considéré comme commentaire
- classoffset = 0 : nous allons définir la “première couche de mots-clés”
- keywords : définition des mots-clés principaux que je souhaite mettre en avant
- keywordstyle : style que je souhaite pour ces mots-clés principaux
- classoffset = 1 : nous allons définir la “deuxième couche” de mots-clés
- morekeywords : autres mots-clés secondaires (je n’en ai mis qu’un seul, mais on peut en mettre d’autres)
- keywordstyle : style des mots-clés secondaires
- classoffset = 0 : on revient à la couche “normale”
- morestring = [b]” : tout ce qui est entre guillemets sera considéré comme chaîne de caractères
- stringstyle : style des chaînes de caractères
- literate : c’est la partie la plus délicate; c’est ici que l’on définit les substitution de caractères. Toutes ces substitutions sont de la forme {caractère dans le listing}{ce par quoi on doit le replacer}{nombre d’espaces à droite et à gauche de la substitution}. C’est ainsi que l’on peut mettre une flèche d’affectation (allant vers la gauche) en tapant uniquement “=” (c’est bien plus pratique ainsi). Et par conséquent, on redéfinit le “=” par “==”.
Le code \(\LaTeX\) définissant le listing UTF8
\documentclass[10pt]{article} \usepackage[utf8]{inputenc} \usepackage{xcolor,listingsutf8,lipsum} \lstdefinestyle{algo}{% inputencoding=utf8, mathescape, basicstyle=\footnotesize\ttfamily, numberstyle=\scriptsize\ttfamily\color{gray}, showstringspaces=false, tabsize=2, numbers=left, framexleftmargin=8mm, xleftmargin=8mm, keepspaces=true, frame=lines, framerule=1pt, rulecolor=\color{green!50!black}, backgroundcolor=\color{green!5}, keywords = {Pour, allant, Si, alors, Sinon, Fin}, morecomment=[l][commentstyle]{//}, commentstyle=\color{gray}, classoffset=0, keywordstyle=\color{blue!75}, classoffset=1, morekeywords = {Afficher}, keywordstyle=\color{green!50!black}, classoffset=0, morestring=[b]", stringstyle=\color{red!75}, literate= {é}{{\'e}}{1}% {è}{{\`e}}{1}% {à}{{\`a}}{1}% {â}{{\^a}}{1}%%% {ç}{{\c{c}}}{1}% {œ}{{\oe}}{1}% {ù}{{\`u}}{1}% {É}{{\'E}}{1}% {È}{{\`E}}{1}% {À}{{\`A}}{1}% {Ç}{{\c{C}}}{1}% {Œ}{{\OE}}{1}% {Ê}{{\^E}}{1}% {ê}{{\^e}}{1}% {î}{{\^i}}{1}% {ï}{{\"i}}{1}%%% {ô}{{\^o}}{1}% {û}{{\^u}}{1}% {=}{$\leftarrow$}{1}% {==}{$={}$}{1}} \begin{document} \lipsum[1] \begin{lstlisting}[style=algo] n = 0 Pour i allant de 1 à 6 x = entier aléatoire compris entre 1 et 6 Si x == 6 alors n = n+1 Fin Si Fin Pour Si n > 0 alors // condition Afficher "Le joueur a gagné." Sinon Afficher "Le joueur a perdu." Fin Si \end{lstlisting} \lipsum[2] \end{document}