[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Vertical Text alignment problem
From: |
Thomas Morley |
Subject: |
Re: Vertical Text alignment problem |
Date: |
Sat, 21 Jul 2012 21:15:18 +0200 |
2012/7/21 <address@hidden>:
> 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