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 } >>
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 } >>
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.