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.