LilyPond erweitern: 2.7 Callback-Funktionen

## 2.7 Callback-Funktionen

Eigenschaften (wie Dicke (`thickness`), Richtung (`direction`) usw.) können mit `\override` auf feste Werte gesetzt werden, etwa:

>     \override Stem.thickness = #2.0

Eigenschaften können auch auf eine Scheme-Prozedur gesetzt werden:

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

In diesem Fall wird die Prozedur ausgeführt, sobald der Wert der Eigenschaft während das Formatierungsprozesses angefordert wird.

Der größte Teil der Satzmaschinierie funktioniert mit derartigen Callbacks. Eigenschaften, die üblicherweise Callbacks benutzen, sind u. A.:

`stencil`

  Die Druckfunktion, die eine Ausgabe des Symbols hervorruft

`X-offset`

  Die Funktion, die die horizontale Position setzt

`X-extent`

  Die Funktion, die die Breite eines Objekts errechnet

Die Funktionen brauchen immer ein einziges Argument, das der Grob ist.

Wenn Funktionen mit mehreren Argumenten aufgerufen werden müssen, kann der aktuelle Grob mit einer Grob-Einschließung eingefügt werden. Hier eine Einstellung aus `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)))))

In diesem Beispiel werden sowohl `ly:self-alignment-interface::x-aligned-on-self` als auch `ly:self-alignment-interface::centered-on-x-parent` mit dem Grob als Argument aufgerufen. Die Resultate werden mit der `+`-Funktion addiert. Um sicherzugehen, dass die Addition richtig ausgeführt wird, wird das ganze Konstrukt in `ly:make-simple-closure` eingeschlossen.

In der Tat ist die Benutzung einer einzelnen Funktion als Eigenschaftswert äquivalent zu

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

Das innere `ly:make-simple-closure` stellt den Grob als Argument für proc zur Verfügung, das äußere stellt sicher, dass das Resultat der Funktion ausgegeben wird und nicht das `simple-closure`-Objekt.

Aus dem Callback heraus kann man eine Beschriftung am einfachsten mit `grob-interpret-markup` auswerten. Beispielsweise:

>     mein-callback = #(lambda (grob)
>                      (grob-interpret-markup grob (markup "foo")))

#### LilyPond – Extending v2.24.4 (stabiler Zweig).