Conversion de markups en chaînes
Les markups sont parfois convertis en chaînes littérales, ce qui
est le cas pour générer une métadonnée PDF basée sur le champ d’entête
title
ou pour convertir des paroles en MIDI. Cette conversion
n’est pas parfaite, mais elle est aussi fidèle que possible. La fonction
dévolue à cette opération est markup->string
.
composerName = \markup \box "Arnold Schönberg" \markup \composerName \markup \typewriter #(markup->string composerName)
Dans le cas de commandes de markup personnalisées, le comportement par défaut consiste à convertir dans un premier temps tous les markups ou les arguments de la liste de markups, puis à joindre les résultats par des espaces.
#(define-markup-command (authors-and layout props authorA authorB) (markup? markup?) (interpret-markup layout props #{ \markup \fill-line { \box #authorA and \box #authorB } #})) defaultBehavior = \markup \authors-and "Bertolt Brecht" "Kurt Weill" \markup \defaultBehavior \markup \typewriter #(markup->string defaultBehavior)
markup->string
peut aussi recevoir les argument nommés
#:layout layout
et #:props props
, avec la même
signification que lorsqu’ils apparaissent dans la définition d’une
commande de markup. Ils sont toutefois optionnels dans la mesure
où ils peuvent ne pas toujours être pourvus – cas typique de l’argument
layout
pour convertir en MIDI.
Afin de définir une conversion différente du comportement par défaut
dans une commande pour markup personnalisée, on peut fournir le
paramètre #:as-string
à define-markup-command
. Il attend
une expression, évaluée par markup->string
, afin de produire la
chaîne.
#(define-markup-command (authors-and layout props authorA authorB) (markup? markup?) #:as-string (format #f "~a and ~a" (markup->string authorA #:layout layout #:props props) (markup->string authorB #:layout layout #:props props)) (interpret-markup layout props #{ \markup \fill-line { \box #authorA and \box #authorB } #})) customized = \markup \authors-and "Bertolt Brecht" "Kurt Weill" \markup \customized \markup \typewriter #(markup->string customized)
Au sein de l’expression sont disponibles les mêmes variables que dans le
corps de la commande de markup, à savoir les argument de la
commande, ainsi que layout
et props
, et les éventuelles
propriétés.
#(define-markup-command (authors-and layout props authorA authorB) (markup? markup?) #:properties ((author-separator " and ")) #:as-string (format #f "~a~a~a" (markup->string authorA #:layout layout #:props props) (markup->string author-separator #:layout layout #:props props) (markup->string authorB #:layout layout #:props props)) (interpret-markup layout props #{ \markup { \box #authorA #author-separator \box #authorB } #})) customized = \markup \override #'(author-separator . ", ") \authors-and "Bertolt Brecht" "Kurt Weill" \markup \customized \markup \typewriter #(markup->string customized)
La plupart du temps, il suffira au gestionnaire personnalisé d’un appel
récursif à markup->string
sur certains arguments, comme illustré
ci-dessus. Néanmoins, on peut toujours recourir directement à
layout
et props
comme si l’on était dans le corps
principal. Une attention particulière doit être portée au fait que, dès
lors que #:layout
n’est pas passé à markup->string
,
l’argument layout
égale #f
. L’argument props
est
par défaut une liste vide.