Subject: déplacement vertical d'un markup

From: Olivier Charade <[email-masked]>
Date: Tue, 26 Apr 2022 13:07:55 +0200

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

Merci d'avance.
Olivier

---

From: "F. Moinard" <[email-masked]>
Date: Tue, 26 Apr 2022 17:47:56 +0400

Bonjour Olivier,

Une proposition de solution besogneuse en attendant de vraies 
explications (et cf. 
https://lilypond.org/doc/v2.23/Documentation/learning/outside_002dstaff-objects#the-outside_002dstaff_002dpriority-property 
)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\version "2.23.8"

\score{
   \new Staff = "violon 1" {
     <<
       \new Voice  \relative {
         bes'8  d bes' d, bes d bes' d,
       }
       \new Voice \relative {
         \override Staff.PhrasingSlur.outside-staff-priority= #500
         \override TextScript.avoid-slur = #'inside
         \hideNotes
         \voiceTwo
         \override TextScript.color = #darkgreen
         \phrasingSlurUp
         bes'8\( ^\markup \center-align "[11" d^\markup \center-align "12]" bes'_\markup \center-align "[11" d,_\markup \center-align "12]" bes^\markup {\center-align \lower #2 "[11"} d^\markup \center-align "12]" bes'_\markup \center-align "[11" d,_\markup \center-align "12]" \)
       }
   }
   \layout{}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

hth,
Frédéric

Le 26/04/2022 à 15:07, Olivier Charade a écrit :
> Comme ma partition est assez complexe, je viens de vérifier sous 
> Lilybin que l'extrait suivant reproduisait bien mon problème:
> \score{
>               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.
>
> Merci d'avance.
> Olivier
>

---

From: Editions IN NOMINE <[email-masked]>
Date: Tue, 26 Apr 2022 15:52:02 +0200

Mmm what about :

\version "2.22.1"

\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]"
*\once \override Staff.TextScript.extra-offset = #'(0 . -3) *
               s^\markup {\center-align \lower #2 "[11"} s^\markup 
\center-align "12]" s_\markup \center-align "[11" s_\markup 
\center-align "12]"
           }
         >>
     }

     \layout{}
}

C'est ma fonction fétiche pour poser tout ce que je veux où je veux

Cela répond-il à ta question ?

JMarc

---

From: Olivier Charade <[email-masked]>
Date: Tue, 26 Apr 2022 16:00:59 +0200

Merci Frédéric.
Il faut vraiment être bien reposé pour lire ce genre de passage dans la 
documentation.
Avec cette solution, c'est toute la liaison qui passe au-dessus. Et 
c'est normal d'après ce que je comprends. Je ne voulais pas bouger la 
liaison. Juste faire descendre les numéros là où il y a de la place pour 
les écrire entre les notes et la liaison. D'ailleurs, avec le changement 
de couleur, ça ne me gênerait pas plus que ça que certains numéros se 
superposent à la liaison, ce que Lily cherche sans doute à éviter à tout 
prix.
Olivier

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

---

From: Jean Abou Samra <[email-masked]>
Date: Tue, 26 Apr 2022 16:02:58 +0200

Bonjour,

> sujet où le décalage de la position verticale doit partir d'un "point 

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.

> le "12]" aussi), sous la grande liaison. Mais le \lower n'a aucune 

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

|

---

From: Olivier Charade <[email-masked]>
Date: Tue, 26 Apr 2022 16:57:10 +0200

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

---

From: Jean Abou Samra <[email-masked]>
Date: Tue, 26 Apr 2022 17:18:02 +0200

Le 26/04/2022 à 16:57, Olivier Charade a écrit :
> Le coup des croix rouges est super pédagogique pour comprendre ce qui 
> se passe.

Ah oui, désolé, j'ai vu le \version "2.23.8" sur l'exemple de
Frédéric, et je ne me suis pas rendu compte qu'il n'y était pas
dans le code que vous avez posté. C'est une propriété ajoutée en
2.23.6 (par moi en fait). Je joins le PDF du résultat.

> \override de JMarc ne nécessite pas d'agir sur la priorité alors que 
> le \tweak, si?

C'est toute l'idée de extra-offset. D'abord, LilyPond fait tout
le placement par elle-même, et ensuite, elle applique les extra-offset,
qui n'ont donc d'effet que sur un seul objet : les autres objets
ne « remarquent » pas le extra-offset dans leur propre placement. C'est
une propriété pratique car il n'y a pas à se poser de questions : un coup de
extra-offset, et l'objet obéit directement, sans avoir à désactiver
des résolutions de collisions, à déplacer d'autres objets, etc.
Par contre, si la mise en page change légèrement, l'extra-offset
risque de ne plus être juste. C'est pourquoi on recommande en général
de chercher d'abord une propriété adéquate qui permet de faire
faire ce que l'on veut à Lily (en l'occurrence avoid-slur), et
d'utiliser extra-offset s'il y en a vraiment besoin.

Cordialement,
Jean

---

From: Editions IN NOMINE <[email-masked]>
Date: Tue, 26 Apr 2022 17:34:29 +0200

Hé mais c'est drôlement sioux, cette histoire de petites croix rouges ! 
Bravo et merci !

JMarc

---

From: Olivier Charade <[email-masked]>
Date: Thu, 28 Apr 2022 10:33:53 +0200

Merci Jean (depuis le temps je me dis que je dois programmer une touche 
de mon clavier pour écrire ce texte qui sert tout le temps).
Du coup je viens de franchir le pas d'oser installer une version "pas 
stable" de Lilypond, et de jouer un peu avec les vertical- et 
horizontal-skylines.
Et bien sûr, question:
Pourquoi l'activation des vertical-skylines sur les TextScript 
provoquent le dessin d'un contour de chaque caractère (y compris des 
lignes verticales entre le haut et le bas du caractère), alors que les 
horizontal-skyline marquent apparemment toujours les bords gauche et 
droit de la "boîte de texte"? Je me serais attendu à avoir juste un 
rectangle autour du texte si j'activais les deux.
En tous cas c'est un super outil pour mieux comprendre les placements 
respectifs des objets.
Olivier

---

From: Jean Abou Samra <[email-masked]>
Date: Thu, 28 Apr 2022 14:15:15 +0200

Le 28/04/2022 à 10:33, Olivier Charade a écrit :
> Merci Jean (depuis le temps je me dis que je dois programmer une 
> touche de mon clavier pour écrire ce texte qui sert tout le temps).

Bonne question ! Et ce n'est pas si facile de répondre... En résumé,
pour des raisons d'utilité et d'efficacité. LilyPond pourrait
tout à fait calculer le contour précis horizontal du texte.
D'ailleurs, elle le fera si vous le lui demandez gentiment :

\version "2.23.8"

{
   \override TextScript.horizontal-skylines = 
#grob::always-horizontal-skylines-from-stencil
   \override TextScript.show-horizontal-skylines = ##t
   %\override TextScript.show-vertical-skylines = ##t
   c'1^"un peu de texte"
}

Mais à quoi pourrait lui servir ce contour ? La seule utilité potentielle
serait un espacement horizontal précis. Cependant, l'espacement horizontal
n'est de toute façon pas réalisé avec des contraintes exactes. Observons
un peu comment ça se passe :

\version "2.23.8"

\layout {
   \context {
     \Score
     \override PaperColumn.show-horizontal-skylines = ##t
     \override NonMusicalPaperColumn.show-horizontal-skylines = ##t
   }
}

<<
   \new Staff {
     c'1
   }
   \new Staff \relative {
     c'8 e g c e g c e
   }

Comme vous pouvez le voir, ces lignes d'horizon (skylines) sont
approximatives. Elles sont calculées avant les sauts de ligne, donc
il n'est pas possible d'en avoir d'exactes, puisque, par exemple, la
pente d'une liaison dépend de l'espacement horizontal, qui lui-même
dépend des sauts de ligne. Pour casser le cercle vicieux, LilyPond se
débrouille pour faire des approximations. Dans ce contexte, il ne servirait
pas à grand-chose d'avoir des skylines très précises pour le texte.
Au mieux, cela ferait gagner un millimètre dans un endroit à l'espacement
horizontal serré. Par contre, pour l'espacement vertical, c'est important,
car cela se remarque visuellement : une nuance trop éloignée de la
note devient ambigüe, par exemple.

Par ailleurs, calculer les skylines a un certain coût (en termes de
temps de compilation). C'est la raison pour laquelle LilyPond ne
le fait pas systématiquement pour tous les objets.

> En tous cas c'est un super outil pour mieux comprendre les placements 

En tant que développeur ayant ajouté la fonctionnalité, je suis
heureux de l'entendre.

Cordialement,
Jean