Ajuster en largeur un listing sous \(\LaTeX\)

  • Dernière modification de la publication :28 août 2020
  • Temps de lecture :4 min de lecture
  • Commentaires de la publication :4 commentaires

Loading

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}
5 1 vote
Évaluation de l'article
S’abonner
Notification pour
guest
4 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
yvig

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]

yvig

Rebonjour,
visiblement ce problème de débordement de cadre n’apparaît que dans les listes.
[code supprimé: trop long]

yvig

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?

Dernière modification le 4 mois il y a par yvig