5.3.6 Alisten verändern

Einige vom Benutzer einstellbare Eigenschaften sind intern als alists (Assoziative Listen) dargestellt, die Paare von Schlüsseln und Werten speichern. Die Struktur einer Aliste ist:

'((Schlüssel1 . Wert1)
  (Schlüssel2 . Wert2)
  (Schlüssel3 . Wert3)
  …)

Wenn eine Aliste eine Grob-Eigenschaft oder eine Variable der \paper-Umgebung ist, können ihre Schlüssel einzeln verändert werden, ohne andere Schlüssel zu beeinflussen.

Um beispielsweise den Freiraum zwischen benachbarten Systemen in einer Systemgruppe zu verkleinern, kann man die staff-staff-spacing-Eigenschaft des +StaffGrouper-Grobs benutzen. Die Eigenschaft ist eine Aliste mit vier Schlüsseln: : basic-distance (Grund-Abstand), minimum-distance (minimaler Abstand), padding (Verschiebung) und stretchability (Dehnbarkeit). Die Standardwerte dieser Eigenschaft finden sich im Abschnitt „Backend“ der Referenz der Interna (siehe StaffGrouper):

'((basic-distance . 9)
  (minimum-distance . 7)
  (padding . 1)
  (stretchability . 5))

Eine Möglichkeit, die Systemen dichter zueinander zu zwingen, ist es, der Wert des basic-distance-Schlüssels (9) zu verändern, sodass der den gleichen Wert wie minimum-distance (7) hat. Um einen einzelnen Schlüssel zu verändern, wird ein geschachtelter Aufruf benutzt:

% default space between staves
\new PianoStaff <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

% reduced space between staves
\new PianoStaff \with {
  % this is the nested declaration
  \override StaffGrouper.staff-staff-spacing.basic-distance = #7
} <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

[image of music]

Wenn man diese Art des geschachtelten Aufrufs einsetzt, wird der spezifische Schlüssel (basic-distance im obigen Beispiel) verändert, ohne dass sich andere Wert für die gleiche Eigenschaft ändern würden.

Nun sollen die Systeme so dicht wie möglich gesetzt werden, ohne das Überlappungen vorkommen. Die einfachste Möglichkeit, das zu tun, wäre es, alle vier Wert auf 0 zu setzen. Man muss jedoch nicht vier Werte definieren, sondern die Eigenschaft kann mit einem Aufruf als Aliste vollständig verändert werden:

\new PianoStaff \with {
  \override StaffGrouper.staff-staff-spacing =
    #'((basic-distance . 0)
       (minimum-distance . 0)
       (padding . 0)
       (stretchability . 0))
} <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

[image of music]

Dabei sollte beachtet werden, dass alle Schlüssel, die bei dieser Weise des Aufrufs nicht explizit aufgelistet sind, auf den Standardwert gesetzt werden, den sie hätten, wenn sie nicht definiert werden. Im Falle von staff-staff-spacing würden alle nicht genannten Schlüsselwerte auf 0 gesetzt (außer stretchability, welche immer den Wert von space hat, wenn sie nicht definiert ist). Somit sind folgende Aufrufe äquivalent:

\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7))

\override StaffGrouper.staff-staff-spacing =
  #'((basic-distance . 7)
     (minimum-distance . 0)
     (padding . 0)
     (stretchability . 7))

Eine möglicherweise ungewollte Konsequenz hiervon ist, dass alle Standardwerte, die etwa in einer Initialisierungsdatei zu Beginn einer LilyPond-Partitur geladen werden, nach dem Aufruf rückgängig gemacht werden. Im obigen Beispiel werden die initialisierten Standardwerte für padding und minimum-distance (definiert in scm/define-grobs.scm) auf den Standard zurückgesetzt, den sie uninitialisiert hätten (0 in beiden Fällen). Wenn eine Eigenschaft oder Variable in Form einer Aliste (jeder Größe) definiert wird, werden immer alle Schlüsselwerte auf den uninitialisierten Zustand zurückgesetzt. Es ist also sicherer, geschachtelte Aufrufe zu benutzen, wenn man nicht bewusst alle Werte zurücksetzen will.

Achtung: Geschachtelte Aufrufe funktionieren nicht mit Kontexteigenschaften (wie etwa beamExceptions, keyAlterations, timeSignatureSettings, usw.) Diese Eigenschaften können nur verändert werden, indem man sie vollständig als Alisten umdefiniert.


LilyPond Benutzerhandbuch v2.25.22 (development-branch).