Syntaxe d’une commande markup
Une commande de markup personnalisée se définit à l’aide de la
macro Scheme define-markup-command
, placée en tête de fichier.
(define-markup-command (nom-commande layout props arg1 arg2…) (arg1-type? arg2-type?…) [ #:properties ((propriété1 valeur-par-défaut1) …) ] [ #:as-string expression ] …corps de la commande…)
Quelques commentaires sur les arguments :
nom-commande
le nom que vous attribuez à votre commande de markup.
layout
la définition du « layout » – son formatage.
props
une liste de listes associatives, comprenant toutes les propriétés actives.
argi
le ième argument de la commande.
argi-type?
un type de prédicat pour le ième argument.
Si la commande utilise des propriétés à partir des arguments
props
, le mot-clé #:properties
permet de spécifier ces
différentes propriétés ainsi que leur valeur par défaut.
Les arguments se distinguent selon leur type :
- un markup, correspondant au type de prédicat
markup?
; - une liste de markups, correspondant au type de prédicat
markup-list?
; - tout autre objet Scheme, correspondant au types de prédicat tels
que
list?
,number?
,boolean?
, etc.
Il n’existe aucune restriction quant à l’ordre des arguments fournis à
la suite des arguments layout
et props
. Néanmoins, les
fonctions markup qui ont en dernier argument un markup ont
ceci de particulier qu’elles peuvent s’appliquer à des listes de
markups ; ceci résultera en une liste de markups où tous
les éléments de la liste originelle se verront appliquer cette fonction
markup avec ses arguments de tête.
La réplication des arguments de tête dans le but d’appliquer une fonction markup à une liste de markups est économique, principalement lorsqu’il s’agit d’arguments Scheme. Vous éviterez ainsi d’éventuelles pertes de performance en utilisant des arguments Scheme en tant qu’arguments principaux d’une fonction markup dont le dernier argument est un markup.
Les commandes de markup ont un cycle de vie relativement
complexe. Le corps de la définition d’une commande de markup est
chargé de convertir les arguments de la commande en expression stencil
qui sera alors renvoyée. Bien souvent, ceci s’accomplit par un appel à
la fonction interpret-markup
, en lui passant les arguments
layout et props. Ces arguments ne seront en principe connus
que bien plus tardivement dans le processus typographique. Lors de
l’expansion d’une expression LilyPond \markup
ou d’une macro
Scheme markup
, les expressions markup auront déjà vu leurs
composants assemblés en expressions markup. L’évaluation et le
contrôle du type des arguments à une commande de markup
n’interviennent qu’au moment de l’interprétation de \markup
ou
markup
.
Seule l’application de interpret-markup
sur une expression
markup réalisera effectivement la conversion des expressions
markup en stencil, au travers de l’exécution du corps des
fonctions markup.