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

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

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

Messagepar pzorba75 » Dimanche 13 Octobre 2019, 04:38

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 édition par pzorba75 le Mardi 15 Octobre 2019, 09:10, édité 1 fois.
On se lasse de tout, excepté d'apprendre.
Virgile
pzorba75
Kilo-utilisateur
 
Messages: 174
Inscription: Mardi 20 Août 2013, 03:50
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Cadre pour algorithme (Python!) avec listings

Messagepar rebouxo » Dimanche 13 Octobre 2019, 08:56

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
rebouxo
Modérateur
 
Messages: 6952
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Cadre pour algorithme (Python!) avec listings

Messagepar Denis Bitouzé » Dimanche 13 Octobre 2019, 09:08

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
Denis Bitouzé
Hecto-utilisateur
 
Messages: 75
Inscription: Vendredi 27 Octobre 2006, 19:27
Localisation: Dunkerque
Statut actuel: Actif et salarié | Maître de conférence

Re: Cadre pour algorithme (Python!) avec listings

Messagepar evariste_G » Dimanche 13 Octobre 2019, 10:30

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.
Mathématiques, LaTeX et Python : http://www.mathweb.fr
Cours particuliers de maths et de NSI : https://cours-particuliers-bordeaux.fr/
evariste_G
Téra-utilisateur
 
Messages: 1433
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Actif et salarié | Enseignant

Re: Cadre pour algorithme (Python!) avec listings

Messagepar marco56 » Dimanche 13 Octobre 2019, 13:22

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.
Fichiers joints
listing1.png
listing1.png (8.21 Kio) Vu 207 fois
marco56
Giga-utilisateur
 
Messages: 777
Inscription: Jeudi 25 Novembre 2010, 22:10
Statut actuel: Actif et salarié | Enseignant

Re: Cadre pour algorithme (Python!) avec listings

Messagepar marco56 » Dimanche 13 Octobre 2019, 13:23

Le deuxième programme donne :
Fichiers joints
listing2.png
listing2.png (27.47 Kio) Vu 207 fois
marco56
Giga-utilisateur
 
Messages: 777
Inscription: Jeudi 25 Novembre 2010, 22:10
Statut actuel: Actif et salarié | Enseignant

Re: Cadre pour algorithme (Python!) avec listings

Messagepar pzorba75 » Dimanche 13 Octobre 2019, 14:00

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
pzorba75
Kilo-utilisateur
 
Messages: 174
Inscription: Mardi 20 Août 2013, 03:50
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Cadre pour algorithme (Python!) avec listings

Messagepar Denis Bitouzé » Lundi 14 Octobre 2019, 07:17

>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--bitouze/pub/latex/formations/installation-latex.pdf/view.
Denis
Denis Bitouzé
Hecto-utilisateur
 
Messages: 75
Inscription: Vendredi 27 Octobre 2006, 19:27
Localisation: Dunkerque
Statut actuel: Actif et salarié | Maître de conférence

Re: Cadre pour algorithme (Python!) avec listings

Messagepar pzorba75 » Mardi 15 Octobre 2019, 08:57

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
pzorba75
Kilo-utilisateur
 
Messages: 174
Inscription: Mardi 20 Août 2013, 03:50
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Bing [Bot], Google [Bot], Grapeshot [Crawler], Magpie [Crawler] et 12 invités