Aller au contenu

ConTeXt/Macros avancées

Un livre de Wikilivres.

ConTeXt


 Page précédente : macros

Part. III, ch. 6  •  Macros avancées  •  Sommaire

Page suivante : styles typographiques 


Macros avancées

[modifier | modifier le wikicode]

Objectifs

  • Comprendre ce qu’apportent les macros « avancées » par rapport aux macros de base.
  • Savoir définir des commandes avec arguments optionnels et comportements paramétrables.
  • Utiliser les macros pour factoriser la mise en forme de textes complexes (polyglottes, TEI, apparat critique).
  • Entrevoir l’interaction entre macros ConTeXt et Lua pour automatiser certaines tâches.

Les pages précédentes ont présenté les macros comme un outil pratique pour éviter les répétitions dans le code. Lorsqu’on passe à des documents plus ambitieux (éditions savantes, textes polyglottes, mise en page complexe), les macros deviennent un véritable outil de conception : elles structurent la logique du document et séparent le contenu des détails techniques.

1. Rappels essentiels sur les macros

[modifier | modifier le wikicode]

Dans ConTeXt (comme en TeX), une « macro » est une commande définie par l’utilisateur qui remplace un motif de texte par un autre. On peut partir de définitions simples, comme le célèbre code bien connu :

\def\HelloWorld{Hello World!}
\def\Hello#1{Hello, #1 !}

ou utiliser les définitions de plus haut niveau proposées par ConTeXt, comme \define ou les nombreuses commandes de la famille \define... :

\define[1]\Emphase%
  {\bgroup\italic#1\egroup}

Ici, \Emphase{texte} applique l’italique à son argument dans un groupe local.

Note : dans ConTeXt, de nombreuses « macros » sont déjà fournies sous forme de commandes précédées de l'anti-slash "\", sous la forme \commande. Ainsi des commandes \define, (par exemple \definefontfamily, \definestartstop, etc.). La logique reste la même : définir une forme ou une structure une fois, puis la réutiliser partout.

2. Arguments optionnels et paramètres

[modifier | modifier le wikicode]

Lorsque les documents deviennent plus complexes, il est utile de pouvoir donner à une macro des arguments optionnels : style, taille, couleur, numéro, etc.

2.1. Arguments positionnels

[modifier | modifier le wikicode]

Exemple simple avec deux arguments positionnels :

\def\NomComplet#1#2{#2, #1}

% usage :
\NomComplet{Immanuel}{Kant} % produit : Kant, Immanuel

2.2. Pseudo-arguments optionnels par clés

[modifier | modifier le wikicode]

Une approche courante consiste à combiner une macro « principale » avec une commande de configuration, ou avec des paramètres passés sous forme de clés (via \setup... ou un module dédié). Exemple minimaliste :

\define[2]\Termine%
  {\bgroup
   \switchtobodyfont[#1]%
   \bf #2%
   \egroup}

% usage :
\Termine{small}{lex specialis}
\Termine{big}{lex generalis}

Ici, le « paramètre optionnel » est simulé par le premier argument (la taille de police). Dans d’autres cas, on s’appuiera plutôt sur des mécanismes de configuration (voir ci-dessous, sections sur les macros étendues).

3. Macros étendues : combiner style, structure et contenu

[modifier | modifier le wikicode]

Une macro « avancée » ne se limite pas à remplacer une séquence de caractères. Elle peut :

  • entourer du texte d’une mise en forme cohérente (cadre, couleur, indentation),
  • ajouter une structure logique (numérotation, titre, référence),
  • appeler d’autres commandes de configuration.

3.1. Exemple : encadré de méthode

[modifier | modifier le wikicode]

Ici, on définit une macro qui produit un encadré de « méthode » dans le style du Wikilivre :

\def\StartMethodBox%
  {\startframedtext
     [frame=off,
      background=color,
      backgroundcolor=methodcolor,
      leftframe=on,
      rulethickness=2pt,
      framecolor=darkblue,
      offset=0.8em,
      frameoffset=0.4em]}

\def\StopMethodBox{\stopframedtext}

Dans le corps du document, on utilisera ensuite :

\StartMethodBox
\bf Méthode :%
\par
Décrire ici les étapes de travail recommandées.
\StopMethodBox

Dans le Wikilivre, ce genre de macro est ensuite « traduit » en HTML/CSS via des \<div> stylés, comme les encadrés "Objectifs", "Méthode" ou "Avertissement".

3.2. Exemple : macro de « lemme » pour apparat critique

[modifier | modifier le wikicode]
\def\lemma#1#2%
  {\bgroup
   \switchtobodyfont[small]%
   \it #1\quad%
   \rm #2%
   \egroup}

Usage :

\lemma{arma}{accusatif pluriel de « arma »}
\lemma{virumque}{accusatif singulier coordonné}

Avec cette unique macro, il est garanti que tous les lemmes sont affichés avec la même typographie, quel que soit l’endroit du document où ils apparaissent.

4. Sécurité et robustesse des macros

[modifier | modifier le wikicode]

Quand les macros se multiplient, quelques précautions s’imposent.

Avertissement : des macros mal conçues peuvent créer des effets de bord difficiles à diagnostiquer (espaces inattendus, groupes non refermés, styles « fuyants » qui débordent sur les paragraphes suivants).

Points d’attention :

  • Encadrer les effets typographiques dans des groupes \bgroup ... \egroup.
  • Éviter de modifier globalement la configuration (police, couleur, interligne) dans une macro appelée très souvent.
  • Tester les macros sur un MWE (fichier minimal) avant de les déployer dans un grand document.
  • Documenter les arguments attendus (nombre, ordre, type).

Exemple de macro « sûre » pour mettre un passage en petites capitales sans perturber le reste :

\def\SmallCaps#1%
  {\bgroup
   \sc #1%
   \egroup}

5. Interaction entre macros et Lua (aperçu)

[modifier | modifier le wikicode]

ConTeXt permet d’appeler très facilement du code Lua depuis une macro. Cela permet, par exemple, de calculer un numéro, reformater une date, ou lire une structure XML/TEI.

Pourquoi appeler Lua depuis une macro ?

Lua sert de moteur de calcul et de logique. On l’appelle lorsque la tâche à accomplir dépasse le rôle naturel de TeX : effectuer une opération, analyser une donnée, filtrer, trier, convertir, recomposer.

  • Calculs complexes : statistiques, numérotation, tables dynamiques.
  • Données structurées : lecture de fichiers XML/TEI, CSV, JSON.
  • Manipulations textuelles : dates, formats, correspondances, conversions.
  • Automatisation : tris, index, listes conditionnelles, regroupements.

En pratique, TeX met en forme ; Lua calcule, analyse, organise. Le document gagne ainsi en cohérence, en vitesse, en intelligence — surtout dans les projets longs et structurés.

Exemple minimal : appeler Lua pour un calcul

% --- code Lua embarqué :
\startluacode
  function MyModule.double(n)
    return 2 * n
  end
\stopluacode

% --- macro ConTeXt qui appelle Lua :
\def\Double#1%
  {\ctxlua{context(MyModule.double(#1))}}

% --- dans le document :
Le double de 21 est \Double{21}.

Ici, la macro \Double délègue le calcul à Lua, puis réinjecte le résultat dans le flux typographique.

Structure simple, mais puissante : Lua effectue le calcul, puis renvoie un résultat que TeX intègre immédiatement dans le flux typographique. Ce principe s’étend naturellement aux données XML/TEI, aux index automatiques, aux tableaux dynamiques et à toutes les tâches répétitives.

6. Applications concrètes

[modifier | modifier le wikicode]

6.1. Apparats critiques et TEI

[modifier | modifier le wikicode]

Pour des éditions savantes inspirées d’un balisage TEI, on définit souvent des macros sémantiques correspondant aux éléments XML (<lem>, <rdg>, <note>, etc.). Exemple :

\def\Lem#1%
  {\bgroup
   \switchtobodyfont[small]%
   \bf #1%
   \egroup}

\def\Rdg#1%
  {\bgroup
   \switchtobodyfont[small]%
   \it #1%
   \egroup}

On pourra ensuite écrire dans le fichier maître :

\Lem{arma virumque} \Rdg{arma virumque cano}

ou bien laisser Lua produire automatiquement ces macros à partir d’un fichier XML-TEI.

6.2. Textes polyglottes : macros par langue

[modifier | modifier le wikicode]

Pour les textes polyglottes avancés, il est recommandé de :

  • définir une police (ou une famille de polices) par langue,
  • associer une macro claire à chaque système d’écriture,
  • et regrouper les réglages dans un environnement (env-polyglotte.tex).

Exemple simplifié :

\definefontfamily[main][serif][Latin Modern Roman]
\definefontfamily[arabic][serif][Amiri]
\definefontfamily[hindi][serif][Noto Sans Devanagari]

\def\ArabicFace#1%
  {\bgroup
   \language[ar]%
   \switchtobodyfont[arabic]%
   #1%
   \egroup}

\def\HindiFace#1%
  {\bgroup
   \language[hi]%
   \switchtobodyfont[hindi]%
   #1%
   \egroup}

Usage :

\ArabicFace{بِسْمِ ٱللَّهِ ٱلرَّحْمَـٰنِ ٱلرَّحِيمِ}
\HindiFace{धर्म क्षेत्रे कुरु क्षेत्रे}

Méthode : tester chaque macro de langue séparément (fichier d’une page, une seule langue, une seule police) avant de les combiner dans une mise en page parallélisée.

6.3. Mise en page avancée et styles typographiques

[modifier | modifier le wikicode]

Les macros peuvent aussi encapsuler des blocs de mise en page : exemples, définitions, mises en évidence, etc. Elles servent alors de passerelle naturelle vers les « styles typographiques » détaillés dans le chapitre suivant.

Exemple « boîte de définition » :

\def\StartDefinition
  {\blank[medium]
   \startframedtext
     [frame=off,
      background=color,
      backgroundcolor=definitioncolor,
      leftframe=on,
      framecolor=darkblue,
      offset=0.8em]}

\def\StopDefinition
  {\stopframedtext
   \blank[medium]}

6.4. Macros typographiques sémantiques

[modifier | modifier le wikicode]

Dernier exemple : des macros qui marquent le rôle sémantique d’un terme, plutôt que son simple style visuel :

\def\Auteur#1%
  {\bgroup\smallcaps{#1}\egroup}

\def\Oeuvre#1%
  {\bgroup\italic{#1}\egroup}

\def\TermeTech#1%
  {\bgroup\type{#1}\egroup}

Ce type de macros simplifie ensuite les changements de style (par exemple, décider que tous les noms d’auteurs seront en petite capitale bleue, etc.).

Dans cet exemple, les macros ne servent pas seulement à changer l’apparence d’un texte : elles servent à marquer la fonction du mot dans le document. Reprenons :

\def\Auteur#1%
  {\bgroup\smallcaps{#1}\egroup}

\def\Oeuvre#1%
  {\bgroup\italic{#1}\egroup}

\def\TermeTech#1%
  {\bgroup\type{#1}\egroup}

Ce qui se passe techniquement

[modifier | modifier le wikicode]

Chaque macro :

  • reçoit un argument (#1),
  • ouvre un groupe typographique (\bgroup),
  • applique un effet (petites capitales, italique, monospace),
  • affiche le contenu,
  • referme le groupe (\egroup).

Cela garantit que la mise en forme reste locale à la macro, sans déborder ailleurs.

Pourquoi marquer la fonction plutôt que l’apparence ?

[modifier | modifier le wikicode]

Parce que le code ne dit pas « mets ce mot en italique », mais : « ceci est un titre d’œuvre ».

On nomme donc la catégorie sémantique du mot, pas son style.

📌 Conséquence immédiate

[modifier | modifier le wikicode]

Si l’on souhaite modifier l’apparence d’une catégorie entière (par exemple, afficher tous les auteurs en bleu), il suffit de changer une seule ligne dans la macro.

Exemple :

\def\Auteur#1%
  {\bgroup\color[blue]\sc #1\egroup}

Tout le document se met à jour automatiquement, sans modifier le texte.

Ces macros :

  • ajoutent un niveau sémantique au texte,
  • rendent le code source plus clair,
  • évitent les répétitions typographiques inutiles,
  • garantissent une cohérence graphique,
  • facilitent les évolutions stylistiques.

C’est un principe fondamental dans ConTeXt : le style appartient à la macro, pas au texte.

À retenir

  • Une macro doit avoir un nom clair et stable (éviter les sigles obscurs).
  • Une macro doit faire une seule chose, mais la faire bien.
  • Les effets typographiques doivent être encapsulés dans des groupes.
  • Les macros techniques (polices, langues, couleurs) appartiennent à un fichier d’environnement, pas au fichier principal.
  • Les macros sémantiques (auteur, œuvre, terme technique) séparent le sens du style : le texte gagne en cohérence et devient beaucoup plus simple à maintenir.


7. Bonnes pratiques pour concevoir ses macros

[modifier | modifier le wikicode]

Quelques conseils pratiques :

  • commencer petit (une macro par besoin précis), plutôt que tout abstraire d’un coup ;
  • regrouper les définitions dans un fichier dédié (par exemple env-macros.tex) ;
  • commenter les macros « non évidentes » ;
  • garder des MWE à portée de main pour tester rapidement les changements.

8. Pour aller plus loin

[modifier | modifier le wikicode]

Cette page ne donne qu’un aperçu des possibilités offertes par les macros avancées. Pour approfondir :

  • consulter la documentation officielle de ConTeXt sur les commandes \define... et les environnements ;
  • explorer les exemples fournis avec ConTeXt (fichiers *.tex dans texmf-context) ;
  • lire les échanges de la liste de diffusion, où de nombreux exemples de macros spécialisées (polyglottes, TEI, mathématiques) sont discutés en détail.

Méthode : pour les projets importants (édition critique, textes polyglottes, manuels), il est recommandé de faire évoluer un petit « noyau » de macros au fil du projet, plutôt que de réinventer des solutions au cas par cas dans chaque nouveau document.

Macros et outils Lua

[modifier | modifier le wikicode]

Pourquoi Lua dans ConTeXt ?

Lua sert de moteur logique intégré à ConTeXt. TeX compose : il met en page, met en forme, structure le texte. Lua complète ce rôle en gérant le calcul, l’analyse, les données et l’automatisation.

  • Calculs et logique : numéros, tests, tris, conversions.
  • Données externes : TEI, JSON, CSV, XML.
  • Automatisation : index, tableaux, listes dynamiques.

On ne choisit pas Lua pour « styler » du texte : TeX le fait mieux. On l’appelle quand il faut comprendre, transformer ou organiser une information. C’est pourquoi Lua est intégré au cœur de ConTeXt. Vous pouvez aller à la partie V, ch. 13, lire la page "Outils Lua", pour en savoir plus.


 Page précédente : macros

Part. III, ch. 6  •  Macros avancées  •  Sommaire

Page suivante : styles typographiques