5.3.7 Modifica delle liste associative

Alcune proprietà configurabili dall’utente sono rappresentate internamente come alist (liste associative), che contengono coppie di chiavi e valori. La struttura di una lista associativa è:

'((chiave1 . valore1)
  (chiave2 . valore2)
  (chiave3 . valore3)
  …)

Se una lista associativa è una proprietà di un grob o una variabile \paper, le sue chiavi possono essere modificate individualmente senza influenzare altre chiavi.

Per esempio, per ridurre lo spazio tra righi adiacenti in un gruppo di righi, si usa la proprietà staff-staff-spacing del grob StaffGrouper. La proprietà è una lista associativa con quattro chiavi: basic-distance, minimum-distance, padding e stretchability. Le impostazioni predefinite per questa proprietà sono elencate nella sezione “Backend” della Guida al funzionamento interno (vedi StaffGrouper):

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

Un modo per avvicinare i righi è ridurre il valore della chiave basic-distance (9) perché corrisponda al valore di minimum-distance (7). Per modificare una chiave singola individualmente, usare una dichiarazione annidata:

% spazio predefinito tra i righi
\new PianoStaff <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

% spazio ridotto tra i righi
\new PianoStaff \with {
  % questa è la dichiarazione annidata
  \override StaffGrouper.staff-staff-spacing.basic-distance = #7
} <<
  \new Staff { \clef treble c''1 }
  \new Staff { \clef bass   c1   }
>>

[image of music]

Con una dichiarazione annidata si aggiornerà la chiave specificata (come basic-distance nell’esempio precedente) senza modificare alcuna altra chiave già impostata per la stessa proprietà.

Ora immaginiamo di volere che i righi siano più vicini possibile ma senza sovrapporsi. Il modo più semplice per fare ciò è impostare tutte e quattro le chiavi della lista su zero. Tuttavia, non è necessario inserire quattro dichiarazioni annidate, una per ogni chiave. Si può invece ridefinire completamente la proprietà con una sola dichiarazione, attraverso una lista associativa:

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

Nota bene che qualsiasi chiave non elencata esplicitamente nella definizione della lista associativa sarà ripristinata al suo valore predefinito-quando-non-impostato. Nel caso di staff-staff-spacing, qualsiasi chiave-valore non impostata viene ripristinata su zero (eccetto stretchability, che prende il valore di basic-distance quando non è impostata). Dunque le due seguenti dichiarazioni sono equivalenti:

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

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

Una conseguenza (possibilmente non voluta) di questo approccio è l’eliminazione di eventuali impostazioni predefinite impostate in un file di inizializzazione e caricate ogni volta che un file di input viene compilato. Nell’esempio precedente le impostazioni predefinite per padding e minimum-distance (definite in scm/define-grobs.scm) sono ripristinate ai loro valori predefiniti-quando-non-impostati (zero per entrambe le chiavi). La definizione di una proprietà o di una variabile come una lista associativa (di qualsiasi dimensione) ripristinerà sempre tutte le chiavi-valori ai loro valori predefiniti-quando-non-impostati. A meno che questo non sia il risultato voluto, è più sicuro aggiornare le chiavi-valori individualmente con una dichiarazione annidata.

Nota: Le dichiarazioni annidate non funzionano per le liste associative delle proprietà di contesto (come beamExceptions, keyAlterations, timeSignatureSettings, etc.). Queste proprietà possono essere modificate soltanto ridefinendole completamente come liste associative.


Guida alla Notazione di LilyPond v2.25.21 (ramo di sviluppo).