Page 1 sur 1

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

MessagePosté: Dimanche 13 Octobre 2019, 04:38
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

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Dimanche 13 Octobre 2019, 08:56
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

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Dimanche 13 Octobre 2019, 09:08
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}

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Dimanche 13 Octobre 2019, 10:30
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.

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Dimanche 13 Octobre 2019, 13:22
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.

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Dimanche 13 Octobre 2019, 13:23
par marco56
Le deuxième programme donne :

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Dimanche 13 Octobre 2019, 14:00
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

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Lundi 14 Octobre 2019, 07:17
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--bitouze/pub/latex/formations/installation-latex.pdf/view.

Re: Cadre pour algorithme (Python!) avec listings

MessagePosté: Mardi 15 Octobre 2019, 08:57
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.