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

[image of music]

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

[image of music]

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.


GNU LilyPond – Manuel de notation v2.25.22 (development-branch).