Exemple commenté
Nous allons, dans cet exemple, nous attacher à encadrer du texte avec un double liseré.
Commençons par construire quelque chose d’approximatif à l’aide d’un
simple markup. La lecture de Commandes pour markup nous indique la commande \box,
qui semble ici appropriée.
\markup \box \box HELLO
Dans un souci d’esthétique, nous aimerions que le texte et les
encadrements ne soient pas autant accolés. Selon la documentation de
\box, cette commande utilise la propriété box-padding,
fixée par défaut à 0,2. Cette même documentation nous indique aussi
comment la modifier :
\markup \box \override #'(box-padding . 0.6) \box A
L’espacement des deux liserés est cependant toujours trop réduit ; modifions le à son tour :
\markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A
Vous conviendrez que recopier une telle définition de markup
deviendra vite fastidieux. C’est pourquoi nous écrivons la commande de
markup double-box qui prendra un seul argument – le
texte. Cette commande se chargera de dessiner les encadrements, en
tenant compte des espacements.
#(define-markup-command (double-box layout props text) (markup?)
"Dessine un double encadrement autour du texte."
(interpret-markup layout props
#{\markup \override #'(box-padding . 0.4) \box
\override #'(box-padding . 0.6) \box { #text }#}))
ou bien son équivalent
#(define-markup-command (double-box layout props text) (markup?)
"Dessine un double encadrement autour du texte."
(interpret-markup layout props
(markup #:override '(box-padding . 0.4) #:box
#:override '(box-padding . 0.6) #:box text)))
text est le nom de l’argument de notre commande, et
markup? son type – l’argument sera identifié comme étant un
markup. La fonction interpret-markup, utilisée dans la
plupart des commandes de markup, construira un stencil à partir
de layout, props et un markup. Dans la seconde
variante, ce markup sera construit à l’aide de la macro Scheme
markup – voir Construction d’un markup en Scheme. La
transformation d’une expression \markup en expression Scheme est
des plus triviales.
Notre commande personnalisée s’utilise ainsi :
\markup \double-box A
Il serait intéressant de rendre cette commande double-box plus
souple : les valeurs de box-padding sont figées et ne peuvent
être modifiées à l’envie. Pareillement, il serait bien de distinguer
l’espacement entre les encadrements de l’espacement entre le texte et
ses encadrements. Nous allons donc introduire une propriété
supplémentaire, que nous appellerons inter-box-padding, chargée
de gérer l’espacement des encadrements ; box-padding ne servira
alors que pour l’espacement intérieur. Voici le code adapté à ces
évolutions :
#(define-markup-command (double-box layout props text) (markup?)
#:properties ((inter-box-padding 0.4)
(box-padding 0.6))
"Dessine un double encadrement autour du texte."
(interpret-markup layout props
#{\markup \override #`(box-padding . ,inter-box-padding) \box
\override #`(box-padding . ,box-padding) \box
{ #text } #}))
Ainsi que son équivalent à partir de la macro markup :
#(define-markup-command (double-box layout props text) (markup?)
#:properties ((inter-box-padding 0.4)
(box-padding 0.6))
"Dessine un double encadrement autour du texte."
(interpret-markup layout props
(markup #:override `(box-padding . ,inter-box-padding) #:box
#:override `(box-padding . ,box-padding) #:box text)))
C’est ici le mot-clé #:properties qui permet de lire les
propriétés inter-box-padding et box-padding à partir de
l’argumenet props ; on leur a d’ailleurs fourni des valeurs par
défaut au cas où elles ne seraient pas définies.
Ces valeurs permettront alors d’adapter les propriétés de
box-padding utilisées par les deux commandes \box. Vous
aurez remarqué, dans l’argument \override, la présence de
l’apostrophe inversée (`) et de la virgule ; elles vous
permettent d’insérer une valeur variable au sein d’une expression
littérale.
Notre commande est maintenant prête à servir dans un markup, et les encadrements sont repositionnables.
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Draw a double box around text." (interpret-markup layout props #{\markup \override #`(box-padding . ,inter-box-padding) \box \override #`(box-padding . ,box-padding) \box { #text } #})) \markup \double-box A \markup \override #'(inter-box-padding . 0.8) \double-box A \markup \override #'(box-padding . 1.0) \double-box A
![[image of music]](../e6/lily-0ee6813b.png)
![[image of music]](../6b/lily-94d7eb9c.png)
![[image of music]](../52/lily-08722dff.png)
![[image of music]](../9b/lily-f0123368.png)