Je cherche, à coté d'un code mis en forme avec le package listing, à ajouter du texte à droite de certaines lignes, via le package tikzmark : l'idée est de partir de la marque automatiquement placée à la fin d'une ligne par tikzmark pour tracer une flèche et mettre le texte à l'extrémité de cette flèche. (L'intérêt étant de commenter quelques lignes du code.)

Mon objectif est que chacun de ces textes soient alignés horizontalement sans que j'ai à définir par essai-erreur la longueur de chaque flèche.

D'un point de vue TikZ, le problème se résume donc à : je dispose d'une abscisse x et d'un point A ; A est défini par le système de coordonnées (pic cs:). Je souhaite définir le point de même ordonnée que A et d'abscisse égale à x. Problème : je n'arrive pas à le faire simplement (car je suis clairement noyé dans les différentes possibilités de TikZ...).

Voici un code permettant de bien voir ce que je souhaite et résumant mes tentatives.

\documentclass[french]{article}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usetikzmarklibrary{listings}

\usepackage{babel}

\begin{document}

\begin{lstlisting}[name=codetest,numbers=left]
boucle:
   ab
   cd
   efghijkl
   mn
   opqr
   stuvw
   xyz
\end{lstlisting}

\begin{tikzpicture}[remember picture]
\draw[<-,overlay] (pic cs:line-codetest-1-end) -- (7,0 |- {pic cs:line-codetest-1-end}) node[right]{problème};
\draw[<-,overlay] ([shift={(0,0.1)}]pic cs:line-codetest-3-end) -- (7,0 |- {pic cs:line-codetest-3-end}) node[right]{échec 2a};
\draw[<-,overlay] (pic cs:line-codetest-4-end)++(0,0.1) -- (7,0 |- {pic cs:line-codetest-4-end}) node[right]{échec 2b};
\draw[<-,overlay,yshift=0.1] (pic cs:line-codetest-5-end) -- (7,0 |- {pic cs:line-codetest-5-end}) node[right]{échec 3};

\path[overlay] (pic cs:line-codetest-6-end)++(0,0.1) node (ligne6){};
\draw[<-, overlay] (ligne6) -- (7,0 |- ligne6) node[right]{réussite 1};

\path[overlay] ([yshift=0.5ex]pic cs:line-codetest-7-end) node (ligne7){};
\draw[<-, overlay] (ligne7) -- (7,0 |- ligne7) node[right]{réussite 2};
\end{tikzpicture}

problème: le point de départ est defini par tikzmark comme en bas de la ligne: j'aimerais qu'il soit au milieu

échecs 2a et 2b: j'arrive à shifter le point de départ mais pas le point d'arrivée. Je n'arrive à pas décaler le point défini grâce à (7,0 |- {pic cs:line-codetest-4-end}) (que ce soit par shift ou par coordonnées relatives ++)

échec 3: j'essaye de shifter d'un coup le tracé mais ça ne fonctionne pas.

réussites 1 et 2: résultat satisfaisant mais j'ai dû passer par la (re)définition du point de départ.
\end{document}

Questions (qui sont liées) :

  1. Y a-t-il un changement simple à apporter aux lignes échecs 2a, échecs 2b et échecs 3 pour qu'elles fassent ce que j'attends ?
  2. Est-il possible d'obtenir le résultat des lignes réussite 1 et réussite 2 sans avoir à définir les points ligne6 et ligne7 ?

Posée 09 Mar '23, 19:19

Mathieu2L's gravatar image

Mathieu2L
316314
Taux d'acceptation : 75%

Modifiée 09 Mar '23, 19:21


J'utiliserais TikZ let :

\documentclass[french]{article}
\usepackage{babel}
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usetikzmarklibrary{listings}
\usetikzlibrary{calc}

\begin{document}

\begin{lstlisting}[name=codetest,numbers=left]
boucle:
   ab
   cd
   efghijkl
   mn
   opqr
   stuvw
   xyz
\end{lstlisting}

\newcommand{\annotate}[2]{
  \draw let 
    \p1=(#1),
    \p2=(firstline)
  in (\p1) -- (\x2,\y1) node[right]{#2};
}

\begin{tikzpicture}[remember picture,overlay,<-,transform canvas={yshift=0.7ex}]
\coordinate (firstline) at (7,0 |- {pic cs:line-codetest-1-end});
\annotate{pic cs:line-codetest-1-end}{problème}
\annotate{pic cs:line-codetest-3-end}{échec 2a}
\annotate{pic cs:line-codetest-4-end}{échec 2b}
\annotate{pic cs:line-codetest-5-end}{échec 3}
\annotate{pic cs:line-codetest-6-end}{réussite 1}
\annotate{pic cs:line-codetest-7-end}{réussite 1}
\end{tikzpicture}

\end{document}

alt text

Lien permanent

Publiée 10 Mar '23, 12:21

samcarter's gravatar image

samcarter
8.2k2817
Taux d'acceptation : 57%

Modifiée 10 Mar '23, 12:28

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.