I'm not sure where I found it, but the file that I have is slightly
different. It's worked well for me.
Here's the content:
> \version "2.20.0"
>
> #(define (conditional-kill-lyric-extender-callback . args)
> (lambda (grob)
> (let* ((orig (ly:grob-original grob))
> (siblings (ly:spanner-broken-into orig))
> (minimum-length
> (if (null? args)
> (ly:grob-property grob 'minimum-length 0)
> (car args)))
> (X-extent (ly:stencil-extent (ly:grob-property grob 'stencil
> empty-stencil) X))
> (natural-length (- (cdr X-extent) (car X-extent))))
> (if (and (> minimum-length natural-length)
> (<= (length siblings) 1)) ;; never kill a broken extender
> (ly:grob-suicide! grob)))))
>
> \layout {
> \context {
> \Lyrics
> \override LyricExtender.minimum-length = #1
> \override LyricExtender.after-line-breaking =
> #(conditional-kill-lyric-extender-callback)
> }
> }
>
> autoextenders =
> #(define-music-function (lyrics) (ly:music?)
> (let* ((has-hyphen?
> (lambda (event)
> (let* ((art (ly:music-property event 'articulations))
> (is-hyphen? (lambda (ev) (eq? (ly:music-property ev
> 'name) 'HyphenEvent))))
> (find is-hyphen? art))))
> (has-extender?
> (lambda (event)
> (let* ((art (ly:music-property event 'articulations))
> (is-hyphen? (lambda (ev) (eq? (ly:music-property ev
> 'name) 'ExtenderEvent))))
> (find is-hyphen? art))))
> (add-extender!
> (lambda (event)
> (ly:music-set-property! event 'articulations
> (append (ly:music-property event 'articulations) (list
> (make-music 'ExtenderEvent))))
> event)))
> (music-map
> (lambda (event)
> (if (and (eq? (ly:music-property event 'name) 'LyricEvent)
> ; do not add extenders below hyphens
> (not (has-hyphen? event))
> ; do not duplicate extenders
> (not (has-extender? event))
> ; do not add additional extenders after _ (internally
> equivalent to " ")
> ; to avoid killed extenders
> (not (equal? (ly:music-property event 'text) " "))
> ; do not add extenders after "" to allow ending extenders
> ; within _ _ _ _ skip sequences with _ _ "" _ _
> (not (equal? (ly:music-property event 'text) ""))
> ; ditto, with _ _ \markup{|null} _ _
> (not (equal? (ly:music-property event 'text) (markup
> #:null)))
> )
> (add-extender! event))
> event)
> lyrics)))
>
> #(set! toplevel-music-functions
> (cons (lambda (music) (autoextenders music))
> toplevel-music-functions))
>
On Sat, Dec 23, 2023 at 10:39 AM Werner LEMBERG <[email protected]> wrote:
>
> > Often, multiple voices in a score have the same lyrics, or the
> > lyrics have repeating components (such as lines from a poem). Is
> > there a way to automatically add extender lines to melismata in the
> > lyrics?
>
> Examples, please, both a scan from a real-world example, and ideally
> some LilyPond code that demonstrates how you want to do it.
>
> Have you already checked our issues database? Maybe the problem is
> already filed.
>
> https://gitlab.com/lilypond/lilypond/-/issues
>
>
> Werner
>
>