2012/7/21 <m...@wimvd.nl>: > Hi, > > I have some problems with the vertical alignment of text. I tried both the > \halign, \lower inside a \markup and explicit offset commands with an > \override, but I couldn't get it right. This sample shows the problem in > detail. I do want to move the two "gliss." text-strings nearly on top or > directly below the glissando itself.
Hi, perhaps you may want to try the following: \version "2.14.1" #(define (radians->degree radians) (/ (* radians 180) PI)) #(define ((gliss-plus-text text) grob) (let* ((text-stencil (grob-interpret-markup grob text)) (spanner-stencil (ly:line-spanner::print grob)) (left-bound-info (ly:grob-property grob 'left-bound-info)) (y-left (cdar left-bound-info)) (right-bound-info (ly:grob-property grob 'right-bound-info)) (y-right (cdar right-bound-info)) (slant (if (> y-right y-left) 1 -1)) (spanner-stencil-x-length (interval-length (ly:stencil-extent spanner-stencil X))) (spanner-stencil-y-length (interval-length (ly:stencil-extent spanner-stencil Y))) (alpha (radians->degree (atan (/ spanner-stencil-y-length spanner-stencil-x-length)))) (spanner-center-X (interval-center (ly:stencil-extent spanner-stencil X))) (label-center-X (interval-center (ly:stencil-extent text-stencil X)))) (ly:stencil-combine-at-edge spanner-stencil Y UP (ly:stencil-translate (ly:stencil-rotate text-stencil (* slant alpha) 0 0) (cons (- spanner-center-X label-center-X) 0)) (* -0.5 spanner-stencil-y-length)))) glissandoTextOn = \override Score.Glissando #'stencil = #(gliss-plus-text (markup #:italic #:tiny "gliss")) glissandoTextOff = \revert Score.Glissando #'stencil noteHeadsOff = { \override NoteHead #'transparent = ##t \override NoteHead #'no-ledgers = ##t } noteHeadsOn = { \revert NoteHead #'transparent \revert NoteHead #'no-ledgers } \score { \new Staff { \cadenzaOn \set Score.timing = ##f \glissandoTextOn \override Score.Glissando #'style = #'trill g'''4\ff\( << { \stemDown f'''32[ s256 c'''32 s256 ces'''32 s256 \noteHeadsOff e''32 s256 d''32 s256 c''32 s256 a'32 s256 g'32 s256 f'32 s256 \noteHeadsOn d'32 s256 des'32 s256 c'32] \stemNeutral } \\ { \noteHeadsOff \override Stem #'transparent = ##t \once \override Glissando #'extra-offset = #'(-0.5 . 0.0) s16. g''4\glissando g'8 \revert Glissando #'style \noteHeadsOn \revert Stem #'transparent } >> \times 2/3 { bes4-.\) d-^\> e-^ } \once \override Glissando #'minimum-length = #9 \once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods e->\(\!\glissando f'8[ g'--]\) \breathe \bar "|" a'8.[ a'16] ~ a'16[ g' f'( g']) } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% With one of the newer devel-version you can write it more straight-forward: \version "2.15.39" #(define (radians->degree radians) (/ (* radians 180) PI)) #(define ((gliss-plus-text text) grob) (let* ((text-stencil (grob-interpret-markup grob text)) (spanner-stencil (ly:line-spanner::print grob)) (left-bound-info (ly:grob-property grob 'left-bound-info)) (y-left (cdar left-bound-info)) (right-bound-info (ly:grob-property grob 'right-bound-info)) (y-right (cdar right-bound-info)) (slant (if (> y-right y-left) 1 -1)) (spanner-stencil-x-length (interval-length (ly:stencil-extent spanner-stencil X))) (spanner-stencil-y-length (interval-length (ly:stencil-extent spanner-stencil Y))) (alpha (radians->degree (atan (/ spanner-stencil-y-length spanner-stencil-x-length)))) (spanner-center-X (interval-center (ly:stencil-extent spanner-stencil X))) (label-center-X (interval-center (ly:stencil-extent text-stencil X)))) (ly:stencil-combine-at-edge spanner-stencil Y UP (ly:stencil-translate (ly:stencil-rotate text-stencil (* slant alpha) 0 0) (cons (- spanner-center-X label-center-X) 0)) (* -0.5 spanner-stencil-y-length)))) glissandoTextOn = \override Score.Glissando #'stencil = #(gliss-plus-text (markup #:italic #:tiny "gliss")) glissandoTextOff = \revert Score.Glissando #'stencil noteHeadsOff = { \override NoteHead #'transparent = ##t \override NoteHead #'no-ledgers = ##t } noteHeadsOn = { \revert NoteHead #'transparent \revert NoteHead #'no-ledgers } customGlissandoTweaksOn = { \glissandoTextOn \override Score.Glissando #'style = #'trill \override Score.Glissando #'bound-details #'left #'padding = #1 \override Score.Glissando #'bound-details #'right #'padding = #0.2 \override Score.Glissando #'minimum-length = #22 \override Score.Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods } customGlissandoTweaksOff = { \glissandoTextOff \revert Score.Glissando #'style \revert Score.Glissando #'bound-details #'left #'padding \revert Score.Glissando #'bound-details #'right #'padding \revert Score.Glissando #'minimum-length \revert Score.Glissando #'springs-and-rods } \score { \new Staff { \cadenzaOn \set Score.timing = ##f \customGlissandoTweaksOn g'''4\ff\( f'''32[ c'''32 \override Glissando #'rotation = #'(2 -1 0) ces'''32\glissando \override NoteColumn #'glissando-skip = ##t \noteHeadsOff a''32 f''32 d''32 b'32 g'32 f'32 \noteHeadsOn \revert NoteColumn #'glissando-skip d'32 des'32 c'32] \times 2/3 { bes4-.\) d-^\> e-^ } \override Glissando #'minimum-length = #8 e->\(\!\glissando f'8[ g'--]\) \customGlissandoTweaksOff \breathe \bar "|" a'8.[ a'16] ~ a'16[ g' f'( g']) } } HTH, Harm _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user