Convertir elementos de marcado en cadenas
Los elementos de marcado se convierten a veces en cadenas normales
por ejemplo cuando se producen metadatos de PDF basados en el
campo title
del encabezamiento o para convertir la letra de
las canciones a MIDI. Esta conversión conlleva inherentemente
pérdidas, pero intenta hacerlo de la forma más fiel que sea
posible. La función que se usa para ello es
markup->string
.
composerName = \markup \box "Arnold Schönberg" \markup \composerName \markup \typewriter #(markup->string composerName)![]()
Cuando se trata de instrucciones de marcado personalizadas, el comportamiento por omisión es convertir en primer lugar todos los argumentos de marcados, o de listas de marcados, y concatenar los resultados con espacios.
#(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
también puede recibir los argumentos con
nombre #:layout layout
y #:props props
,
con el mismo significado que en la definición de una instrucción
de marcado. Sin embargo, son opcionales porque no siempre pueden
aportarse (como el argumento layout
durante la conversión a
MIDI).
Para contemplar las conversiones especiales dentro de
instrucciones de marcado personalizadas, se puede dar el parámetro
#:as-string
a define-markup-command
. Espera como
argumento una expresión, que se evalúa por parte de
markup->string
para dar el resultado en forma de cadena.
#(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)![]()
Dentro de la expresión, están disponibles las mismas relaciones de
enlace que en el cuerpo de la instrucción de marcado principal,
concretamente layout
y props
, el argumento de la
instrucción, y opcionalmente las propiedades.
#(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)![]()
Lo más frecuente es que una rutina procesadora solamente necesite
llamar recursivamente a markup->string
sobre ciertos
argumentos, como se ha mostrado arriba. Sin embargo, también
puede hacer uso directamente de layout
y de props
,
de la misma manera que en el cuerpo principal. Hay que tener
cuidado de que el argumento layout
sea #f
si no se
le ha dado ningún #:layout
a la función
markup->string
. El argumento props
es, por omisión,
una lista vacía.