5.3.7 Modification de listes associatives
Certaines propriétés configurables par l’utilisateur se présentent en interne comme étant des listes associatives – les puristes diront des alists. Une alist est en fait constituée de plusieurs paires de clés et valeurs. La structure d’un liste associative ressemble à :
'((clé1 . valeur1) (clé2 . valeur2) (clé3 . valeur3) …)
Dans le cas où cette liste représente les propriétés d’un objet
graphique ou bien l’une des variables du bloc \paper, chaque clé
peut être modifiée individuellement sans que cela affecte les autres.
Par exemple, pour réduire l’espacement entre deux portées adjacentes
d’un même système, on utilisera la propriété staff-staff-spacing
qui est attachée à l’objet graphique StaffGrouper. Cette
propriété est constituée d’une liste de quatre clés :
basic-distance, minimum-distance, padding et
stretchability. Ses réglages par défaut tels que mentionnés à la
rubrique Backend de la référence des propriétés internes – voir
StaffGrouper – sont :
'((basic-distance . 9) (minimum-distance . 7) (padding . 1) (stretchability . 5))
Afin de rapprocher nos deux portées, il suffit de réduire la valeur
(9) de la clé basic-distance au niveau de celle de la clé
minimum-distance (7). La modification d’une seule clé
individuellement peut se réaliser sous la forme d’une déclaration
imbriquée :
% 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 } >>
Le recours à une déclaration imbriquée touchera la clé indiquée
(basic-distance dans l’exemple ci-dessus) sans pour autant
modifier les autres clés de la propriété considérée.
Considérons maintenant que nous souhaitions que les portées soient le plus proche possible les unes des autres, à la limite du chevauchement. Il suffirait de mettre les quatre clés à zéro. Nous pourrions saisir quatre déclarations, chacune d’elles touchant une clé. Nous pouvons tout aussi bien redéfinir la propriété en une seule clause, sous la forme d’une liste associative :
\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 } >>
N’oubliez pas que dès lors qu’une clé n’apparaît pas dans la liste, elle
retourne à sa valeur sauf-mention-contraire. Autrement dit, dans
le cas de staff-staff-spacing qui nous occupe, toutes les clés
non mentionnées seront ramenées à zéro – à l’exception de
stretchability qui prend par défaut la valeur de
basic-distance. Les deux assertions suivantes sont donc
équivalentes.
\override StaffGrouper.staff-staff-spacing =
#'((basic-distance . 7))
\override StaffGrouper.staff-staff-spacing =
#'((basic-distance . 7)
(minimum-distance . 0)
(padding . 0)
(stretchability . 7))
L’une des conséquences, parfois involontaire, de ceci est la suppression
de réglages standards effectués par un fichier d’initialisation chargé à
chaque compilation d’un fichier source. Dans l’exemple précédent, les
réglages standards de padding et minimum-distance, tels
que déterminés par ‘scm/define-grobs.scm’, se voient ramenés à leur
valeur si-non-définie ; autrement dit, les deux clés sont mises à
zéro. La définition d’une propriété ou d’une variable sous forme de
liste associative, quelle qu’en soit la taille, réinitialisera toujours
les clés non mentionnées à leur valeur si-non-définie. Si telle
n’est pas votre intention, nous vous recommandons alors de régler la
valeur des clés individuellement par des déclarations imbriquées.
Note : Les déclarations imbriquées ne sont pas fonctionnelles dans le
cas des listes associatives des propriétés de contexte – telles
beamExceptions, keyAlterations,
timeSignatureSettings, etc. Ces propriétés ne sont modifiables
qu’au travers d’une complète redéfinition de leur liste associative.
![[image of music]](../3b/lily-c7580a41.png)
![[image of music]](../5e/lily-1aebdd21.png)