Ceci est une ancienne révision du document !


Comment insérer un code source dans un document?

$\Reponse$ 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-clefs 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:

\documentclass{article}
  \usepackage{listings}
 
\begin{document}
 
\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}

\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}
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 doit la transformer en $\mathonesuperior$.

$\Reponse$ 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 \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.

Le programme lgrind permet à partir du code source de générer du code \LaTeX respectant l'indentation. Il 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 (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 \LaTeX produit par lgrind pour le même code souce Pascal que dans l'exemple précédent (aux changements de ligne près).

  • 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}

$\Reponse$ 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.

$\Reponse$ 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.

FIXME Un exemple d'utilisation est donné sur https://bioinfo-fr.net/, et un tutoriel très détaillé existe aussi.

Solutions anciennes

$\Reponse$ Le package c++2latex, sous licence GPL, est capable de convertir des fichiers C, C++ ou JAVA en \LaTeXe. Les lignes peuvent être numérotées. Une ancienne version est disponible sur le CTAN: http://tug.ctan.org/support/C++2LaTeX-1_1pl1/, et ses mises à jour sont sur le site web de l'auteur.

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

FIXME Est-il intéressant de parler de cvt2ltx ? Je n'ai même pas reussi à le compiler.

4_domaines_specialises/informatique/inserer_du_code_source_informatique.1636470487.txt.gz · Dernière modification : 2021/11/09 15:08 de jejust
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0