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.
![[image of music]](../a8/lily-af8467fa.png)
![[image of music]](../b2/lily-ba237c2c.png)
![[image of music]](../5a/lily-9af01667.png)
![[image of music]](../3e/lily-27fb5135.png)