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

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

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}
Stéphane Pasquet
Stéphane Pasquet

Laissez votre message