Comment puis-je marquer et étiqueter certaines régions dans la marge avec ConTeXt?

Aug 17 2020

J'écris un document qui traite des différences syntaxiques entre deux langages (disons TeX et Markdown). Traversant divers sujets, le texte parle quelque temps d'une langue puis de l'autre langue.

Ce que je veux faire, c'est placer des marques dans la marge pour montrer quelles régions discutent de TeX et lesquelles discutent de Markdown. Par exemple:

Here are some paragraphs   \
discussing features        | TeX
                           |
of TeX.                    /

And the text starting here \
                           | Markdown
discusses Markdown         /

Comme j'ai pas mal de paires de régions comme celle-ci, j'aimerais les générer avec l'environnement, comme ceci:

\starttexdiscussion
Here are some paragraphs discussing features

of TeX.
\stoptexdiscussion

\startmarkdowndiscussion
And the text starting here

discusses Markdown
\stopmarkdowndiscussion

Est-il possible de définir des environnements qui font cela pour moi? Comment ajuster la position et la longueur du contenu de la marge pour correspondre au contenu principal? Comment gérer les sauts de page?

Réponses

1 flyx Aug 19 2020 at 12:27

Voici une solution basée sur les commentaires d'Henri Menke qui fait exactement ce qui est décrit, y compris le fractionnement des accolades lorsque des sauts de page sont rencontrés.

\def\definebraceddiscussion#1[#2]#3[#4]{
  \startuseMPgraphic{#2frame}
    begingroup;
        numeric n ;
        pair lr, ur ;
        picture p ;
        for i=1 upto nofmultipars :
            lr := lrcorner multipars[i] ;
            ur := urcorner multipars[i] ;
            n := arclength(lr -- ur) / 2 ;
            p := textext.rt("$\left.\vrule height " & decimal n & "bp width 0pt depth 0pt\right\}$") ;
            draw p shifted (.5[lr,ur] + (EmWidth,0));
            label.rt("#4", .5[lr,ur] shifted (.75cm, 0)) ;
        endfor ;
    endgroup;
  \stopuseMPgraphic
  \definetextbackground[#2Frame]
    [mp=#2frame, location=paragraph]
  \definestartstop[#2discussion]
    [before={\starttextbackground[#2Frame]},
     after={\stoptextbackground[#2Frame]}]
}

\definebraceddiscussion[tex][TeX]
\definebraceddiscussion[markdown][Markdown]

\starttext

\starttexdiscussion

  \input knuth

  \input tufte

\stoptexdiscussion

\startmarkdowndiscussion

  \input ward

  \input zapf

\stopmarkdowndiscussion

\stoptext