36.9.3 Utilisation de self-alignment-interface ¶
La self-alignment-interface définit les points d’alignement des
objets. Dans LilyPond, cette interface s’applique à de nombreux objets
graphiques – il sont listés dans self-alignment-interface.
L’interface d’alignement se base sur la dimension de la boîte englobant l’objet graphique. La coordonnée X Y du point d’alignement d’un objet est un multiple de la moitié de la largeur (hauteur) de cette boîte englobante. En d’autre termes, une unité correspond à la moitié de l’étendue X Y de l’objet.
Une coordonnée X Y à −1 représente le coin gauche (inférieur) de la boîte englobante. Une coordonnée X Y à 0 en représente le centre. Une coordonnée X Y à 1 en représente le coin droit (supérieur).
Une coordonnée peut être n’importe quel nombre réel, y compris des valeurs inférieures à −1 ou supérieures à 1.
L’image suivante montre le cas général, où à la fois le parent et l’objet « self » ont des paramètres d’alignement horizontal et vertical non nuls AP et AS (ces deux points sont ici choisis arbirtrairemen afin d’illustrer le concept).
Réalignement d’objets horizontalement ¶
self-alignment-X peut contenir un nombre réel, l’unité de base
étant la moitié de l’étendue horizontale de l’objet. Une valeur négative
décalera l’objet vers la droite, une valeur positive vers la gauche. La
valeur 0 permet de centrer l’objet sur le point de référence de
son parent. Une valeur de -1 alignera le bord gauche de
l’objet sur le point de référence de son parent, et une valeur
de 1 alignera le bord droit de l’objet sur le point de référence
de son parent. Les valeurs symboliques LEFT, CENTER et
RIGHT correspondent respectivement à -1, 0
et 1.
Une valeur à #f aligne horizontalement l’objet en utilisant son
point de référence. Cette valeur n’est valide que lorsque l’objet a un
parent ; LilyPond émettra un erreur en l’absence de parent.
Lorsqu’un objet a un parent, son alignement horizontal est lui aussi
affecté par la propriété parent-alignment-X.
L’image suivant illustre diverses combinaisons de valeurs de
self-alignment-X et parent-alignment-X pour des objets
TextScript dont les parents sont leurs objets NoteColumn
associés. Les objets TextScript sont ici des boîtes grisées dont
l’étendue horizontale est '(-1 . 3) et l’étendue verticale
'(-1 . 2) ; le point de référence des boîtes est représenté
par un point. Le point de référence d’un objet NoteColumn est
toujours (0,0) ; les objets NoteHead suspendus (têtes de note
d’un accord l’une sur l’autre, côté non par défaut d’une hampe)
dépassent mais ne seront pas pris en compte. La position horizontale du
point-parent d’alignement est représenté par une ligne verticale, et le
point d’alignement du TextScript est indiqué par une croix.
Aussi bien \override que \tweak peuvent venir en aide afin
de modifier la valeur de self-alignment-X. Toutefois, le recours
à la commande \tweak permet de traiter séparément plusieurs
annotations affectées à une même note.
a'-\tweak self-alignment-X -1 ^"aligné par la gauche" -\tweak self-alignment-X 0 ^"aligné au centre" -\tweak self-alignment-X #RIGHT ^"aligné par la droite" -\tweak self-alignment-X -2.5 ^"aligné plus loin sur la droite"![]()
Réalignement d’objets verticalement ¶
L’alignement vertical suit le même principe : la propriété
Y-offset doit alors engager la procédure
ly:self-alignment-interface::y-aligned-on-self. Toutefois, il
arrive bien souvent que d’autres mécanismes interviennent dans
l’alignement vertical. La valeur de Y-offset n’étant que l’une
des variables qui seront prises en compte, l’ajustement pour certains
objets peut se révéler fastidieux. L’unité de base est relativement
réduite, puisqu’elle est de la moitié de l’étendue verticale de
l’objet ; le nombre à fournir en argument pourrait donc être
relativement élevé. Une valeur de -1 alignera le bord
inférieur de l’objet sur le point de référence de son parent, et une
valeur de 1 alignera le bord supérieur de l’objet sur le point de
référence de son parent. La valeur 0 permet de centrer l’objet
sur le point de référence de son parent. Les valeurs symboliques
DOWN, CENTER et UP correspondent respectivement
à -1, 0 et 1.
Une valeur à #f aligne verticalement l’objet en utilisant son
point de référence. Cette valeur n’est valide que lorsque l’objet a un
parent ; LilyPond émettra un erreur en l’absence de parent.
Il est à noter que parent-alignment-Y ne marche pratiquement
jamais : il y a trop de contraintes extérieures qui influencent la
manière dont un objet sera positionné relativement à son objet parent.
Prenons l’image précédente pour illustrer : la valeur du point de
référence du parent (l’objet NoteColumn) dépend de l’objet
attaché (l’objet TextScript) en même temps que les valeurs de
certaines propriétés de décalage – comme on peut le constater, LilyPond
fait tout son possible pour replacer les objets TextScript au
plus près de la portée. En raison de cette interdépendance entre l’objet
et son parent, accéder ou modifier parent-alignment-Y se révèle
normalement infructueux et génère souvent un message de « dépendance
circulaire ».
Le moyen classique pour ajuster les distances verticales consiste à
jouer sur les différentes propriétés de décalage dont LilyPond dispose,
comme outside-staff-padding.
Réalignement d’objets sur les deux axes ¶
Définir à la fois self-alignment-X et self-alignment-Y
permet de réaligner un objet sur les deux axes.
Dans l’exemple ci-dessous, nous ajustons le positionnement des noms
d’instrument. L’objet InstrumentName est un objet qui n’a pas de
parent : self-alignment-X calculera un alignement relatif à la
marge de gauche et au début du système (soit l’indentation du système),
et self-alignment-Y alignera l’objet InstrumentName
par rapport à la ligne médiane de la portée considérée.
sn = #(define-music-function (name x y) (string? number? number?) #{ \new RhythmicStaff \with { instrumentName = #name \override InstrumentName.self-alignment-X = #x \override InstrumentName.self-alignment-Y = #y } { f'1 } #}) << \sn "AAA" #1 #3 \sn "AAAAA" #1 #3 \sn "BBB" #0.5 #1.5 \sn "BBBBB" #0.5 #1.5 \sn "CCC" #0 #0 \sn "CCCCC" #0 #0 \sn "DDD" #-0.5 #-1.5 \sn "DDDDD" #-0.5 #-1.5 \sn "EEE" #-1 #-3 \sn "EEEEE" #-1 #-3 >> \layout { indent = 5\cm \context { \RhythmicStaff \override VerticalAxisGroup.staff-staff-spacing = #'((minimum-distance . 0) (basic-distance . 0) (padding . 2.5)) } }![]()
![[image of music]](../29/lily-6f2eb513.png)
![[image of music]](../5e/lily-2168e669.png)
![[image of music]](../e0/lily-b896bd5c.png)
![[image of music]](../95/lily-d14b906a.png)