Hello
Here are some improvements that I did awhile ago. Maybe it's useful.
Best regards
Torulf
\version "2.14.1"
%
% Definitions for vowel alignment
% This code snippet have been sponsored by the Vadstena Sisters in Sweden
%
#(define vowel-set (list->char-set (string->list "AEIOUYÅÄÖaeiouyåäö")))
#(define (width grob text-string)
(let* ((layout (ly:grob-layout grob))
(props (ly:grob-alist-chain grob (ly:output-def-lookup layout 'text-font-defaults))))
(cdr (ly:stencil-extent (ly:text-interface::interpret-markup layout props (markup text-string)) X))))
#(define (center-on-vowel grob)
(let* ((syllable (ly:grob-property-data grob 'text))
(letter-count (string-length syllable))
(vowel-count (string-count syllable vowel-set))
(note-width (interval-length (ly:grob-property (ly:grob-parent grob X) 'X-extent))))
(if (or (= letter-count 1) (= letter-count 0) (= vowel-count 0))
(let* ((syllable-width (width grob syllable)))
(/ (- note-width syllable-width) 2))
(let* ((vowel-position (string-index syllable vowel-set))
(prevowel (substring syllable 0 vowel-position))
(vowel (if (= (char->integer (string-ref syllable vowel-position)) 195) ; swedish letters take up two characters!
(substring syllable vowel-position (+ vowel-position 2))
(substring syllable vowel-position (+ vowel-position 1))))
(prevowel-width (width grob prevowel))
(vowel-width (width grob vowel)))
(- (/ (- note-width vowel-width) 2) prevowel-width)))))
%
% Example
%
chant = {
\relative c'' {
g4 a4( c4) c4 c4( b4) a4 b4 c4 d2
}
}
words = \lyricmode {
I di -- na hän -- der, Her -- re Gud,
}
\score {
\new Staff
<<
\new Voice = "melody" \chant
\new Lyrics \lyricsto "melody" \words
>>
\layout {
\context { \Lyrics
\override LyricText #'X-offset = #center-on-vowel
}
}
}