lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: déplacement vertical d'un markup


From: Jean Abou Samra
Subject: Re: déplacement vertical d'un markup
Date: Tue, 26 Apr 2022 16:02:58 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0

Bonjour,

Le 26/04/2022 à 13:07, Olivier Charade a écrit :
Bonjour,
J'avoue que j'ai toujours du mal à comprendre la documentation sur ce sujet où le décalage de la position verticale doit partir d'un "point d'ancrage".



La documentation aurait peut-être besoin d'une clarification à ce sujet,
car ce n'est pas la première fois que je vois ce type de problème
apparaître sur les listes.



Comme ma partition est assez complexe, je viens de vérifier sous Lilybin que l'extrait suivant reproduisait bien mon problème:
\score{
        \new Staff = "violon 1" {
        <<
          \new Voice  \relative {
              bes'8\( d bes' d, bes d bes' d,\)
          }
          \new Voice {
              \override TextScript.color = #darkgreen
              s8^\markup \center-align "[11" s^\markup \center-align "12]" s_\markup \center-align "[11" s_\markup \center-align "12]" s^\markup {\center-align \lower #2 "[11"} s^\markup \center-align "12]" s_\markup \center-align "[11" s_\markup \center-align "12]"
          }
        >>
    }

    \layout{}
}

Je voudrais faire passer le "[11" du milieu (et quand j'aurai trouvé, le "12]" aussi), sous la grande liaison. Mais le \lower n'a aucune action.



Avec votre \markup, vous fournissez à LilyPond une sorte de programme
de dessin qui explique comment afficher l'objet. Ensuite, charge à
LilyPond de placer correctement l'objet. Comment s'y prend-elle ?
Sur l'axe horizontal, les choses sont relativement simples.
Prenons la page
https://lilypond.org/doc/v2.23/Documentation/internals/textscript
La valeur par défaut de TextScript.X-offset est
#|ly:self-alignment-interface::aligned-on-x-parent,
qui (dans ce cas) aligne le markup sur la note. Pour être
plus précis, #ly:self-alignment-interface:aligned-on-x-parent prend
le point de référence du markup, et l'amène horizontalement
sur le point de référence de la note. Affichons les points de
référence pour y voir plus clair :

\version "2.23.8"

\markup x =
  \markup
    \combine
      \with-outline \stencil #empty-stencil
      \with-color "red"
      \combine
        \translate #'(-0.5 . -0.5)
          \draw-line #'(1 . 1)
        \translate #'(-0.5 . 0.5)
          \draw-line #'(1 . -1)
    \etc

xGrob =
#(define-music-function (grob) (symbol?)
   #{
     \override $grob . stencil =
       #(grob-transformer 'stencil
         (lambda (grob orig)
           (grob-interpret-markup grob #{ \markup \x \stencil #orig #})))
   #})

{
  \xGrob NoteHead
  a''^\markup \x \center-align "12]"
}


Sur l'axe vertical, les choses sont moins simples. Ajoutez
maintenant le \lower #2 entre \x et \center-align. Vous
constaterez que le point de référence du markup s'éloigne,
mais le markup ne s'éloigne pas visuellement. Ceci, parce que
le Y-offset est mis à #side-position-interface::y-aligned-side,
qui aligne un objet contre un autre en tenant compte de sa
forme. D'ailleurs, on peut afficher les formes telles que
vues par LilyPond :

\version "2.23.8"

\markup x =
  \markup
    \combine
      \with-outline \stencil #empty-stencil
      \with-color "red"
      \combine
        \translate #'(-0.5 . -0.5)
          \draw-line #'(1 . 1)
        \translate #'(-0.5 . 0.5)
          \draw-line #'(1 . -1)
    \etc

xGrob =
#(define-music-function (grob) (symbol?)
   #{
     \override $grob . stencil =
       #(grob-transformer 'stencil
         (lambda (grob orig)
           (grob-interpret-markup grob #{ \markup \x \stencil #orig #})))
   #})

{
  \xGrob NoteHead
  \override NoteHead.show-vertical-skylines = ##t
  \override TextScript.show-vertical-skylines = ##t
  a''^\markup \x \lower #2 \center-align "12]"
}


Moralité : le \lower est bien respecté. L'ennui, c'est que
LilyPond repasse derrière pour aligner l'objet en fonction
de sa forme. Comme elle détecte qu'il est très bas par rapport
à son point de référence, elle le remonte pour ajuster la
distance entre le bas de l'objet et la tête de note. C'est clair ?

Et pour répondre au problème, une méthode est de changer Y-offset
directement, avec la petite subtilité qu'il faut annuler la
outside-staff-priority pour désactiver la détection automatique
de collisions.

\version "2.23.8"

\new Staff {
  <<
    \new Voice \relative {
      bes'8\( d bes' d, bes d bes' d,\)
    }
    \new Voice {
      \override TextScript.color = #darkgreen
      s8^\markup \center-align "[11"
      s^\markup \center-align "12]"
      s_\markup \center-align "[11"
      s_\markup \center-align "12]"
      s\tweak Y-offset 3.5 \tweak outside-staff-priority ##f ^\markup \center-align "[11"
      s^\markup \center-align "12]"
      s_\markup \center-align "[11"
      s_\markup \center-align "12]"
    }
  >>
}


J'espère que l'explication est compréhensible. À part ça, il y a
la solution efficace qui dit juste à LilyPond de mettre le TextScript
en-dessous de la liaison :

\version "2.23.8"

inside = \tweak avoid-slur inside \tweak outside-staff-priority ##f  \etc

\new Staff {
  <<
    \new Voice \relative {
      bes'8\( d bes' d, bes d bes' d,\)
    }
    \new Voice {
      \override TextScript.color = #darkgreen
      s8^\markup \center-align "[11"
      s^\markup \center-align "12]"
      s_\markup \center-align "[11"
      s_\markup \center-align "12]"
      s\inside ^\markup \center-align "[11"
      s^\markup \center-align "12]"
      s_\markup \center-align "[11"
      s_\markup \center-align "12]"
    }
  >>
}



Cette combine-là est expliquée sur
http://lilypond.org/doc/v2.23/Documentation/learning/outside_002dstaff-objects.html#the-outside_002dstaff_002dpriority-property

Cordialement,
Jean


|



reply via email to

[Prev in Thread] Current Thread [Next in Thread]