Extender LilyPond: B.4 Funciones de callback

## B.4 Funciones de callback

Las propiedades (como `thickness` (grosor), `direction` (dirección), etc.) se pueden establecer a valores fijos con \override, p. ej.:

>     \override Stem #'thickness = #2.0

Las propiedades pueden fijarse también a un procedimiento de scheme,

>     \override Stem #'thickness = #(lambda (grob)
>         (if (= UP (ly:grob-property grob 'direction))
>             2.0
>             7.0))
>     c b a g b a g b

En este caso, el procedimiento se ejecuta tan pronto como el valor de la propiedad se reclama durante el proceso de formateo.

Casi todo el motor de tipografiado está manejado por estos callbacks. Entre las propiedades que usan normalmente callbacks están

`stencil`

  La rutina de impresión, que construye un dibujo para el símbolo

`X-offset`

  La rutina que establece la posición horizontal

`X-extent`

  La rutina que calcula la anchura de un objeto

El procedimiento siempre toma un argumento único, que es el grob (el objeto gráfico).

Si se deben llamar rutinas con varios argumentos, el grob actual se puede insertar con una cerradura de grob. He aquí un ajuste procedente de `AccidentalSuggestion`,

>     `(X-offset .
>       ,(ly:make-simple-closure
>         `(,+
>             ,(ly:make-simple-closure
>                (list ly:self-alignment-interface::centered-on-x-parent))
>           ,(ly:make-simple-closure
>                (list ly:self-alignment-interface::x-aligned-on-self)))))

En este ejemplo, tanto `ly:self-alignment-interface::x-aligned-on-self` como `ly:self-alignment-interface::centered-on-x-parent` se llaman con el grob como argumento. El resultado se añade con la función `+`. Para asegurar que esta adición se ejecuta adecuadamente, todo ello se encierra dentro de `ly:make-simple-closure`.

De hecho, usar un solo procedimiento como valor de una propiedad equivale a

>     (ly:make-simple-closure (ly:make-simple-closure (list proc)))

El `ly:make-simple-closure` interior aporta el grob como argumento de proc, el exterior asegura que el resultado de la función es lo que se devuelve, en lugar del objeto `simple-closure`.

Desde dentro de un callback, el método más fácil para evaluar un elemento de marcado es usar grob-interpret-markup. Por ejemplo:

>     mi-callback = #(lambda (grob)
>                      (grob-interpret-markup grob (markup "fulanito")))

Otros idiomas: English, deutsch.

#### LilyPond — Extender