Cet article est inspiré du post du forum mathematex dont l’adresse est : http://forum.mathematex.net/latex-f6/cadre-pour-algorithme-python-avec-listings-t17255.html
L’idée est ici de créer un environnement “python” (par exemple) qui permet d’écrire un code Python et de le présenter encadré de sorte que le cadre soit ajusté en largeur (ce qui n’est pas le cas par défaut car le cadre tient sur toute la largeur).
Avant tout, le visuel basique
Le code \(\LaTeX\)
Comme vous pouvez le voir sur les visuels, on peut mettre les nombres à l’intérieur ou à l’extérieur du cadre. On va donc créer un environnement avec une option.
\documentclass{article} \usepackage{listingsutf8} \newlength\largeurboxlisting \newsavebox{\pythonbox}% \lstnewenvironment{python}[1][5]{% \begingroup \lrbox{\pythonbox}% \lstset{% language=python, basicstyle=\ttfamily, numbers=left }% }{% \endlrbox\endgroup \settowidth{\largeurboxlisting}{\usebox\pythonbox} \fbox{ \begin{minipage}{\dimexpr\largeurboxlisting+#1mm} \hspace*{#1mm}\usebox\pythonbox \end{minipage} } } \begin{document} \begin{python} def temp(a,b): return a+b temp(1,2) \end{python} \end{document}
L’option sert donc ici à spécifier le décalage. Par défaut, on va décaler de 5 mm vers la droite le listing, permettant ainsi aux nombres d’apparaître dans le cadre. Si on souhaite qu’ils soient à l’extérieur du cadre, on mettra se décalage à 0:
\begin{python}[0] def temp(a,b): return a+b temp(1,2) \end{python}
Un meilleur rendu
Les plus perfectionnistes auront sans doute envie d’une présentation plus agréable. On peut utiliser TiKZ (ou PSTricks) pour optimiser l’affichage, ainsi que les diverses options du package listings.
On pourra alors se baser sur l’exemple suivant est ajuster en fonction de nos préférences.
\documentclass{article} \usepackage{listingsutf8} \usepackage{tikz} \newlength\largeurboxlisting \newsavebox{\pythonbox}% \lstnewenvironment{python}[1][5]{% \begingroup \lrbox{\pythonbox}% \lstset{% language = python, inputencoding=utf8, basicstyle = \ttfamily, numbers = left, numberstyle = \color{gray}\tiny, tabsize = 2, showstringspaces = false, keywordstyle = \color{orange}\bfseries, commentstyle = \color{green!50!black}\itshape, stringstyle=\color{yellow!50!black}, emph = {somme}, emphstyle = \color{red!50!black}, literate= {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1 {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1 {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1 {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1 {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1 {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1 {Ã}{{\~A}}1 {ã}{{\~a}}1 {Õ}{{\~O}}1 {õ}{{\~o}}1 {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 }% }{% \endlrbox\endgroup \settowidth{\largeurboxlisting}{\usebox\pythonbox} \tikz\node[% rounded corners = 3pt, line width = 1pt , draw = blue!50!black , fill = blue!10 , inner sep = 3mm] { \begin{minipage}{\dimexpr\largeurboxlisting+#1mm} \hspace*{#1mm}\usebox\pythonbox \end{minipage} }; } \begin{document} \begin{python} # On définit la fonction def somme(a,b): return a+b print('Le résultat est' , somme(1,2)) \end{python} \end{document}
Bonjour et merci beaucoup pour ce code : je n’ai trouvé nulle part ailleurs de code permettant d’ajuster la largeur de la boite et d’en griser l’intérieur.
Malheureusement, j’ai un problème de centrage comme le montre la page 1 de mon fichier pdf. Le cadre est décalé vers la gauche : marge exagérée et code débordant du cadre à droite. J’ai pourtant copié-collé ton code sans le modifier.
As-tu une idée de la cause de ce problème ?
Je ne peux joindre plus d’un fichier alors je colle mon code : [code supprimé: trop long]
Rebonjour,
visiblement ce problème de débordement de cadre n’apparaît que dans les listes.
[code supprimé: trop long]
Je vous suggère de vous orienter vers un forum LaTeX car ce site n’est pas destiné à ce genre de soucis. Si je passe sur le forum de mathematex, je regarderai, mais il y a d’autres spécialistes qui pourront vous aider :-).
Merci, c’est ce que j’ai fait peu après vous avoir écrit, avec succès. Le fil de discussion se trouve ici : https://texnique.fr/osqa/questions/12375/conflit-entre-enumerate-listingsutf8-et-tikz?