Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
domaines_specialises:informatique:inserer_du_code_source_informatique [2020/12/12 13:55] – Correction de balises de codes LaTeX et suppression de balises LaTeX dbitouze | 4_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 |
---|
====== 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''... |
| |
| |
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. |
| |
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 (''ABAP'', | liste sans cesse croissante de langages prédéfinis (''ABAP'', ''ACSL'', |
''ACSL'', ''Ada'', ''Algol'', ''Assembler'', | ''Ada'', ''Algol'', ''Assembler'', ''Basic'', ''C'', ''C++'', ''Caml'', |
''Basic'', ''C'', ''C++'', ''Caml'', | ''Cobol'', ''Clean'', ''Comal 80'', ''Delphi'', ''Eiffel'', ''Elan'', |
''Cobol'', ''Clean'', ''Comal~80'', ''Delphi'', | ''erlang'', ''Fortran'', ''Fortran'', ''GCL'', ''Haskell'', ''HTML'', |
''Eiffel'', ''Elan'', ''erlang'', ''Fortran'', | ''IDL'', ''Java'', ''Lisp'', ''Logo'',''make'', ''Mathematica'', ''Matlab'', |
''Fortran'', ''GCL'', ''Haskell'', ''HTML'', | ''Mercury'', ''MetaPost'', ''Miranda'', ''Mizar'', ''ML'', ''Modula-2'', |
''IDL'', ''Java'', ''Lisp'', ''Logo'', | ''MuPAD'', ''NASTRAN'', ''Oberon-2'', ''OCL'', ''Octave'', ''Pascal'', |
''make'', ''Mathematica'', ''Matlab'', | ''Perl'', ''PHP'', ''PL/I'', ''POV'', ''Prolog'', ''Python'', ''R'', |
''Mercury'', ''MetaPost'', ''Miranda'', | ''Reduce'', ''Ruby'', ''S'', ''SAS'', ''Scilab'', scripts shell (''csh'', ''ksh'', etc.), |
''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'', <latex>\TeX</latex>, | ''SHELXL'', ''Simula'', ''SQL'', ''tcl'', <latex>\TeX</latex>, |
''VBScript'', ''Verilog'', ''VHDL'', ''VRML'', | ''VBScript'', ''Verilog'', ''VHDL'', ''VRML'', ''XML''). |
''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]]: | \begin{document} |
| |
<code latex> | \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> |
\documentclass{article} | \documentclass{article} |
\usepackage[latin1]{inputenc} | \usepackage[latin1]{inputenc} |
\usepackage[T1]{fontenc} | \usepackage[T1]{fontenc} |
\usepackage{listings} | \usepackage{listings} |
| |
\begin{document} | \begin{document} |
\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; |
\end{lstlisting} | \end{lstlisting} |
\end{document} | \end{document} |
</code> | </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” ===== |
| |
| [[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$ Le package [[ctanpkg>lgrind|lgrind]] (exécutable et ''lgrind.sty'') | $\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 : ''Ada'', | <latex>\LaTeX</latex>. Parmi les langages reconnus, on trouve : ''Ada'', |
''assembleur'', ''BASIC'', ''Batch'', | ''assembleur'', ''BASIC'', ''Batch'', ''C'', ''C++'', ''FORTRAN'', |
''C'', ''C++'', ''FORTRAN'', ''GnuPlot'', | ''GnuPlot'', ''Icon'', ''IDL'', ''ISP'', ''Java'', ''Kimwitu++'', |
''Icon'', ''IDL'', ''ISP'', ''Java'', | ''ABAP'', ''LaTeX'', ''LDL'', ''Lex'', ''Linda'', ''Lisp'', ''MATLAB'', |
''Kimwitu++''ABAP'''', <latex>\LaTeX</latex>, ''LDL'', ''Lex'', | ''ML'', ''Mercury'', ''model'', ''Modula-2'', ''Pascal'', ''Perl'', |
''Linda'', ''Lisp'', ''MATLAB'', ''ML'', | scripts shell, ''PostScript'', ''Prolog'', ''RATFOR'', ''RLaB'', ''Russell'', |
''Mercury'', ''model'', ''Modula-2'', | ''SAS'', ''Scheme'', ''SICStus'', ''src'', ''SQL'', ''Tcl/Tk'', ''VisualBasic'', ''yacc''. |
''Pascal'', ''Perl'', ''scripts shell'', | |
''PostScript'', ''Prolog'', ''RATFOR'', | |
''RLaB'', ''Russell'', ''SAS'', | |
''Scheme'', ''SICStus'', ''src'', ''SQL'', | |
''Tcl/Tk'', ''VisualBasic'', ''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> |
| |
<code latex> | <code latex> |
\documentclass{article} | \documentclass{article} |
\usepackage[latin1]{inputenc} | \usepackage[latin1]{inputenc} |
\usepackage[T1]{fontenc} | \usepackage[T1]{fontenc} |
| |
\usepackage[procnames,noindent]{lgrind} | \usepackage[procnames,noindent]{lgrind} |
\usepackage{fancyhdr,a4wide} | \usepackage{fancyhdr,a4wide} |
\usepackage{german} | \usepackage{german} |
\usepackage{makeidx} | \usepackage{makeidx} |
\pagestyle{fancy} | \pagestyle{fancy} |
| |
\makeindex | \makeindex |
| |
| |
| |
| $\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 |
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 M. Plugge | * Le système [[ctanpkg>lgrind]] est un précompilateur bien établi, avec 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 ''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) |
}} | }} |
| |