Hi Hans !
Many thanks for your help and for the example you shared on the
list. The method of placing the XML directly in a
|\startbuffer...\stopbuffer| and then processing it with
|\xmlprocessbuffer| had completely escaped me—it's a simple trick, but
extremely robust and educational, especially for producing standalone
MWEs. Using your skeleton as a basis, I was able to set up a working
example (XML-TEI poem, original/translation in columns, line-by-line
comments in the form of placeable notes), without any collisions with
tables or footnote stacking. I am pasting the complete source file
|.tex| below, which compiles as is; I will also integrate it as an MWE
in ConTeXt Garden and in a French ConTeXt Wikibook I am working on,
explicitly mentioning your approach.
Thank you again for this elegant and “ConTeXt-proof” solution !
Best regards,
JP
The MWE (1 PDF page) :
\setuppapersize[A4]
\setupbodyfont[Noto Serif,10pt] % Latin Modern (défaut), 10pt % choose a
font
\setupTABLE[frame=off]
\setupTABLE[column][1][width=.1\textwidth]
\setupTABLE[column][2][width=.450\textwidth]
\setupTABLE[column][3][width=.45\textwidth]
% ----------------------------------------------------------
% Pied de page
% ----------------------------------------------------------
\setupfootertexts
[]
[{\tfxx Document composé avec \ConTeXt}]
% ----------------------------------------------------------
% Notes "plaçables" (robustes avec les tableaux)
% ----------------------------------------------------------
\definenote[commnote]
\setupnote[commnote][
rule=off,
paragraph=yes,
inbetween=\quad,
style=\tfxx,
]
% ----------------------------------------------------------
% XML dans un buffer (méthode Hans) — 16 vers + commentaire
% ----------------------------------------------------------
\startbuffer[poem]
<?xml version="1.0" encoding="UTF-8"?>
<TEI>
<text>
<body>
<lg type="stanza">
<lg type="orig">
<l>First light touches the closed houses,</l>
<l>and the street breathes a pale memory.</l>
<l>I hear the fountain count its coins,</l>
<l>while sparrows edit yesterday’s crumbs.</l>
<l>The baker lifts a shutter like a veil,</l>
<l>and flour rises, a brief white weather.</l>
<l>At the corner, a newspaper opens,</l>
<l>its headlines folded like tired wings.</l>
<l>I write your name, then cross it out,</l>
<l>the paper keeps the pressure, not the meaning.</l>
<l>Between two words a well appears,</l>
<l>and echoes practice someone else’s voice.</l>
<l>A tram arrives; its doors hesitate,</l>
<l>as if choosing which century to enter.</l>
<l>In my pocket, a key warms slowly,</l>
<l>metal remembering the shape of home.</l>
</lg>
<lg type="trans">
<l>La première lumière effleure les maisons closes,</l>
<l>et la rue respire une mémoire pâle.</l>
<l>J’entends la fontaine compter ses pièces,</l>
<l>tandis que les moineaux corrigent les miettes d’hier.</l>
<l>Le boulanger relève un volet comme un voile,</l>
<l>et la farine monte, brève météo blanche.</l>
<l>Au coin, un journal s’ouvre,</l>
<l>ses gros titres pliés comme des ailes lassées.</l>
<l>J’écris ton nom, puis je le rature,</l>
<l>le papier garde la pression, pas le sens.</l>
<l>Entre deux mots, un puits apparaît,</l>
<l>et les échos répètent la voix d’un autre.</l>
<l>Un tram arrive ; ses portes hésitent,</l>
<l>comme si elles choisissaient le siècle où entrer.</l>
<l>Dans ma poche, une clé se réchauffe lentement,</l>
<l>le métal se souvient de la forme du foyer.</l>
</lg>
<lg type="comm">
<l>light] atmospheric motif; establishes the scene.</l>
<l>memory] semantic key recurring across the poem.</l>
<l>fountain] auditory image; introduces counting/metre.</l>
<l>edit] meta-textual verb; aligns with “variants” later.</l>
<l>shutter/veil] unveiling metaphor; morning as revelation.</l>
<l>white weather] synesthetic image; flour as climate.</l>
<l>newspaper] public voice entering the private walk.</l>
<l>headlines] folded wings; fatigue of news cycles.</l>
<l>name] inscription + erasure; motif of revision.</l>
<l>pressure/meaning] material trace vs semantic loss.</l>
<l>well] gap between words; abyss of interpretation.</l>
<l>someone else] polyphony; speaker displaced.</l>
<l>tram] modern intrusion; tests punctuation in table.</l>
<l>century] controlled anachronism; time as choice.</l>
<l>key] pocket object; memory by touch/heat.</l>
<l>home] “shape” as form; stable equivalence in translation.</l>
</lg>
</lg>
</body>
</text>
</TEI>
\stopbuffer
% ----------------------------------------------------------
% Setups XML (structure Hans)
% ----------------------------------------------------------
\startxmlsetups xml:main
\xmlsetsetup{#1}{*}{xml:*}
\stopxmlsetups
\xmlregistersetup{xml:main}
\startxmlsetups xml:TEI
\xmlcommand{#1}{text/body/lg[@type='stanza']}{xml:stanza}
\stopxmlsetups
\startxmlsetups xml:original
\language[english]
\xmltext{#1}
\stopxmlsetups
\startxmlsetups xml:translation
\language[french]
\xmltext{#1}
\stopxmlsetups
% commentaire -> note "plaçable"
\startxmlsetups xml:comment
\commnote{\xmltext{#1}}
\stopxmlsetups
\startxmlsetups xml:stanza
\bTABLE
\bTR
\bTH line \eTH
\bTH original \eTH
\bTH translation \eTH
\eTR
\dorecurse{\xmlcount{#1}{./lg[@type='orig']/l}}{%
\bTR
\bTD ##1 \eTD
\bTD
\xmlcommand{#1}{./lg[@type='orig']/l[##1]}{xml:original}
\xmlcommand{#1}{./lg[@type='comm']/l[##1]}{xml:comment}
\eTD
\bTD
\xmlcommand{#1}{./lg[@type='trans']/l[##1]}{xml:translation}
\eTD
\eTR
}
\eTABLE
\stopxmlsetups
\starttext
\centerline{\bfb Poème TEI-XML : original, traduction, notes “plaçables”}
\blank[big]
{\em
Objectif : montrer une méthode robuste (inspirée de Hans Hagen) pour
afficher un poème encodé en XML-TEI
en trois colonnes (n° du vers, original, traduction) tout en attachant
un commentaire ligne à ligne sous forme de notes,
placées à un endroit choisi (ici : après le tableau), afin d’éviter les
collisions “tableau + footnotes”. On remarquera les commentaires en
anglais placés dans la cellule concernant le texte original.}
\blank[medium]
\centerline{\sc — Procédure (résumé technique) —}
\starttyping
1) XML intégré dans un buffer (\startbuffer...\stopbuffer)
2) Boucle sur le nombre de vers : \dorecurse{\xmlcount{#1}, etc.
3) Extraction des lignes via XPath : orig/l[i], trans/l[i], comm/l[i]
4) Commentaires collectés avec \commnote{\xmltext{#1}}, puis rendus par
\placenotes[commnote]
\stoptyping
\blank[big]
\xmlprocessbuffer{main}{poem}{}
\blank[big]
% Notes en deux colonnes pour limiter les débordements
\startcolumns[n=2,balance=yes]
\placenotes[commnote]
\stopcolumns
\stoptext
Le 12/12/2025 à 10:01, Hans Hagen via ntg-context a écrit :
On 12/11/2025 9:01 PM, Jean-Pierre Delange via ntg-context wrote:
\startxmlsetups xml:comm
\xmlfilter{#1}{./l}{\footnote{\xmltext{##1}}}
\stopxmlsetups
you have a double # here
I attached a solution.
Hans
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the
Wiki!
maillist :[email protected]
/https://mailman.ntg.nl/mailman3/lists/ntg-context.ntg.nl
webpage :https://www.pragma-ade.nl /https://context.aanhet.net (mirror)
archive :https://github.com/contextgarden/context
wiki :https://wiki.contextgarden.net
___________________________________________________________________________________
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the
Wiki!
maillist : [email protected] /
https://mailman.ntg.nl/mailman3/lists/ntg-context.ntg.nl
webpage : https://www.pragma-ade.nl / https://context.aanhet.net (mirror)
archive : https://github.com/contextgarden/context
wiki : https://wiki.contextgarden.net
___________________________________________________________________________________