Cadre pour algorithme (Python!) avec listings

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 205
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

[Résolu] Cadre pour algorithme (Python!) avec listings

Message par pzorba75 »

Bonjour à tous,
avec la montée en première ligne du langage Python dans les programmes de lycée, je sens le besoin de rédiger les algorithmes (ou les programmes/scripts Python) en les plaçant dans des boites ajustées dynamiquement à la bonne largeur de la ligne la plus longue. Avec le package listings, je n'ai trouvé qu'un bidouillage pas très joli que je place ci-dessous :

Code : Tout sélectionner

\documentclass[a4paper,10pt]{article}

\usepackage{listings}

\begin{document}


\begin{center}
\begin{minipage}{0.325\linewidth}
\lstset{language=Python}
\begin{lstlisting}[firstnumber=auto,frame=single]
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{lstlisting} 
\end{minipage}
\end{center}


\end{document}
Je souhaite "simplifier" cette écriture et disposer d'un environnement plaçant automatiquement une boîte qui encadrera les instructions , faisant ou pas apparaître les numéros de ligne, ce qui ne fonctionne pas quand je place l'option firstnumber=auto contrairement à ce que précise la documentation du package listings.
Je me suis arrêté au package listings qui semble le plus répandu pour rédiger et encadrer du code dans des documents Latex.
J'espère que ma demande est claire.
merci pour l'aide apportée.
Pierre
Dernière modification par pzorba75 le mardi 15 octobre 2019, 10:10, modifié 1 fois.
On se lasse de tout, excepté d'apprendre.
Virgile

rebouxo
Modérateur global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Re: Cadre pour algorithme (Python!) avec listings

Message par rebouxo »

Regarde plutôt du côté de tcolorbox, qui peut s'interfacer avec lstisting (mais aussi minted). Plus de choix dans la mise en forme.

Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.

Denis Bitouzé
Utilisateur confirmé
Utilisateur confirmé
Messages : 78
Inscription : vendredi 27 octobre 2006, 20:27
Localisation : Dunkerque

Re: Cadre pour algorithme (Python!) avec listings

Message par Denis Bitouzé »

Pour obtenir les numéros de ligne, utiliser `numbers=left` ou `numbers=right`.

Voici une solution basée sur les fonctionnalités offertes par le package `tcolorbox` en collaboration avec les packages `listings` (plutôt `listingsutf8` d'ailleurs, afin de permettre l'insertion de caractères accentués, souvent nécessaire dans des commentaires du code en français) et le package `xparse`. Noter le placement inhabituel de l'étoile quand elle est utilisée.

Code : Tout sélectionner

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{xparse,listingsutf8}

\lstset{%
  language=python,%
  basicstyle=\ttfamily,%
}

\DeclareTCBListing{python}{ s O{} }{%
  size=minimal,%
  hbox,%
  colback=white,
  colframe=black,
  listing only,%
  listing options={frame=single},%
  IfBooleanTF={#1}
  {listing options={numbers=none}}
  {listing options={numbers=left}},
  #2%
}

\begin{document}
\begin{python}
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}*
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}[colframe=red]
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}*[colframe=blue]
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}
\end{document}
Denis

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1459
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: Cadre pour algorithme (Python!) avec listings

Message par evariste_G »

On peut aussi faire comme ceci:

Code : Tout sélectionner

\documentclass{article}
\usepackage{listingsutf8}
\lstset{%
  language=python,%
  basicstyle=\ttfamily,%
}
\begin{document}

\newlength\largeurboxlisting
\newsavebox\listingbox

\begin{lrbox}{\listingbox}
\begin{lstlisting}
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{lstlisting}
\end{lrbox}

\settowidth{\largeurboxlisting}{\usebox{\listingbox}}

\fbox{
\begin{minipage}{\largeurboxlisting}
\usebox{\listingbox}
\end{minipage}}

\end{document}
Capture.PNG
Il faudra ensuite adapter l''apparence à ce que l'on souhaite.

PS : le code de Denis ne fonctionne pas chez moi. Les options "numbers=left" semblent poser problème, et en commentant les lignes adéquates, les cadres ne s'adaptent pas à la largeur du listing.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Mathématiques, LaTeX et Python : https://www.mathweb.fr
Cours particuliers par webcam : https://cours-maths-webcam.fr

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 866
Inscription : jeudi 25 novembre 2010, 22:10

Re: Cadre pour algorithme (Python!) avec listings

Message par marco56 »

On peut faire des choses simples comme ceci :

Code : Tout sélectionner

\documentclass[11pt,a4paper]{book} 
\usepackage[utf8]{inputenc}			
\usepackage{textcomp}	
\usepackage[francais]{babel}
\usepackage [T1]{fontenc} 	
\usepackage{lmodern}

\usepackage{xcolor}
\usepackage{listings}

\begin{document}
\lstnewenvironment{python_list}{\lstset{breaklines=true,showspaces=false,framexleftmargin=5mm, frame=shadowbox, rulesepcolor=\color{black},backgroundcolor=\color{lightgray},linewidth=\textwidth,inputencoding=utf8}}{}


\begin{minipage}{10cm}
\begin{python_list}
#!/usr/bin/python
# -*- coding: utf-8 -*-

print("Hello")
\end{python_list}
\end{minipage}

\end{document}
qui donne l'encadré gris ou bien des choses un peu plus élaborées, par exemple avec :

Code : Tout sélectionner

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{fullpage}
\usepackage{color}
\usepackage[table]{xcolor}
\usepackage{pythonhighlight_marco}
 
\begin{document}
 
\begin{python_cons}
#include <stdio.h>
 
int main(void) {
  printf("Hello World\n");
  printf("Avec caractère accentué\n");
  return EXIT_SUCCESS;
}
\end{python_cons}

\begin{python_def}
#include <stdio.h>

int main(void) {
	printf("Hello World\n");
	printf("arrêté grâce à Loïc");
	return EXIT_SUCCESS;
}
\end{python_def}

\begin{python_cons}
>>> ma_chaine = "arrêté grâce à Loïc
>>> ma_chaine.replace("ê","e").replace("ï","i")
'arreté grâce à Loic'
\end{python_cons}

\begin{python_def}
>>> ma_chaine = "arrêté grâce à Loïc
>>> ma_chaine.replace("ê","e").replace("ï","i")
'arreté grâce à Loic'
\end{python_def}

\end{document}
Je peux joindre mon fichier pythonhighlight_marco si besoin.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 866
Inscription : jeudi 25 novembre 2010, 22:10

Re: Cadre pour algorithme (Python!) avec listings

Message par marco56 »

Le deuxième programme donne :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 205
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

Re: Cadre pour algorithme (Python!) avec listings

Message par pzorba75 »

Denis Bitouzé a écrit :Pour obtenir les numéros de ligne, utiliser `numbers=left` ou `numbers=right`.

Voici une solution basée sur les fonctionnalités offertes par le package `tcolorbox` en collaboration avec les packages `listings` (plutôt `listingsutf8` d'ailleurs, afin de permettre l'insertion de caractères accentués, souvent nécessaire dans des commentaires du code en français) et le package `xparse`. Noter le placement inhabituel de l'étoile quand elle est utilisée.

Code : Tout sélectionner

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{xparse,listingsutf8}

\lstset{%
  language=python,%
  basicstyle=\ttfamily,%
}

\DeclareTCBListing{python}{ s O{} }{%
  size=minimal,%
  hbox,%
  colback=white,
  colframe=black,
  listing only,%
  listing options={frame=single},%
  IfBooleanTF={#1}
  {listing options={numbers=none}}
  {listing options={numbers=left}},
  #2%
}

\begin{document}
\begin{python}
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}*
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}[colframe=red]
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}*[colframe=blue]
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}
\end{document}
j'ai essayé cette solution qui m'a demandé de faire des mises à jour des packages gérés sous le Package update (Admin) de Miktex 2.9. J'ai donc lancé cette mise à jour qui semble avoir fait bien des dégâts dans mon installation. Quand la mise à jour a été effectuée, j'ai essayé de compiler le fichier et reçu plusieurs avertissements pour installer des packages que je ne connais pas, sans doute appelés en interne par d'autres packages mis à jour précédemment. La compilation ne marche pas avec une erreur sur ... lipsum too old en lien, d'après mes recherches avec google à l3 kernel et sa suite.
Nouveau problème : le package update (Admin) ne marche plus non plus (ni le Settings, ni le Mamager non plus), la fenêtre ne s'ouvre pas et j'ai une erreur copystart_admin.exe raccourci manquant. Evidemment ce fichier ne semble pas disponible dans miketx\bin\x64.
Je suis complètement boqué.
Par quel endroit faut-il que je commence pour tout remettre en marche? Ce qui est assez loin de Python et listings j'en conviens.
J'espère avoir donné assez de détails n'étant pas vraiment un "pro" de toutes des installations.
Merci pour l'aide.
Pierre
On se lasse de tout, excepté d'apprendre.
Virgile

Denis Bitouzé
Utilisateur confirmé
Utilisateur confirmé
Messages : 78
Inscription : vendredi 27 octobre 2006, 20:27
Localisation : Dunkerque

Re: Cadre pour algorithme (Python!) avec listings

Message par Denis Bitouzé »

>semble avoir fait bien des dégâts dans mon installation

Outch! Désolé pour tout cela, d'autant que je ne peux pas aider à résoudre le problème car je ne connais que très peu MiKTeX. En revanche, je peux recommander à la place la distribution TeX Live dont l'installation sous Windows est décrite par exemple ici : https://gte.univ-littoral.fr/Members/d- ... x.pdf/view.
Denis

pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 205
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

Re: Cadre pour algorithme (Python!) avec listings

Message par pzorba75 »

Après désinstallation manuelle et installation de Milktex 2.9, tout est en ordre. Les cadres Pyhton sont corrects, le choix est plus délicat, toutes les solutions convenant à mon propos.
On se lasse de tout, excepté d'apprendre.
Virgile

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2036
Inscription : lundi 01 octobre 2007, 10:20

Re: Cadre pour algorithme (Python!) avec listings

Message par GMaths »

Bonjour,

déterrage d'un ancien sujet rencontré lors de l'une de mes pérégrinations sur la toile, pour proposer une rectification à un problème soulevé l'année dernière.
evariste_G a écrit :
dimanche 13 octobre 2019, 11:30
PS : le code de Denis ne fonctionne pas chez moi.
Il fonctionne mieux comme cela ?

Code : Tout sélectionner

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{xparse,listingsutf8}

\lstset{%
  language=python,%
  basicstyle=\ttfamily,%
  numbersep=20pt
}

\DeclareTCBListing{python}{ s O{} }{%
  hbox,%
  colback=white,
  colframe=black,
  listing only,%
  IfBooleanTF={#1}
  {listing options={numbers=none}}
  {listing options={numbers=left}},
  #2%
}

\begin{document}
\begin{python}
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}*
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}[colframe=red]
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}

\begin{python}*[colframe=blue]
def diveuclide(a,b):
    while a>b:
        a=a-b
    return(a)
diveuclide(125,26)
diveuclide(43,6)
\end{python}
\end{document}

evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1459
Inscription : vendredi 19 décembre 2008, 19:13
Localisation : Bordeaux

Re: Cadre pour algorithme (Python!) avec listings

Message par evariste_G »

GMaths a écrit :
vendredi 28 août 2020, 18:17
Il fonctionne mieux comme cela ?
Parfaitement !
Mathématiques, LaTeX et Python : https://www.mathweb.fr
Cours particuliers par webcam : https://cours-maths-webcam.fr