Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
domaines_specialises:informatique:inserer_du_code_source_informatique [2020/07/14 21:09] – Remise en forme, correction des liens morts, ajout de "minted". jejust4_domaines_specialises:informatique:inserer_du_code_source_informatique [2022/11/30 16:16] (Version actuelle) – [Avec l'extension “minted”] https et liens améliorés dbitouze
Ligne 1: Ligne 1:
-====== Comment insérer un code source dans un document? ======+====== 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 LaTeX, 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. 
 + 
 +<note important> 
 +[[4_domaines_specialises:informatique:inclure_un_fichier_en_mode_verbatim|L'inclusion de code «verbatim»]] est traitée ailleurs, 
 +ainsi que [[4_domaines_specialises:informatique:ecrire_du_pseudocode|le problème de la mise en forme des algorithmes]]. 
 +</note> 
 + 
 +===== Avec l'extension “listings” ===== 
 + 
 +L'extension [[ctanpkg>listings]] est souvent considérée comme la meilleure solution 
 +pour une sortie mise en forme (elle se charge d'analyser les sources des programmes et 
 +d'utiliser différentes polices de caractères pour en mettre la structure en évidence), 
 +mais il existe plusieurs autres extensions bien établies qui s'appuient sur une sorte de pré-compilateur. 
 +Vous pouvez utiliser [[ctanpkg>listings]] pour mettre en page des extraits que vous incluez dans votre source: 
 + 
 +<WRAP column 40ex> 
 +<code latex> 
 +  \usepackage{listings} 
 +  \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} 
 +</code> 
 +</WRAP> 
 +<WRAP column> 
 +<latexdoc> 
 +\documentclass{article} 
 +  \usepackage{lmodern} 
 +  \usepackage{listings} 
 +  \lstset{language=C} 
 +  \pagestyle{empty} 
 + 
 +\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} 
 +</latexdoc> 
 +</WRAP> 
 +<WRAP clear /> 
 + 
 +mais vous pouvez aussi l'utiliser pour mettre en forme des fichiers entiers: 
 +<WRAP 40ex> 
 +<code latex> 
 +  \usepackage{listings} 
 +  \lstset{language=C} 
 +... 
 +\begin{document} 
 +\lstinputlisting{main.c} 
 +\end{document} 
 +</code> 
 +</WRAP> 
 +<WRAP clear /> 
 + 
 +Ces exemples très simples peuvent être colorés de diverses façons et, bien sûr, 
 +l'extension comprend beaucoup d'autres langages que le ''C''...
  
  
Ligne 9: Ligne 84:
 directement le fichier source). Ce package permet de définir directement le fichier source). Ce package permet de définir
 facilement son propre langage, en le faisant éventuellement hériter facilement son propre langage, en le faisant éventuellement hériter
-d'un autre, avec des mots-clés spécifiques, etc.+d'un autre, avec des mots-clefs spécifiques, etc.
  
-% Prakash : J'ai mis une liste de langages pour faciliter la recherche dans 
-% la FAQ, avec des mots clés... 
 Cependant, il ne doit pas être souvent utile de définir son langage, vu la Cependant, il ne doit pas être souvent utile de définir son langage, vu la
-liste sans cesse croissante de langages prédéfinis (\langprog{ABAP}, +liste sans cesse croissante de langages prédéfinis (''ABAP''''ACSL'', 
-\langprog{ACSL}\langprog{Ada}\langprog{Algol}\langprog{Assembler}, +''Ada''''Algol''''Assembler''''Basic''''C''''C++''''Caml''
-\langprog{Basic}\langprog{C}\langprog{C++}\langprog{Caml}+''Cobol''''Clean''''Comal 80''''Delphi''''Eiffel''''Elan'', 
-\langprog{Cobol}\langprog{Clean}\langprog{Comal~80}\langprog{Delphi}, +''erlang''''Fortran''''Fortran''''GCL''''Haskell''''HTML''
-\langprog{Eiffel}\langprog{Elan}\langprog{erlang}\langprog{Fortran}, +''IDL''''Java''''Lisp''''Logo'',''make''''Mathematica''''Matlab''
-\langprog{Fortran}\langprog{GCL}\langprog{Haskell}\langprog{HTML}+''Mercury''''MetaPost''''Miranda''''Mizar''''ML''''Modula-2'', 
-\langprog{IDL}\langprog{Java}\langprog{Lisp}\langprog{Logo}, +''MuPAD''''NASTRAN''''Oberon-2''''OCL''''Octave''''Pascal'', 
-\langprog{make}\langprog{Mathematica}\langprog{Matlab}+''Perl''''PHP''''PL/I''''POV''''Prolog''''Python''''R''
-\langprog{Mercury}\langprog{MetaPost}\langprog{Miranda}, +''Reduce''''Ruby''''S''''SAS''''Scilab'', scripts shell (''csh''''ksh'', etc.), 
-\langprog{Mizar}\langprog{ML}\langprog{Modula-2}\langprog{MuPAD}, +''SHELXL''''Simula''''SQL''''tcl'', <latex>\TeX</latex>, 
-\langprog{NASTRAN}\langprog{Oberon-2}\langprog{OCL}\langprog{Octave}, +''VBScript''''Verilog''''VHDL''''VRML''''XML'').
-\langprog{Pascal}\langprog{Perl}\langprog{PHP}\langprog{PL/I}, +
-\langprog{POV}\langprog{Prolog}\langprog{Python}\langprog{R}+
-\langprog{Reduce}\langprog{Ruby}\langprog{S}\langprog{SAS}, +
-\langprog{Scilab}, scripts shell (\langprog{csh}\langprog{ksh}...) +
-\langprog{SHELXL}\langprog{Simula}\langprog{SQL}\langprog{tcl}, <latex>\TeX</latex>, +
-\langprog{VBScript}\langprog{Verilog}\langprog{VHDL}\langprog{VRML}, +
-\langprog{XML}).+
  
 L'exemple ci-dessous montre comment il est simple de présenter L'exemple ci-dessous montre comment il est simple de présenter
-du code source avec [[ctanpkg>listings]], ici du Pascal.+du code source avec [[ctanpkg>listings]], ici du Pascal:
  
 +<WRAP column 55ex>
 +<code latex>
 +\documentclass{article}
 +  \usepackage{listings}
  
-Code Pascal présenté par [[ctanpkg>listings|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}
 +</code>
 +</WRAP>
 +<WRAP column 30ex>
 <latexdoc> <latexdoc>
 \documentclass{article} \documentclass{article}
Ligne 46: Ligne 132:
  
 \begin{document} \begin{document}
-  \thispagestyle{empty}+\thispagestyle{empty}
  
 \lstset{language=Pascal,literate={:=}{{$\gets$}}1 \lstset{language=Pascal,literate={:=}{{$\gets$}}1
   {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}   {<=}{{$\leq$}}1 {>=}{{$\geq$}}1 {<>}{{$\neq$}}1}
 +
 \begin{lstlisting} \begin{lstlisting}
 program Toto; program Toto;
Ligne 61: Ligne 148:
 \end{document} \end{document}
 </latexdoc> </latexdoc>
 +</WRAP>
 +<WRAP clear />
  
 <note> <note>
-Moyennant quelques paramètres à ajouter, il est tout à fait possible de +Moyennant quelques paramètres à ajouter, il est tout à fait possible de faire en sorte 
-faire en sorte que ces packages reconnaissent les fontes 8 bits. On peut +que ces packages reconnaissent les fontes 8(nbsp)bits. On peut lui faire comprendre par exemple que, 
-lui faire comprendre par exemple, que lorsqu'il rencontre la chaîne +lorsqu'il rencontre la chaîne « ''mathonesuperior'' », il doit la transformer en ''$\mathonesuperior$''.
-«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)+
 </note> </note>
  
 +Pendant longtemps, l'extension [[ctanpkg>listings]] a été vue comme la panacée en la matière.
 +Mais ces dernières années, des alternatives viables sont apparues.
  
 +===== Avec l'extension “highlight” =====
  
-$\Reponse$  Le package [[ctanpkg>lgrind|lgrind]] (exécutable et ''lgrind.sty'')+[[ctanpkg>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 (La)TeX, [[ctanpkg>highlight]] pourra produire des représentations (X)HTML, RTF et XSL-FO 
 +de votre code-source. [[http://www.andre-simon.de/doku/highlight/en/highlight.php|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. 
 + 
 + 
 +===== Avec l'extension “minted” ===== 
 + 
 +L'extension [[ctanpkg>minted]] est une autre alternative qui permet créer de nouvelles définitions de langage. 
 +Il nécessite que le code soit traité à l'aide d'un script externe, écrit en Python, ''[[https://pygments.org/|Pygments]]''
 +Pygments, à son tour, a besoin d'un [[wpfr>Analyse_lexicale|analyseur lexical]] 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 web de ''[[https://pygments.org/docs/lexerdevelopment/|Pygments]]''
 + 
 +L'usage de [[ctanpkg>minted]] peut être aussi simple que ceci: 
 + 
 +<WRAP 40ex> 
 +<code latex> 
 +\begin{minted}{⟨language⟩} 
 +... 
 +\end{minted} 
 +</code> 
 +</WRAP> 
 +<WRAP clear /> 
 + 
 +qui traite le code du programme à la volée, au moment de la compilation. 
 + 
 +<note important> 
 +Cela demande que [[2_programmation:compilation:write18|l'appel aux programmes externes]] soit autorisé. 
 +</note> 
 + 
 + 
 +$\Reponse$  Le package [[ctanpkg>minted]] est sans doute la solution la plus moderne et flexible. 
 +Il fait appel au package [[ctanpkg>fancyvrb]], mais aussi au programme externe ''[[https://pygments.org/|Pygment]]'' 
 +que vous devrez installer séparément. 
 + 
 +FIXME Un exemple d'utilisation est donné sur 
 +[[https://bioinfo-fr.net/latex-la-mise-en-forme-du-texte-et-des-paragraphes#crayon-5f0e18eb47226674652384|https://bioinfo-fr.net/]], et un [[https://zestedesavoir.com/tutoriels/1848/presenter-du-code-source-dans-un-document-latex/|tutoriel très détaillé]] existe aussi. 
 + 
 + 
 +===== Avec l'extension “showexpl” ===== 
 + 
 +Dans un autre ordre d'idées, le paquetage [[ctanpkg>showexpl]] prend en charge la mise en forme de code (La)TeX 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 (La)TeX, ou pour les articles 
 +sur (La)TeX. Le paquetage utilise des [[ctanpkg>listings]] pour le volet (La)TeX, et insère le résultat de la compilation dans une simple boîte, 
 +pour l'autre volet. 
 + 
 +===== Autres solutions ===== 
 + 
 +$\Reponse$  L'extension [[ctanpkg>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 permet, entre autres, de formater du code source d'un langage donné en
-<latex>\LaTeX</latex>. Parmi les langages reconnus, on trouve~\langprog{Ada}+<latex>\LaTeX</latex>. Parmi les langages reconnus, on trouve : ''Ada''
-\langprog{assembleur}\langprog{BASIC}\langprog{Batch}, +''assembleur''''BASIC''''Batch''''C''''C++''''FORTRAN'', 
-\langprog{C}\langprog{C++}\langprog{FORTRAN}\langprog{GnuPlot}, +''GnuPlot''''Icon''''IDL''''ISP''''Java''''Kimwitu++'', 
-\langprog{Icon}\langprog{IDL}\langprog{ISP}\langprog{Java}, +''ABAP'', ''LaTeX''''LDL''''Lex''''Linda''''Lisp''''MATLAB'', 
-\langprog{Kimwitu++}<latex>\LaTeX</latex>\langprog{LDL}\langprog{Lex}, +''ML''''Mercury''''model''''Modula-2''''Pascal''''Perl'', 
-\langprog{Linda}\langprog{Lisp}\langprog{MATLAB}\langprog{ML}, +scripts shell, ''PostScript''''Prolog''''RATFOR''''RLaB''''Russell'', 
-\langprog{Mercury}\langprog{model}\langprog{Modula-2}, +''SAS''''Scheme''''SICStus''''src''''SQL''''Tcl/Tk''''VisualBasic''''yacc''.
-\langprog{Pascal}\langprog{Perl}\langprog{scripts shell}, +
-\langprog{PostScript}\langprog{Prolog}\langprog{RATFOR}, +
-\langprog{RLaB}\langprog{Russell}\langprog{SAS}, +
-\langprog{Scheme}\langprog{SICStus}\langprog{src}\langprog{SQL}, +
-\langprog{Tcl/Tk}\langprog{VisualBasic}\langprog{yacc}.+
  
-Ce programme, [[ctanpkg>lgrind|disponible sur le CTAN,]] +Le programme ''lgrind'' permet à partir du code source de générer du code <latex>\LaTeX</latex> 
-permet à partir du code source de générer du code <latex>\LaTeX</latex> respectant +respectant l'indentation.  Il transforme le source en question, par exemple ''monfichier.c'', 
-l'indentation.  Ainsi, l'exécutable ''lgrind'' transforme le source +en ''monfichier.tex'', que l'on inclut directement dans son fichier <latex>\LaTeX</latex>, 
-en question, par exemple ''monfichier.c'', en +à l'aide d'une commande appropriée (voir 
-''monfichier.tex'', que l'on inclut directement dans son fichier +«[[3_composition/texte/document/decouper_un_document_en_plusieurs_fichiers|Comment découper un document en plusieurs fichiers?]]»). 
-<latex>\LaTeX</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'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>\LaTeX</latex> produit par L'exemple ci-dessous présente le code <latex>\LaTeX</latex> produit par
 ''lgrind'' pour le même code souce Pascal que dans l'exemple précédent ''lgrind'' pour le même code souce Pascal que dans l'exemple précédent
 (aux changements de ligne près). (aux changements de ligne près).
- 
  
 <note> <note>
   * Utiliser au-moins la version 3.6;   * Utiliser au-moins la version 3.6;
   * on peut paramétrer [[ctanpkg>lgrind]] avec le fichier ''lgrindef''.   * on peut paramétrer [[ctanpkg>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.+  * 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.
 </note> </note>
  
Ligne 112: Ligne 241:
 Résultat produit par ''lgrind'': Résultat produit par ''lgrind'':
  
-<latexdoc>+<code latex>
 \documentclass{article} \documentclass{article}
   \usepackage[latin1]{inputenc}   \usepackage[latin1]{inputenc}
Ligne 126: Ligne 255:
  
 \begin{document} \begin{document}
-  \thispagestyle{empty}+\thispagestyle{empty}
  
 \renewcommand{\footrulewidth}{0.4pt} \renewcommand{\footrulewidth}{0.4pt}
Ligne 152: Ligne 281:
 \printindex \printindex
 \end{document} \end{document}
-</latexdoc>+</code> 
 + 
 + 
 + 
 +$\Reponse$  Le package [[ctanpkg>tinyc2l]] est un convertisseur de code ''C'', ''C++'' ou ''Java'' 
 +en <latex>\LaTeX</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.
  
  
 +===== Solutions anciennes =====
  
 $\Reponse$  Le package [[ctanpkg>c++2latex|c++2latex]], sous licence GPL, est capable de $\Reponse$  Le package [[ctanpkg>c++2latex|c++2latex]], sous licence GPL, est capable de
Ligne 166: Ligne 303:
 C, C++, IDL et Perl. C, C++, IDL et Perl.
  
-FIXME Est-il intéressant de parler de cvt2ltx ? Je n'ai meme pas reussi à le compiler.+FIXME Est-il intéressant de parler de cvt2ltx ? Je n'ai même pas réussi à le compiler.
  
 +Voici quelques autres systèmes plus anciens (et moins «puissants»):
  
-$\Reponse$  Le package [[ctanpkg>tinyc2l]], de MPlugge +  * Le système [[ctanpkg>lgrind]] est un précompilateur bien établiavec toutes les facilités dont on peut avoir besoin et un vaste répertoire de langages supportés; il est dérivé du système [[ctanpkg>tgrind]], encore plus ancien, dont la sortie était basée sur Plain TeX
-([[mailto:m.plugge@fh-mannheim.de]]) basé sur ''cvt2ltx''. Il s'agit +  * Le système [[ctanpkg>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é. 
-d'un convertisseur de code C, C++ ou \langprog{Java}, en <latex>\LaTeX</latex>+  * [[http://www.arnoldarts.de/cpp2latex/|C++2LaTeX]] est clairement orienté vers une utilisation avec ''C'' et ''C++''
-Il numérote les lignes, traduit ''!='' en $\neq$, gère les commentaires, les en-têtes de procédures, etc. +  * Un système extrêmement simple est [[ctanpkg>c2latex]], avec lequel vous écrivez votre source LaTeX dans les commentaires de votre programme ''C'' (un peu dans la logique du //[[5_fichiers:web:literate_programming|literate programming]]//). Le programme convertit ensuite votre programme en un fichier LaTeX prêt à être compilé. Le programme est censé être "auto-documenté".
-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 [[ctanpkg>minted]] est sans doute la solution la plus moderne et flexible. +
-Il fait appel au package [[ctanpkg>fancyvrb]], mais aussi au programme externe [[https://pygments.org/|Pygment]] +
-que vous devrez installer séparément.+
  
-FIXME Un exemple d'utilisation est donné ici: 
-[[https://bioinfo-fr.net/latex-la-mise-en-forme-du-texte-et-des-paragraphes#crayon-5f0e18eb47226674652384|https://bioinfo-fr.net/latex-la-mise-en-forme-du-texte-et-des-paragraphes]] 
  
 +-----
 +//Source:// [[faquk>FAQ-codelist|Code listings in LaTeX]]
  
-{{htmlmetatags>metatag-keywords=(LaTeX,langages de programmation,mise en forme de code,coloration syntaxique+{{htmlmetatags>metatag-keywords=(LaTeX,langages de programmation,mise en forme de code,coloration syntaxiquenformater un programme,formater du code,verbatim,insérer du code-source
-metatag-og:title=(Comment insérer un code source dans un document?)+metatag-og:title=(Comment mettre en forme du code informatique?)
 metatag-og:site_name=(FAQ LaTeX francophone) metatag-og:site_name=(FAQ LaTeX francophone)
 }} }}
  
4_domaines_specialises/informatique/inserer_du_code_source_informatique.1594760977.txt.gz · Dernière modification : 2020/07/14 21:09 de jejust
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0