Utilisation de listings avec langage Python

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux membres inscrits]
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 : 235
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

[Résolu] Utilisation de listings avec langage Python

Message non lu par pzorba75 »

Bonjour à tous,
Je cherche à masquer des instructions écrites en Python dans des sujets d'exercices en présentant le code Python dans un environnement lstlisting.
Je n'ai pas trouvé comment faire tout seul et je n'ai rien glané de proche sur Internet.
Le programme ECM est ci-dessous :

Code : Tout sélectionner

\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[french]{babel}
\DecimalMathComma
\usepackage{mathrsfs,amssymb,mathtools,empheq}
\usepackage{listings}

\begin{document}

Je souhaite effacer randint(1,6) et le remplacer par une boite vide cadre rouge genre fbox{phantom{randint(1,6)}, même idée avec random(1,4) avec un cadre vert et pareil pour som+1 avec un cadre bleu.

Voici comment j'utilise lstlisting pour présenter les sources des fonctions écrites en Python, exemple issu du livre Hyperbole Terminale Spécialité.


\begin{center}
\begin{minipage}{0.425\linewidth}
\lstset{language=Python}
\begin{lstlisting}[firstnumber=auto,numbers=left,frame=single]
from random import *

def Echantillon(n,k):
    som=0
    for i in range(0,n):
        a=randint(1,6)
        b=randint(1,4)
        x=a+b
        if x==k:
            som=som+1
        f=som/n
    return f
\end{lstlisting} 
\end{minipage}
\end{center}


\end{document}
Ma question : comment insérer des boites de couleurs variées à la place des instructions Python?

Je remercie pour l'aide apportée et souhaite un bon dimanche à tous les intervenants disponibles.

Pierre
Pièces jointes
Exo-052-p445-Frequence-somme-lancers-de-2-des-ECM.pdf
(14.37 Kio) Téléchargé 55 fois
On se lasse de tout, excepté d'apprendre.
Virgile
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Utilisation de listings avec langage Python

Message non lu par un bon petit »

Code : Tout sélectionner

\documentclass{article}
\usepackage{listings,xcolor}
\lstset{escapechar="}
\newcommand*\redbox[1]{{\color{red}\fboxsep0pt \fboxrule1pt \fbox{\phantom{\texttt{#1}}}}}
\begin{document}
\lstset{language=Python}
\begin{lstlisting}[firstnumber=auto,numbers=left,frame=single]
from random import *

def Echantillon(n,k):
    som=0
    for i in range(0,n):
        a="\redbox{randint(1,6)}"
        b=randint(1,4)
        x=a+b
        if x==k:
            som=som+1
        f=som/n
    return f
\end{lstlisting}
\end{document}
pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 235
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

Re: Utilisation de listings avec langage Python

Message non lu par pzorba75 »

Exactement ce que je cherchais et, comme toujours avec Un bon petit, très rapidement. Je me doutais que la solution viendrait avec un caractère escape particulier, un peu comme le catcode qu'il est à la base de Tex et auquel je n'ose pas me frotter. Je n'avais pas bien exploité les 63 pages de la documentation de listings qui contenait des éléments de réponse.
Merci beaucoup et bon dimanche.

Une question annexe au sujet de listings et de l'utilisation que j'en fait : je suis obligé de régler la largeur de la boîte manuellement par l'environnement minipage encadrant le source Python, est-il possible avec le programme listings de le faire automatiquement?
On se lasse de tout, excepté d'apprendre.
Virgile
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Utilisation de listings avec langage Python

Message non lu par un bon petit »

pzorba75 a écrit : dimanche 03 avril 2022, 10:51Exactement ce que je cherchais et, comme toujours avec Un bon petit, très rapidement.
J'ai fait exactement la chose suivante : j'ai été chercher pour vous dans le manuel comment échapper vers LaTeX ; puis, j'ai écris une macro très simple pour encadrer en rouge, j'ai testé mon code puis je l'ai posté ici.

Tout cela n'est pas si rapide. En tout cas, vous l'auriez fait quasiment à la même vitesse si vous vous étiez donné la même peine que moi et vous auriez eu une solution qui fonctionne bien plus rapidement sans avoir besoin d'attendre plusieurs heures une réponse ici.
pzorba75 a écrit : dimanche 03 avril 2022, 10:51est-il possible avec le programme listings de le faire automatiquement?
Oui, c'est documenté dans le manuel. Ici encore, j'ai été le chercher pour vous.
pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 235
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

Re: Utilisation de listings avec langage Python

Message non lu par pzorba75 »

Je n'ai pas assez cherché dans la documentation de 63 pages pour trouver comment faire tout seul la boîte encadrée en rouge. Je vous l'accorde.
En revanche, pour encadrer le code, j'ai bien placé frame=single comme indiqué page 18 de la documentation et listings trace un cadre qui, sauf ruse ailleurs décrite m'ayant échappé y compris page 37, fait la largeur de la minipage et pas celle de la plus longue ligne du programme Python, d'où ma question complémentaire.
Merci de votre aide.
On se lasse de tout, excepté d'apprendre.
Virgile
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 949
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Utilisation de listings avec langage Python

Message non lu par un bon petit »

Je n'ai pas assez cherché dans la documentation de 63 pages pour trouver comment faire tout seul la boîte encadrée en rouge. Je vous l'accorde.
C'est aussi, sans doute, par facilité : je vais poser la question sur le forum, il y a bien un «expert» qui répondra et, comme c'est un expert, cela lui prendra très peu de temps. Sauf que non : élaborer une réponse fonctionnelle prend du temps. Aussi bien lorsqu'elle triviale (comme dans ce cas) puisqu'il faut aller se renseigner et lire la documentation (ce qui est d'autant plus pénible que cet effort devrait incomber à celui qui est demandeur) que quand elle n'est pas triviale puisqu'alors, élaborer et coder la solution prend du temps, même si l'on est habitué au codage TeX/LaTeX.
d'où ma question complémentaire
Il y a clé linewidth qui permet de régler la largeur que l'on souhaite.

Je pressens que votre question est : comment le faire automatiquement, c'est à dire sans spécifier de largeur ?

Ben, la question est tout simplement absurde : une boite verticale (\vbox, \vtop, \vcenter ou les «équivalents environnements» LaTeX que sont minipage ou parbox) ne peut pas deviner l'encombrement horizontal du texte qui y est composé, c'est évident. Il est obligatoire de spécifier la largeur de composition ! Le seul cas où la boite verticale «adapte automatiquement» sa largeur à celle des éléments figurant dans la liste verticale est justement le cas où ces éléments ont des largeurs ne résultant pas de composition de paragraphe (typiquement des \hbox) puisque pour composer un paragraphe, il faut connaitre sa largeur...

Je n'ai pas été lire le code de listings, mais je suis prêt à parier que le code en verbatim est mis dans une boite verticale. Il est donc obligatoire de spécifier une largeur.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2035
Inscription : samedi 29 décembre 2007, 00:58

Re: Utilisation de listings avec langage Python

Message non lu par projetmbc »

Bonsoir.

Pourquoi pas utiliser un code énoncé et un autre réponse.

Dans le code énoncé, il suffit alors d'utiliser des ellipsis.

Code : Tout sélectionner

\documentclass{article}
\usepackage{listings,xcolor}
\begin{document}
\lstset{language=Python}
\begin{lstlisting}[firstnumber=auto,numbers=left,frame=single]
from random import *

def Echantillon(n,k):
    som=0
    for i in range(0,n):
        a=...
        b=randint(1,4)
        x=a+b
        if x==k:
            som=som+1
    f=som/n
    return f
\end{lstlisting}
\end{document}
pzorba75
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 235
Inscription : mardi 20 août 2013, 04:50
Localisation : Paris

Re: Utilisation de listings avec langage Python

Message non lu par pzorba75 »

Je cherche à recopier l'énoncé tel qu'il est dans le livre que j'utilise, et dans celui-ci, les instructions Python à compléter sont présentées dans des rectangles vides de couleurs différentes. Dans d'autres ouvrages, ce sont des ellipsis (mot que je viens d'apprendre) qui marquent les instructions à compléter.
Je suis un peu maniaque et surtout attaché à montrer par l'exemple que tous les documents avec des mathématiques peuvent être rédigés avec Latex, et j'y ai souvent recours, avec l'assistance technique du forum.
Voilà pour tout vous dire.
Merci de votre intérêt.
Bon week-end.
On se lasse de tout, excepté d'apprendre.
Virgile