Je cherche à créer un environnement qui permet d'afficher le code d'une figure metapost ainsi que la figure elle-même dans un document compilé avec lualatex et luamplib.

J'ai essayé les packages showexpl et tcolorbox et je me heurte au même problème. Dans l'ECM ci-dessous, je souhaiterais que ne soient pas affichées dans le listing les lignes \begin{mplibcode} et \end{mplibcode} puisque l'objectif est de montrer uniquement le code metapost.

\documentclass{article}
\usepackage{fontspec}
\usepackage{luamplib}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\DeclareTCBListing[auto counter]{codemp}{ !O{} }
          {title=Code \thetcbcounter,
          #1}

\begin{document}
 \begin{codemp}
 \begin{mplibcode}
    beginfig(1);
    draw fullcircle scaled 3cm;
    endfig;
  \end{mplibcode}
  \end{codemp}
\end{document}

J'ai cherché dans deux directions :

  • Utiliser firstline et lastline de listings pour supprimer l'affichage de la première et de la dernière ligne de code mais je ne sais pas à l'avance le numéro de la dernière ligne.
  • Utiliser before lower et after lower de tcolorbox mais ça coince, voir ci-dessous.

Code qui ne fonctionne pas :

\documentclass{article}
\usepackage{fontspec}
\usepackage{luamplib}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\DeclareTCBListing[auto counter]{codemp}{ !O{} }
              {title=Code \thetcbcounter,
              before lower = \begin{mplibcode},
              after lower = \end{mplibcode},
              #1}

\begin{document}
\begin{codemp}
beginfig(1);
draw fullcircle scaled 3cm;
endfig;
\end{codemp}
\end{document}

Une piste ?

Posée 11 Jul '22, 16:24

logamath's gravatar image

logamath
49316
Taux d'acceptation : 33%

2

Essayer avec VerbatimOutput (package fancyvrb) pour exporter juste le code metapost puis récupérer le fichier avec VerbatimInput dans l'environnement codemp puis (ou avant) dans un environnement de style listing.

(11 Jul '22, 20:55) Le TeXnicien de surface Le%20TeXnicien%20de%20surface's gravatar image
1

Pourquoi ne pas écrire deux environnements ?

    \newtcblisting{Codes}[2][]{%
  top=0mm,bottom=0mm,left=2mm,right=2mm,middle=0mm,
  colback=white,%
  colframe=white!75!black,
  every listing line={#2},
  listing only,
  listing options={%
    frame=,
    backgroundcolor=,
  },
  #1
}

\NewDocumentEnvironment{CodesM}{o +b}{
  \mplibforcehmode
  \begin{mplibcode}
    #2
  \end{mplibcode}
}
(11 Jul '22, 22:23) christophe-poulain christophe-poulain's gravatar image

C'est pour une formation metapost ? Cela m'intéresse :)

(11 Jul '22, 22:25) christophe-poulain christophe-poulain's gravatar image

@Le Texnicien de surface En essayant fancyvrb, je me retrouve face au même problème : les lignes begin{mplibcode} et end{mplibcode} que j'aimerais supprimer du listing. J'ai trouvé dans la doc FancyVerbStartString et FancyVerbStopString qui pourraient m'aider mais ne semblent pas fonctionner avec begin{mplibcode} et end{mplibcode}. Je suppose que je devrais regarder du côté de l'environnement Example de fancyvrb-ex et le mofifier mais je ne suis pas sûr d'en être capable...

(12 Jul '22, 10:14) logamath logamath's gravatar image

@christophe-poulain Non, ce n'est pas pour une formation :). C'était juste pour avoir quelques exemples mais une question en amène une autre et du coup, ça m'intéressait de savoir faire ça... À propos du code, je ne sais pas très bien comment l'utiliser. Ça oblige à taper deux fois le code metapost ? En tout cas, ça me permet de découvrir usrguide3.pdf et en particulier le +b de NewDocumentEnvironment qui est intéressant.

(12 Jul '22, 10:25) logamath logamath's gravatar image

Il suffit de modifier la définition de \tcbuselistingtext@input qui est :

\def\tcbuselistingtext@input{\input{\kvtcb@listingfile}}

en :

\def\tcbuselistingtext@input{\begin{mplibcode} input \jobname.listing; \end{mplibcode}}

En fait tcolorbox sauvegarde le code dans un fichier, par défaut dans \jobname.listing (où \jobname est le nom du fichier maître sans son extension), et le « remet » en appelant \tcbuselistingtext@input, d'où cette solution.

Afin de ne pas perturber d'autres environnements « tcblistings » on peut faire :

\documentclass{article}
\usepackage{fontspec}
\usepackage{luamplib}
\usepackage{tcolorbox}
\tcbuselibrary{listings}

\makeatletter
\tcbset{%
    listing metapost/.code={%
        \def\tcbuselistingtext@input{\begin{mplibcode} input \jobname.listing; \end{mplibcode}}%
    }
}
\makeatother

\DeclareTCBListing[auto counter]{codemp}{ !O{} }{
    title=Code \thetcbcounter,
    listing metapost,
    #1}

\begin{document}
\begin{codemp}
beginfig(1);
draw fullcircle scaled 3cm;
endfig;
\end{codemp}
\end{document}
Lien permanent

Publiée 12 Jul '22, 16:49

YannD's gravatar image

YannD
465310
Taux d'acceptation : 25%

Voici deux solutions en un fichier. Bien entendu, on peut encore améliorer la situation en créant une commande (ou en environnement) pour factoriser tout ça. J'utilise une fois fancyvrb et une fois tcolorbox. Il doit y avoir moyen de faire quelque chose du même genre avec listings mais je n'ai pas regardé.

\documentclass{article}
\usepackage{fontspec}
\usepackage{luamplib}
\usepackage{fancyvrb}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\tcbset{listing file=toto.mp}
\begin{document}

\begin{VerbatimOut}[gobble=0]{tata.mp}
beginfig(1);
  draw fullcircle scaled 3cm;
endfig;
\end{VerbatimOut}

\begin{mplibcode}
  input tata; 
\end{mplibcode}

\VerbatimInput{tata.mp}

\bigskip{}

\begin{tcboutputlisting}
beginfig(1);
  numeric u;
  u = 3cm; 
  z0 = (0, 0); z1 = (u, 0); z2=(u, u); z3=(0, u); 
  draw for k=0 upto 3: z[k]-- endfor cycle; 
endfig;
\end{tcboutputlisting}

\begin{mplibcode}
  input toto; 
\end{mplibcode}

\tcbinputlisting{colback=green!5,colframe=green!75!black,listing only}

\end{document}
Lien permanent

Publiée 12 Jul '22, 15:35

Le%20TeXnicien%20de%20surface's gravatar image

Le TeXnicien de surface
2.0k814
Taux d'acceptation : 27%

Modifiée 12 Jul '22, 18:07

Pathe's gravatar image

Pathe ♦♦
7.5k42204251

regarder -> regardé :(

(12 Jul '22, 15:35) Le TeXnicien de surface Le%20TeXnicien%20de%20surface's gravatar image

@Le TeXnicien de surface : modification effectuée. Ce commentaire et le vôtre s'autodétruiront dans 24 heures.

(12 Jul '22, 18:08) Pathe ♦♦ Pathe's gravatar image
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.