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)
[image of music]

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)
[image of music]

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)
[image of music]

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)
[image of music]

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.


Extender LilyPond v2.25.29 (development-branch).