Comment insérer un code source dans un document?

  • Le package listings permet de gérer la mise en page de code source avec notamment la mise en relief de mots-clefs. L’utilisation de ce package ne nécessite pas de programme annexe, i.e. autre que (La)TeX. On inclut directement le source avec une commande adéquate (sur une ligne, dans un environnement ou directement le fichier source). Ce package permet de définir facilement son propre langage, en le faisant éventuellement hériter d’un autre, avec des mots-clés spécifiques, etc.

Cependant, il ne doit pas être souvent utile de définir son langage, vu la liste sans cesse croissante de langages prédéfinis (ABAP, ACSL, Ada, Algol, Assembler, Basic, C, C++, Caml, Cobol, Clean, Comal~80, Delphi, Eiffel, Elan, erlang, Fortran, Fortran, GCL, Haskell, HTML, IDL, Java, Lisp, Logo, make, Mathematica, Matlab, Mercury, MetaPost, Miranda, Mizar, ML, Modula-2, MuPAD, NASTRAN, Oberon-2, OCL, Octave, Pascal, Perl, PHP, PL/I, POV, Prolog, Python, R, Reduce, Ruby, S, SAS, Scilab, scripts shell (csh, ksh, etc.) SHELXL, Simula, SQL, tcl, TeX, VBScript, Verilog, VHDL, VRML, XML).

L’exemple ci-dessous montre comment il est simple de présenter du code source avec listings, ici du Pascal.

Code Pascal présenté par listings:

\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings}

\begin{document}
\thispagestyle{empty}

\lstset{language=Pascal,literate={:=}{{$\gets$}}1
  {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}
\begin{lstlisting}
program Toto;
  var i : integer;
begin
  if (i<=0) then i := 1;
  if (i>=0) then i := 0;
  if (i<>0) then i := 0;
end.
\end{lstlisting}
\end{document}

Note

Moyennant quelques paramètres à ajouter, il est tout à fait possible de faire en sorte que ces packages reconnaissent les fontes 8 bits. On peut lui faire comprendre par exemple, que lorsqu’il rencontre la chaîne «mathonesuperior», il la transforme en |$mathonesuperior$|. %Pas genial % En effet, je n’ai pas compris la remarque… % Qu’est-ce qu’on en fait ? (Nico) % ben je crois que c’est pour dire qu’il peut interpréter des morceaux (TvO)

  • Le package lgrind (exécutable et lgrind.sty) permet, entre autres, de formater du code source d’un langage donné en LaTeX. 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.

Ce programme, disponible sur le CTAN, permet à partir du code source de générer du code LaTeX respectant l’indentation. Ainsi, l’exécutable lgrind transforme le source en question, par exemple monfichier.c, en monfichier.tex, que l’on inclut directement dans son fichier LaTeX, à l’aide d’une commande appropriée (cf.~vref{couper-doc}). 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 LaTeX produit par lgrind pour le même code souce Pascal que dans l’exemple précédent (aux changements de ligne près).

Note

  • 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[latin1]{inputenc}
\usepackage[T1]{fontenc}

\usepackage[procnames,noindent]{lgrind}
\usepackage{fancyhdr,a4wide}
\usepackage{german}
\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}

À faire

Est-il intéressant de parler de cvt2ltx ? Je n’ai meme pas reussi à le compiler.

  • Le package tinyc2l est un convertisseur de code C, C++ ou Java, en LaTeX. 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.

  • Le package minted est sans doute la solution la plus moderne et flexible. Il fait appel au package fancyvrb, mais aussi au programme externe Pygment que vous devrez installer séparément.

À faire

Un exemple d’utilisation est donné ici: https://bioinfo-fr.net/latex-la-mise-en-forme-du-texte-et-des-paragraphes