Un ejemplo completo

El ejemplo siguiente define una instrucción de marcado para trazar un rectángulo doble alrededor de un fragmento de texto.

En primer lugar, necesitamos construir un resultado aproximado utilizando marcados. Una consulta a Instrucciones de marcado de texto nos muestra que es útil la instrucción \box:

\markup \box \box HELLO

[image of music]

Ahora, consideramos que es preferible tener más separación entre el texto y los rectángulos. Según la documentación de \box, esta instrucción usa una propiedad box-padding, cuyo valor predeterminado es 0.2. La documentación también menciona cómo sobreescribir este valor:

\markup \box \override #'(box-padding . 0.6) \box A

[image of music]

Después, el relleno o separación entre los dos rectángulos nos parece muy pequeño, así que lo vamos a sobreescribir también:

\markup \override #'(box-padding . 0.4) \box
     \override #'(box-padding . 0.6) \box A

[image of music]

Repetir esta extensa instrucción de marcado una y otra vez sería un quebradero de cabeza. Aquí es donde se necesita una instrucción de marcado. Así pues, escribimos una instrucción de marcado double-box, que toma un argumento (el texto). Dibuja los dos rectángulos y añade una separación.

#(define-markup-command (double-box layout props text) (markup?)
  "Trazar un rectángulo doble rodeando el texto."
  (interpret-markup layout props
    #{\markup \override #'(box-padding . 0.4) \box
            \override #'(box-padding . 0.6) \box { #text }#}))

o, de forma equivalente,

#(define-markup-command (double-box layout props text) (markup?)
  "Trazar un rectángulo doble rodeando el texto."
  (interpret-markup layout props
    (markup #:override '(box-padding . 0.4) #:box
            #:override '(box-padding . 0.6) #:box text)))

text es el nombre del argumento de la instrucción, y markup? es el tipo: lo identifica como un elemento de marcado. La función interpret-markup se usa en casi todas las instrucciones de marcado: construye un sello, usando layout, props, y un elemento de marcado. En el segundo caso, la marca se construye usando el macro de Scheme markup, véase Construcción de elementos de marcado en Scheme. La transformación de una expresión \markup en una expresión de marcado de Scheme es directa.

La instrucción nueva se puede usar como sigue:

\markup \double-box A

Sería bueno hacer que la instrucción double-box fuera personalizable: aquí, los valores de relleno box-padding son fijos, y no se pueden cambiar por parte del usuario. Además, sería mejor distinguir la separación entre los dos rectángulos, del relleno entre el rectángulo interno y el texto. Así pues, introducimos una nueva propiedad, inter-box-padding, para el relleno entre los rectángulos. El box-padding se usará para el relleno interno. Ahora el código nuevo es como se ve a continuación:

#(define-markup-command (double-box layout props text) (markup?)
  #:properties ((inter-box-padding 0.4)
                (box-padding 0.6))
  "Trazar un rectángulo doble rodeando el texto."
  (interpret-markup layout props
    #{\markup \override #`(box-padding . ,inter-box-padding) \box
               \override #`(box-padding . ,box-padding) \box
               { #text } #}))

De nuevo, la versión equivalente que utiliza la macro de marcado sería:

#(define-markup-command (double-box layout props text) (markup?)
  #:properties ((inter-box-padding 0.4)
                (box-padding 0.6))
  "Trazar un rectángulo doble rodeando el texto."
  (interpret-markup layout props
    (markup #:override `(box-padding . ,inter-box-padding) #:box
            #:override `(box-padding . ,box-padding) #:box text)))

Aquí, la palabra clave #:properties se usa de manera que las propiedades inter-box-padding y box-padding se leen a partir del argumento props, y se les proporcionan unos valores predeterminados si las propiedades no están definidas.

Después estos valores se usan para sobreescribir las propiedades box-padding usadas por las dos instrucciones \box. Observe el apóstrofo invertido y la coma en el argumento de \override: nos permiten introducir un valor de variable dentro de una expresión literal.

Ahora, la instrucción se puede usar dentro de un elemento de marcado, y el relleno de los rectángulos se puede personalizar:

#(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]


Extender LilyPond v2.25.22 (development-branch).