\(\LaTeX\) et listings en UTF8

\(\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.

Le bon package

Avant tout, laissons tomber listings pour le remplacer par listingsutf8, qui n’est autre qu’un patch à listings.

Notre objectif

J’aimerais créer un langage pour écrire des algorithmes naturels pour arriver à cela:

LaTeX listings UTF8
\(\LaTeX\) et les listings en UTF8 : écrire un algorithme en langage naturel

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}
  1. inputencoding : spécifie l’encodage
  2. mathescape : permet d’insérer des formules en mode mathématique dans le listing
  3. basicstyle : style par défaut des caractères
  4. numberstyle : style par défaut des numéros de lignes
  5. showstringspaces = false : ne montre par les espaces (sinon, c’est très moche… mais quelque fois, c’est utile dans d’autres listings)
  6. tabsize : dimension des tabulations
  7. numbers = left : les numéros de lignes sont mis à gauche
  8. 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)
  9. frame = lines : définit le cadre (je ne veux que deux lignes en haut et en bas du listing)
  10. 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
  11. framerule : épaisseur des traits
  12. rulecolor : couleur des traits
  13. backgroundcolor : couleur de fond
  14. commentstyle : définition du style d’écriture des commentaires
  15. 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
  16. classoffset = 0 : nous allons définir la “première couche de mots-clés”
  17. keywords : définition des mots-clés principaux que je souhaite mettre en avant
  18. keywordstyle : style que je souhaite pour ces mots-clés principaux
  19. classoffset = 1 : nous allons définir la “deuxième couche” de mots-clés
  20. morekeywords : autres mots-clés secondaires (je n’en ai mis qu’un seul, mais on peut en mettre d’autres)
  21. keywordstyle : style des mots-clés secondaires
  22. classoffset = 0 : on revient à la couche “normale”
  23. morestring = [b]” : tout ce qui est entre guillemets sera considéré comme chaîne de caractères
  24. stringstyle : style des chaînes de caractères
  25. 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}
Stéphane Pasquet
Stéphane Pasquet

Laissez votre message

Supportscreen tag