Pour répondre à ta question:
%%%%%%%%%%%
\version "2.18.2"
% Code d'après le test de régression `
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 '()))))))))
%% Test :
\score {
\relative c' {
c d e f g a b c
\bar "|."
}
\addlyrics { do ré mi fa sol \startTextSpan la si do \stopTextSpan }
\layout {
\context {
\Lyrics
\consists #underline-engraver
\override TextSpanner.direction = #DOWN
\override TextSpanner.style = #'dashed-line
\override TextSpanner.dash-fraction = #0.3 % <= réglage du pointillé 1
\override TextSpanner.dash-period = #1 % <= réglage du pointillé 2
\override TextSpanner.outside-staff-priority = ##f
\override TextSpanner.padding = #0.5 % <= réglage de la distance du soulignage
\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))))
}
}
}
%%%%%