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
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
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
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