Comment mettre en forme du code informatique ?#

Les logiciels qui affichent du code informatique utilisent des couleurs pour rendre les programmes plus lisibles. Ceci permet de repérer visuellement les mots-clefs du langage, les noms de variables, etc. Il est possible de faire la même chose avec pour que la structure du code soit soulignée par la mise en forme. C’est très utile pour les livres sur la programmation, mais aussi pour les travaux des étudiants en informatique.

Notez que l’inclusion de code verbatim est traitée ailleurs, de même que le problème de mise en forme des algorithmes.

1.  Avec l’extension listings#

L’extension listings est l’une des plus abouties pour une sortie mise en forme (il se charge d’analyser les sources des programmes et d’utiliser différentes polices de caractères pour en mettre la structure en évidence).

Il est moins puissant mais plus immédiat dans son utilisation que minted par exemple.

On peut utiliser listings pour mettre en page des extraits de code inclus dans le source :

\documentclass{article}
  \usepackage{lmodern}
  \usepackage{listings}
  \pagestyle{empty}

  \lstset{language=C}

\begin{document}
\begin{lstlisting}
#include <stdio.h>

int main(int argc, char ** argv)
{
  printf("Bonjour tout le monde !\n");
  return 0;
}
\end{lstlisting}
\end{document}

Mais vous pouvez aussi traiter des fichiers entiers de code :

\usepackage{listings}
\lstset{language=C}
...
\begin{document}
\lstinputlisting{main.c}
\end{document}

Ces exemples très simples peuvent être présentés d’une grande variété de façons, et, bien sûr, il y a d’autres langages dans l’extension en plus du C

Voir aussi

Pour plus de détails sur l’utilisation de ce package, consultez « Comment présenter du code informatique avec le package listings ? »

2.  Avec l’extension minted#

L’extension minted est une alternative. Elle nécessite quelques réglages pour être utilisé mais est ensuite d’une utilisation très simple.

Important

L’utilisation de cette extension nécessite de compiler avec l’option shell-escape, permettant que l’appel aux programmes externes soit autorisé.

Ici c’est la biliothèque python Pygments qui est appelée lors de la compilation et nécessite donc d’être installée séparément sur la machine.

L’usage de minted peut être aussi simple que ceci :

\begin{minted}{⟨language⟩}
...
\end{minted}

Pour les plus curieux d’entre vous, Pygments, à son tour, a besoin d’un analyseur lexical (lexer) qui connaît le langage que vous voulez utiliser ; il en existe de nombreux, pour les langages les plus utilisés, et il y a aussi des conseils pour écrire le vôtre sur le site de Pygments.

Voir aussi

Pour plus de détails sur l’utilisation de cette extension, consultez « Comment présenter du code informatique avec le package minted ? »

3.  Avec l’extension tcolorbox#

tcolorbox permet d’utiliser minted ou listings pour en améliorant encore la mise en forme.

Voir aussi

Pour plus de détails sur l’utilisation de cette extension, consultez « Comment présenter du code informatique avec le package tcolorbox ? »

4.  Avec l’extension highlight#

highlight est intéressante si vous avez besoin de plus d’un format de sortie pour votre programme. En effet, en plus de la sortie highlight pourra produire des représentations (X)HTML, RTF et XSL-FO de votre code-source. Le manuel (en anglais) vous sera d’une grande aide si vous devez écrire le fichier de paramètres pour un nouveau langage, ou modifier la mise en forme d’un langage déjà défini.

5.  Avec l’extension showexpl#

Dans un autre ordre d’idées, l’extension showexpl prend en charge la mise en forme de code et de sa sortie compilée, dans des « volets » situés en regard l’un de l’autre. C’est notamment utile pour les manuels ou pour les articles sur L’extension utilise listings pour le volet et, pour l’autre volet, insère le résultat de la compilation dans une simple boîte.

Note

L’extension tcolorbox permet de faire la même chose, mais avec toute sa puissance. Cela semble être une meilleure solution.

6.  Autres solutions#

6.1.  L’extension lgrind#

L’extension lgrind (qui fournit un exécutable et un fichier de style, lgrind.sty) permet, entre autres, de formater du code source d’un langage donné en Parmi les langages reconnus, on trouve : Ada, assembleur, BASIC, Batch, C, C++, FORTRAN, GnuPlot, Icon, IDL, ISP, Java, Kimwitu++, ABAP, LaTeX, LDL, Lex, Linda, Lisp, MATLAB, ML, Mercury, model, Modula-2, Pascal, Perl, scripts shell, PostScript, Prolog, RATFOR, RLaB, Russell, SAS, Scheme, SICStus, src, SQL, Tcl/Tk, VisualBasic, yacc. Il trouve son origine dans tgrind qui génrait un travail similaire pour Plain

Le programme lgrind permet à partir du code source de générer du code respectant l’indentation. Il transforme le source en question, par exemple monfichier.c, en monfichier.tex, que l’on inclut directement dans son fichier à l’aide d’une commande appropriée (voir « Comment découper un document en plusieurs fichiers ? »). L’inconvénient est qu’évidemment, il y a un fichier .tex qui est généré en plus.

L’exemple ci-dessous présente le code produit par lgrind pour le même code souce Pascal que dans l’exemple précédent (aux changements de ligne près).

Note

  • Pour des raisons de licence, lgrind est absent des distributions Live et

  • Il faut utiliser au-moins la version 3.6.

  • On peut paramétrer lgrind avec le fichier lgrindef.

  • Par défaut, l’auteur a jugé utile de transformer la lettre « à » en \(\alpha\). Il suffit donc de commenter cette option à la fin de ce fichier pour éviter cela.

Résultat produit par lgrind :

\documentclass{article}
  \usepackage[T1]{fontenc}
  \usepackage[procnames,noindent]{lgrind}
  \usepackage{makeidx}
  \pagestyle{fancy}

  \makeindex

\begin{document}
\thispagestyle{empty}

\renewcommand{\footrulewidth}{0.4pt}
\fancyhead[C]{\lgrindhead}
\fancyhead[LO,RE]{\lgrindfilesize~Bytes\\%
\lgrindmodtime}
\fancyhead[RO,LE]{\bfseries \lgrindfilename\\%
\lgrindmodday.\lgrindmodmonth.\lgrindmodyear}
\fancyfoot[C]{\bfseries\thepage}
\setlength{\headheight}{24pt}
\begin{lgrind}
\BGfont
\File{toto.p}{2004}{2}{18}{16:08}{119}
\L{\LB{\K{program}_\V{Toto};}}
\L{\LB{}\Tab{2}{\K{var}_\V{i}_:_\V{integer};}}
\L{\LB{\K{begin}}}
\L{\LB{}\Tab{2}%
{\K{if}_(\V{i}\<=\N{0})_\K{then}_\V{i}_:=_\N{1};}}
\L{\LB{}\Tab{2}%
{\K{if}_(\V{i}\>=\N{0})_\K{then}_\V{i}_:=_\N{0};}}
\L{\LB{}\Tab{2}%
{\K{if}_(\V{i}\<\>\N{0})_\K{then}_\V{i}_:=_\N{0};}}
\L{\LB{\K{end.}}}
\end{lgrind}
\printindex
\end{document}

6.2.  L’extension lgrind#

L’extension tinyc2l est un convertisseur de code C, C++ ou Java en Il numérote les lignes, traduit != en \(\neq\), gère les commentaires, les en-têtes de procédures, etc. Il supporte plusieurs fichiers d’entrée et gère automatiquement les changements de section et la génération d’index.

6.3.  Des solutions plus anciennes#

Voici quelques autres solutions un peu plus datées :

  • l’extension c++2latex, sous licence GPL, est capable de convertir des fichiers C, C++ ou JAVA en Les lignes peuvent être numérotées. Une ancienne version est disponible sur le CTAN : https://tug.ctan.org/support/C++2-1_1pl1/, et ses mises à jour sont sur le site web de l’auteur ;

  • cvt2ltx, disponible sur ftp://axp3.sv.fh-mannheim.de/cvt2latex/cvt2ltx.zip est une famille de convertisseurs code source vers pour les langages C, C++, IDL et Perl ;

    À faire

    Est-il intéressant de parler de cvt2ltx ? Je n’ai même pas réussi à le compiler.

  • Le système tinyc2l est un peu plus récent : les utilisateurs sont encore encouragés à écrire leurs propres pilotes pour les langages qu’il ne supporte pas encore, mais le « tiny » dans son nom indique à juste titre qu’il ne s’agit pas d’un système spécialement élaboré ;

  • C++2 est clairement orienté vers une utilisation avec C et C++ ;

  • Un système extrêmement simple est c2latex, avec lequel vous écrivez votre source dans les commentaires de votre programme C (un peu dans la logique du literate programming). Le programme convertit ensuite votre programme en un fichier prêt à être compilé. Le programme est censé être « auto-documenté ».