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: Olivier Charade
Subject: Re: déplacement vertical d'un markup
Date: Tue, 26 Apr 2022 16:57:10 +0200
User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1

Là, je n'ai pas perdu ma journée.

Merci à JMarc pour la solution immédiate qui solutionne mon problème.

Et un grand merci à jean pour ce cours qui clarifie par mal de choses.
Le coup des croix rouges est super pédagogique pour comprendre ce qui se passe.
Le show-vertical-skylines n'a en revanche rien ajouté chez moi (en 2.22.1).

L'idée la fonction inside est aussi très intéressante

Et une question pour la comparaison des deux solutions: pourquoi le \override de JMarc ne nécessite pas d'agir sur la priorité alors que le \tweak, si?

Olivier

Le 26/04/2022 à 16:02, Jean Abou Samra a écrit :
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


|

--
Olivier Charade
Directeur adjoint de la Division Technique de l'INSU pour le site de Meudon
Coordinateur technique RESIF
Responsable technique des parcs géophysiques de l'INSU
Division Technique de l'INSU
UAR 855 du CNRS
1 place Aristide Briand
92195 Meudon Cedex
France
téléphone: +33(0)1 45 07 51 82
cellulaire: +33(0)6 11 39 09 59
télécopie:  +33(0)1 45 07 51 40
http://gpsmob.resif.fr/
http://gpscope.dt.insu.cnrs.fr/



reply via email to

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