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).

[image of music]

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.

[image of music]

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"
[image of music]

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]

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