Come posso contrassegnare ed etichettare determinate regioni a margine con ConTeXt?

Aug 17 2020

Scrivo un documento che discute le differenze sintattiche tra due linguaggi (diciamo, TeX e Markdown). Passando attraverso vari argomenti, il testo parla un po 'di tempo di una lingua e poi dell'altra lingua.

Quello che voglio fare è mettere dei segni a margine per mostrare quali regioni discutono di TeX e quali discutono di Markdown. Per esempio:

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

And the text starting here \
                           | Markdown
discusses Markdown         /

Dato che ho alcune coppie di regioni come questa, vorrei generarle con l'ambiente, in questo modo:

\starttexdiscussion
Here are some paragraphs discussing features

of TeX.
\stoptexdiscussion

\startmarkdowndiscussion
And the text starting here

discusses Markdown
\stopmarkdowndiscussion

È possibile definire ambienti che lo facciano per me? Come dovrei regolare la posizione e la lunghezza del contenuto del margine per abbinare il contenuto principale? Come posso gestire le interruzioni di pagina?

Risposte

1 flyx Aug 19 2020 at 12:27

Ecco una soluzione basata sui commenti di Henri Menke che fa esattamente ciò che viene descritto, inclusa la divisione delle parentesi graffe quando si incontrano interruzioni di pagina.

\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