\version "2.12.3" \version "2.13.44" % code adapted from regression test `scheme-text-spanner.ly' #(define (add-bound-item spanner item) (if (null? (ly:spanner-bound spanner LEFT)) (ly:spanner-set-bound! spanner LEFT item) (ly:spanner-set-bound! spanner RIGHT item))) #(define (axis-offset-symbol axis) (if (eq? axis X) 'X-offset 'Y-offset)) #(define (set-axis! grob axis) (if (not (number? (ly:grob-property grob 'side-axis))) (begin (set! (ly:grob-property grob 'side-axis) axis) (ly:grob-chain-callback grob (if (eq? axis X) ly:side-position-interface::x-aligned-side ly:side-position-interface::y-aligned-side) (axis-offset-symbol axis))))) #(define (underline-engraver context) (let ((span '()) (finished '()) (current-event '()) (event-drul '(() . ()))) (list (cons 'listeners (list (cons 'text-span-event (lambda (engraver event) (if (= START (ly:event-property event 'span-direction)) (set-car! event-drul event) (set-cdr! event-drul event)))))) (cons 'acknowledgers (list (cons 'lyric-syllable-interface (lambda (engraver grob source-engraver) (if (ly:spanner? span) (begin (ly:pointer-group-interface::add-grob span 'note-columns grob) (add-bound-item span grob))) (if (ly:spanner? finished) (begin (ly:pointer-group-interface::add-grob finished 'note-columns grob) (add-bound-item finished grob))))))) (cons 'process-music (lambda (trans) (if (ly:stream-event? (cdr event-drul)) (if (null? span) (ly:warning "cannot find start of underline") (begin (set! finished span) (ly:engraver-announce-end-grob trans finished current-event) (set! span '()) (set! current-event '()) (set-cdr! event-drul '())))) (if (ly:stream-event? (car event-drul)) (begin (set! current-event (car event-drul)) (set! span (ly:engraver-make-grob trans 'TextSpanner current-event)) (set-axis! span Y) (set-car! event-drul '()))))) (cons 'stop-translation-timestep (lambda (trans) (if (and (ly:spanner? span) (null? (ly:spanner-bound span LEFT))) (set! (ly:spanner-bound span LEFT) (ly:context-property context 'currentMusicalColumn))) (if (ly:spanner? finished) (begin (if (null? (ly:spanner-bound finished RIGHT)) (set! (ly:spanner-bound finished RIGHT) (ly:context-property context 'currentMusicalColumn))) (set! finished '()) (set! event-drul '(() . ())))))) (cons 'finalize (lambda (trans) (if (ly:spanner? finished) (begin (if (null? (ly:spanner-bound finished RIGHT)) (set! (ly:spanner-bound finished RIGHT) (ly:context-property context 'currentMusicalColumn))) (set! finished '()))) (if (ly:spanner? span) (begin (ly:warning "unterminated underline") (ly:grob-suicide! span) (set! span '())))))))) \score { \relative c' { \tempo 4 = 152 \time 2/4 e8( f) g4 | g8( aes) g( f) | \acciaccatura f8 e2 | f4 g | aes g8 f | e4 f | g g8( f) | \acciaccatura f8 e2 | e4 e | e2 \bar "|." } \addlyrics { И- \startTextSpan ван си Ра- ди гу- во- ри, ма- ри, И- ван си Ра- ди гу- во- ри \stopTextSpan } % \layout { indent = #0 line-width = 190\mm ragged-right=##f \context { \Lyrics \consists #underline-engraver \override TextSpanner #'direction = #DOWN \override TextSpanner #'style = #'line \override TextSpanner #'outside-staff-priority = ##f \override TextSpanner #'padding = #0.1 % sets the distance of the line from the lyrics \override TextSpanner #'bound-details = #`((left . ((Y . 0) (padding . 0) (attach-dir . ,LEFT))) (left-broken . ((end-on-note . #t))) (right . ((Y . 0) (padding . 0) (attach-dir . ,RIGHT)))) } } % \midi { \context { \Score tempoWholesPerMinute = #(ly:make-moment 152 4) } } % \header { opus = "TD-93,1,1" tagline = ##f } }