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.