Hi Stu, > I managed to underline a single word using the LilyPond '\underline', but > would like to underline phrases without spaces and durations appended.
Surround them in quotes, not braces. > The output shows: > The 'skip' at the beginning appears to be ignored; No, the lyrics are simply center-aligned, so it looks that way — use layout { ragged-right = ##f } to see what I mean. > In lyricmode, there's an override for italic, e.g.: > \override Lyrics.LyricText.font-shape = #'italic > Is there something similar for underline? Not exactly… but I found a decade-old Scheme engraver that I believe does what you want. Hope it helps! Kieren. %%% SNIPPET BEGINS \version "2.25.11" #(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 '())))))))) \layout { ragged-right = ##f indent = 0 \context { \Lyrics \consists #underline-engraver \override TextSpanner.direction = #DOWN \override TextSpanner.style = #'line \override TextSpanner.outside-staff-priority = ##f \override TextSpanner.padding = #0.2 % 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)))) } } eighthNotes = { c'8 8 8 8 \break c'8 8 8 8 } words = \lyricmode { \skip 8 Two4 \startTextSpan Four8 Five Six \stopTextSpan Seven8 Eight } << \new Voice = "one" \eighthNotes \new Lyrics \lyricsto "one" \words >> %%% SNIPPET ENDS ______________________________________________ My work day may look different than your work day. Please do not feel obligated to read or respond to this email outside of your normal working hours.