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 }

[image of music]

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 erweitern v2.25.22 (development-branch).