3
1

Cherchant à ajuster en largeur les codes écrits avec listings, je suis tombé sur cette solution qui me convient parfaitement : https://www.mathweb.fr/euclide/2019/10/13/ajuster-en-largeur-un-listing-sous-latex/

Mais elle rentre en conflit avec les listes de type enumerate comme le montre l'exemple ci-dessous : le code est décalé vers la droite, la marge gauche est exagérée et le code déborde à droite. Je bloque complètement. Est-ce un conflit entre tikz et enumerate ou entre listings et enumerate ? Comment faire ?

\documentclass[10pt]{article} 
 \usepackage[utf8]{inputenc}
 \usepackage{lmodern}
 \usepackage[a4paper,margin=1.5cm,includefoot]{geometry}
 \usepackage{amssymb}
 \usepackage[frenchb]{babel}
 \usepackage{colortbl}
 \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}
   \textbf{Exercice 1 : Arbres binaires de recherche, POO et récursivité - 10 points}

   \begin{python}
    class Noeud:
        def __init__(self, g, v, d):
             """crée un noeud d'un arbre binaire"""
             self.gauche = g
             self.valeur = v
             self.droit = d
    \end{python}

    \begin{enumerate}
    \item et là, ça ne va plus :

    \begin{python}
     class Noeud:
         def __init__(self, g, v, d):
              """crée un noeud d'un arbre binaire"""
              self.gauche = g
              self.valeur = v
              self.droit = d
     \end{python}

  \end{enumerate}
  \end{document}

Posée 19 Déc '23, 10:00

yvig's gravatar image

yvig
423
Taux d'acceptation : 0%

Modifiée 20 Déc '23, 15:32

denis's gravatar image

denis ♦♦
7.0k1510

Bienvenue sur TeXnique.fr !

(19 Déc '23, 10:18) denis ♦♦ denis's gravatar image

Les formules de politesse et les signatures sont à éviter : celle(s) de votre contribution a (ont) été supprimée(s).

(19 Déc '23, 10:18) denis ♦♦ denis's gravatar image

@yvig : bienvenue sur TeXnique.fr !

(19 Déc '23, 21:22) Pathe ♦♦ Pathe's gravatar image

@yvig : vous avez marqué la question comme résolue sans choisir la réponse qui vous a le plus aidé. Pour ce faire, pourriez-vous utiliser la boîte à cocher prévue à cet effet, en haut à gauche de chaque réponse ? Ce serait utile aux prochains visiteurs de cette page.

(20 Déc '23, 10:47) Pathe ♦♦ Pathe's gravatar image

Je ne réponds pas directement à la question, mais il est possible de régler votre problème tout en simplifiant votre code, avec le recours :

  • au package tcolorbox et sa bibliothèque listingsutf8 ;
  • à l'option hbox pour que le listing ait sa largeur naturelle ;
  • à l'option inputencoding=utf8/latin1 du package listingsutf8 permettant d'éviter l'option literate ;
  • au package xsim pour la gestion des exercices.

Voici un exemple :

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{tcolorbox}
\usepackage[a4paper]{geometry}
\usepackage[use-files]{xsim}
\usepackage{babel}

\tcbuselibrary{listingsutf8}
% \tcbset{listing utf8=latin1}

\tcbset{
  python/.style={
    colback=blue!10,
    colframe=blue!50!black,
    fonttitle=\bfseries,
    listing only,
    hbox,
    listing options={
      language = python,
      basicstyle = \ttfamily,
      numbers = left,
      numberstyle = \color{gray}\tiny,
      tabsize = 2,
      inputencoding=utf8/latin1,
      showstringspaces = false,
      keywordstyle = \color{orange}\bfseries,
      commentstyle = \color{green!50!black}\itshape,
      stringstyle=\color{yellow!50!black},
      emph = {somme},
      emphstyle = \color{red!50!black},
    }
  },
}

\NewTCBListing{python}{ O{}}{%
  python,
  #1
}

\begin{document}
\begin{exercise}[subtitle ={Arbres binaires de recherche, POO et récursivité},points=10]
\begin{python}
class Noeud:
    def __init__(self, g, v, d):
         """crée un noeud d'un arbre binaire"""
         self.gauche = g
         self.valeur = v
         self.droit = d
\end{python}
\begin{enumerate}
\item et là, ça va :
\begin{python}
class Noeud:
    def __init__(self, g, v, d):
         """crée un noeud d'un arbre binaire"""
         self.gauche = g
         self.valeur = v
         self.droit = d
\end{python}
\end{enumerate}
\end{exercise}
\end{document}
Lien permanent

Publiée 19 Déc '23, 11:02

denis's gravatar image

denis ♦♦
7.0k1510
Taux d'acceptation : 52%

Merci beaucoup, c'est effectivement ce que je veux obtenir ! Malheureusement, la ligne 37 \NewTCBListing{python}{ O{}}{% provoque une erreur Undefined Control Sequence chez moi.

Pourtant tcolorbox est bien installé.

J'ai consulté la doc de tcolorbox (https://texdoc.org/serve/tcolorbox.pdf/0), essayé \newtcblisting et \DeclareTCBListing mais rien n'a changé. tcolorbox a pourtant l'air bien...

(19 Déc '23, 13:25) yvig yvig's gravatar image
1

Vous devez avoir une version sacrément ancienne du package tcolorbox car \NewTCBListing a été introduit lors de sa version 2.80 (2014/03/31) et il en est à sa version 6.1.0 (2023-09-26).

(19 Déc '23, 13:55) denis ♦♦ denis's gravatar image

J'ai trouvé une solution : \usepackage[most]{tcolorbox} ligne 5 fait fonctionner votre code. Merci encore, je vais pouvoir me pencher sur le package xsim que je ne connaissais pas.

(19 Déc '23, 14:18) yvig yvig's gravatar image
1

Il est possible que votre version de tcolorbox ne charge pas par défaut la bibliothèque xparse, ce que fait l'option most. Avec \usepackage{tcolorbox} seulement, mais \tcbuselibrary{listingsutf8,xparse}, cela fonctionne-t-il ?

(19 Déc '23, 14:50) denis ♦♦ denis's gravatar image

oui ça marche aussi. Je suis allé voir à quoi servait xparse et je n'ai pas été déçu... je crois que je ne suis pas au niveau pour l'utiliser autrement qu'en recopiant des instructions, d'autant plus que je n'ai presque rien trouvé en français.

(19 Déc '23, 20:59) yvig yvig's gravatar image
\documentclass[10pt]{article} 
 \usepackage[utf8]{inputenc}
 \usepackage{lmodern}
 \usepackage[a4paper,margin=1.5cm,includefoot]{geometry}
 \usepackage{amssymb}
 \usepackage[frenchb]{babel}
 \usepackage{colortbl}
 \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}%
     \ifnum\theenumi>0
     \noindent
     \fi%
\tikz\node[%
       rounded corners = 3pt, 
       line width = 1pt , 
       draw = blue!50!black , 
       fill = blue!10 , 
       inner sep = 3mm] {
 \begin{minipage}{\dimexpr\largeurboxlisting+#1mm}
   \ifnum\theenumi>0
   \hspace{-\leftmargini}%
     \ifnum\value{enumii}>0
       \hspace{-\leftmarginii}%
     \fi%
   \fi%
 \hspace*{#1mm}\usebox\pythonbox
 \end{minipage}
 };
 }

  \begin{document}
   \textbf{Exercice 1 : Arbres binaires de recherche, POO et récursivité - 10 points}

\begin{python}
class Noeud:
    def __init__(self, g, v, d):
         """crée un noeud d'un arbre binaire"""
         self.gauche = g
         self.valeur = v
         self.droit = d
\end{python}

  \begin{enumerate}
  \item et là, ça ne va plus :

\begin{python}
class Noeud:
    def __init__(self, g, v, d):
         """crée un noeud d'un arbre binaire"""
         self.gauche = g
         self.valeur = v
         self.droit = d
\end{python}

  \begin{enumerate}
  \item et là, ça ne va plus :

\begin{python}
class Noeud:
    def __init__(self, g, v, d):
         """crée un noeud d'un arbre binaire"""
         self.gauche = g
         self.valeur = v
         self.droit = d
\end{python}

  \end{enumerate}

  \end{enumerate}

  \end{document}

alt text

Lien permanent

Publiée 19 Déc '23, 14:14

samcarter's gravatar image

samcarter
8.2k2817
Taux d'acceptation : 57%

Modifiée 19 Déc '23, 14:15

Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.