Page 1 sur 1

Verbatim + boite

MessagePosté: Jeudi 03 Mai 2018, 17:31
par zariski63
Bonjour !
Je m'adresse aux chevronnés de TeX car mon problème est somme toute assez pointu, enfin pour moi en tout cas.
Je souhaiterais enfermer dans une boite du code (asymptote en l'occurrence mais peu importe).
La boite aurait pour largeur la largeur du code en question calculée au préalable; et c'est là où je coince.
Cela fonctionne pour enfermer le code dans la boite mais je n'arrive pas à récupérer la bonne largeur qui reste bloquée à 569pt (20cm).

Voici un peu de mon œuvre avec quelques trucs glanés de ci de là :

Code: Tout sélectionner
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage[a4paper,left=0.5cm,right=0.5cm,bottom=1.5cm,top=0.5cm]{geometry}

\usepackage{Eric-Packages}
\usepackage{Eric-Couleurs}
\usepackage{Eric-Verbatim}

\usepackage{verbatim}
\makeatletter
\newwrite{\temp@listing@out}
\newenvironment{exemple}{%
   \immediate\openout\temp@listing@out\jobname-temp.tex
   \bgroup\@bsphack
   \let\do\@makeother\dospecials
   \catcode`\^^M\active
   \def\verbatim@processline{%
        \immediate\write\temp@listing@out{\the\verbatim@line}%
        }%
   \verbatim@start
   }
  {
   \@esphack\egroup
   \immediate\closeout \temp@listing@out
   % création d'une boite
      \newbox\foobox
   % je remplis la boite avec du code asymptote
      \setbox\foobox=\vtop{\lstinputlisting[style=Asy]{\jobname-temp.tex}}
   % création d'une dimension \largeur
      \newdimen\largeur
   % \largeur est la largeur de la boite contenant le listing
      \largeur=\wd\foobox
   % cosmétique à la tikz pour présenter le dit code
      \begin{tikzpicture}[baseline]
         \node[draw=blue,
               fill=yellow!20,
               very thick,
               rectangle,
               rounded corners,
               inner sep=10pt,
               inner ysep=10pt,
               text width=\largeur]{\box\foobox
                                     \par
                                     Largeur = \the\largeur
                                    };
      \end{tikzpicture}
   }
\makeatother




\begin{document}


\begin{exemple}
void draw(picture  pic = currentpicture,// image contenant le dessin
            Label  L = "",              // texte
             path  g,                   // chemin(obligatoire)
            align  align = NoAlign,     // alignement du texte
              pen  p = currentpen,      // plume
         arrowbar  arrow = None,        // fleche
         arrowbar  bar = None,          // barre
           margin  margin = NoMargin,   // espace avant/apres
            Label  legend = "",         // legende
           marker  marker = nomarker    // marqueur
          );
\end{exemple}


\end{document}


Re: Verbatim + boite

MessagePosté: Jeudi 03 Mai 2018, 17:47
par Denis Bitouzé
Je réponds un peu à côté, mais peut-être l'une des libraires `listings',
`listingsutf8' et `minted' du package `tcolorbox' pourrait-elle vous
intéresser

Re: Verbatim + boite

MessagePosté: Jeudi 03 Mai 2018, 17:47
par un bon petit
zariski63 a écrit:La boite aurait pour largeur la largeur du code en question calculée au préalable; et c'est là où je coince.

Vous faites encore la même erreur : vous pensez qu'en mettant du matériel dans une boite verticale, cette dernière adapte sa largeur au matériel. Autant c'est vrai pour une \hbox, autant c'est faux pour les \vbox et \vtop. Sans autre précision, une boite verticale dans laquelle vous composez un paragraphe a pour largeur \hisze, c'est d'ailleurs la largeur que vous récupérez ce qui est logique.

Code: Tout sélectionner
\documentclass{article}
\usepackage[a4paper,margin=1cm,]{geometry}
\begin{document}
\setbox0=\vbox{a\par bla bla bla}
\the\wd0

19 cm vaut en pts : \the\dimexpr19cm\relax
\end{document}


Vous ne pouvez donc pas procéder comme ça. C'est à vous de fixer la largeur finale du cadre, en retirer les épaisseurs des traits et des marges, puis fixer la largeur de la boite verticale au résultat trouvé.

Re: Verbatim + boite

MessagePosté: Jeudi 03 Mai 2018, 18:08
par zariski63
fouya je suis pas sorti de l'auberge ... :?

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 08:02
par zariski63
Là cela dépasse mes compétence ...

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 09:47
par rebouxo
Denis Bitouzé a écrit:Je réponds un peu à côté, mais peut-être l'une des libraires `listings',
`listingsutf8' et `minted' du package `tcolorbox' pourrait-elle vous
intéresser


Je plussoie très fort. J'ai l'impression que tu cherches à réinventer la roue (et ici, la roue est TeXnique...)
Olivier

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 13:40
par zariski63
J'ai dû mal me faire comprendre ...
En fait grâce à "un bon petit" je viens de trouver peut être la solution :
il suffit d'écrire :

Code: Tout sélectionner
  % je remplis la boite avec du code asymptote
      \setbox\foobox=\vtop{%
           \offinterlineskip\null\kern-1ex\hbox{%
            \lstinputlisting[style=Asy]{\jobname-temp.tex}}
           }
  %


Je sais que la solution est souvent TeXnique. Malheureusement j'ai peu de temps pour travailler TeX, langage relativement difficile.
La grosse partie de mon code n'est pas de moi ...

Merci encore "un bon petit" !!!

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 16:14
par un bon petit
zariski63 a écrit:En fait grâce à "un bon petit" je viens de trouver peut être la solution

Ben non, la solution est évidente si \lstinputlisting peut être mis dans une boite horizontale (ce qui m'étonne si le listing a plus d'une ligne mais bon).
Dans ce cas, autant écrire
Code: Tout sélectionner
\setbox\foobox=\hbox{\lstinputlisting[style=Asy]{\jobname-temp.tex}}

et ensuite, mesurer la boite numéro \foobar !

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 17:17
par zariski63
Ah oui aussi !
Par contre, un problème résolu en amène un autre ...

Y a un problème avec les item :

un item disparaît avec le code suivant :

Code: Tout sélectionner
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage[a4paper,left=0.5cm,right=0.5cm,bottom=1.5cm,top=0.5cm]{geometry}

\usepackage{Eric-Packages}
\usepackage{Eric-Couleurs}
\usepackage{Eric-Verbatim}



\usepackage{verbatim}
\makeatletter
\newwrite{\temp@listing@out}
\newenvironment{exemple}[1]{%
   \def\couleurfond{#1}
   \immediate\openout\temp@listing@out\jobname-temp.tex
   \bgroup
   \@bsphack
   \let\do\@makeother\dospecials
   \catcode`\^^M\active
   \def\verbatim@processline{%
        \immediate\write\temp@listing@out{\the\verbatim@line}%
        }%
   \verbatim@start
   }
  {
   \@esphack
   \egroup
   \immediate\closeout \temp@listing@out
   % création d'une boite
      \newbox\foobox
   % je remplis la boite avec du code asymptote
      \setbox\foobox=\hbox{%
            \lstinputlisting[style=Asy]{\jobname-temp.tex}}
   % création d'une dimension \largeur
      \newdimen\largeur
   % \largeur est la largeur de la boite contenant le listing
      \largeur=\wd\foobox
   % cosmétique à la tikz pour présenter le dit code
     \begin{tikzpicture}[baseline]
         \node[text width=\largeur ,
               draw=blue,
               fill=\couleurfond,
               very thick,
               rectangle,
               rounded corners,
               %inner sep=10pt,
               inner ysep=-2pt,
               ]{\lstinputlisting[style=Asy]{\jobname-temp.tex}};
      \end{tikzpicture}
   }
\makeatother

\begin{document}


\begin{enumerate}[leftmargin=5ex,parsep=2ex,itemsep=0cm,topsep=0cm,
                    label=\textbf{\alph*.}]
\item bla bla bla

\begin{exemple}{yellow!20}
bla bla bla bla bla bla bla bla bla bla bla bla bla bla

bla bla bla bla bla bla bla bla bla blabla bla bla bla
\end{exemple}

\item

\begin{exemple}{red!20}
unitsize(1cm);
draw(pic = currentpicture,
       L = Label("Eric",Relative(0.5),Center,red,Fill(yellow)),
       g = (0,0)..(2,1)..(4,0),
   align = NoAlign,
       p = 2pt + black,
   arrow = ArcArrow(DefaultHead, 5mm, 20, FillDraw(blue,red)),
     bar = BeginBar(2mm),
  legend = "",
  marker = nomarker);
\end{exemple}
\end{enumerate}

\end{document}

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 17:30
par un bon petit
zariski63 a écrit:un item disparaît avec le code suivant

Sauf que le code suivant n'est pas un ECM, il ne se termine même pas par \end{document}.
Afin d'obtenir de l'aide, pourriez-vous élaborer un vrai ECM, c'est à dire compilable par n'importe qui (sans recours à des packages perso) ?

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 18:10
par zariski63
Au temps pour moi


Code: Tout sélectionner
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage[a4paper,left=0.5cm,right=0.5cm,bottom=1.5cm,top=0.5cm]{geometry}

\usepackage{enumitem}
\usepackage{listings}
\usepackage{verbatim}
\makeatletter
\newwrite{\temp@listing@out}
\newenvironment{exemple}[1]{%
   \def\couleurfond{#1}
   \immediate\openout\temp@listing@out\jobname-temp.tex
   \bgroup
   \@bsphack
   \let\do\@makeother\dospecials
   \catcode`\^^M\active
   \def\verbatim@processline{%
        \immediate\write\temp@listing@out{\the\verbatim@line}%
        }%
   \verbatim@start
  }
  {
   \@esphack
   \egroup
   \immediate\closeout \temp@listing@out
   % création d'une boite
      \newbox\foobox
   % je remplis la boite avec du code asymptote
      \setbox\foobox=\hbox{\lstinputlisting{\jobname-temp.tex}}
   % création d'une dimension \largeur
      \newdimen\largeur
   % \largeur est la largeur de la boite contenant le listing
      \largeur=\wd\foobox
   % cosmétique à la tikz pour présenter le dit code
     \fbox{
     \begin{minipage}{\largeur}
        \lstinputlisting{\jobname-temp.tex}
     \end{minipage}
     }
   }
\makeatother







\begin{document}


\begin{enumerate}[leftmargin=5ex,parsep=2ex,itemsep=0cm,topsep=0cm,
                    label=\textbf{\alph*.}]
\item bla bla bla

\begin{exemple}{yellow!20}
bla bla bla bla bla bla bla bla bla bla bla bla bla bla

bla bla bla bla bla bla bla bla bla blabla bla bla bla
\end{exemple}

\item

\begin{exemple}{red!20}
unitsize(1cm);
draw(pic = currentpicture,
       L = Label("Eric",Relative(0.5),Center,red,Fill(yellow)),
       g = (0,0)..(2,1)..(4,0),
   align = NoAlign,
       p = 2pt + black,
   arrow = ArcArrow(DefaultHead, 5mm, 20, FillDraw(blue,red)),
     bar = BeginBar(2mm),
  legend = "",
  marker = nomarker);
\end{exemple}
\end{enumerate}



\end{document}

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 18:26
par un bon petit
Ajouter \leavevmode au début de l'environnement exemple pour quitter le mode V.
Et surtout, virer les \newbox et \newdimen de l'environnement car à chaque appel vous allouerez des ressources non nécessaires.

J'en profite pour vous dire que votre dimension \largeur ne sert à rien, mettez \wd\foobox directement dans l'argument de minipage.

Re: Verbatim + boite

MessagePosté: Vendredi 04 Mai 2018, 18:39
par zariski63
Raaaah du feu de dieu tout ça !!!!!

MERCIIIIIIII