Le 02/11/2021 à 16:23, R. Padraic Springuel a écrit :
On Oct 31, 2021, at 6:02 PM, David Kastrup <d...@gnu.org> wrote:
If the ugliness of juxtaposition is ok, you may use things like
\,\man
for concatenating stuff, too.
What about event functions? Can a command which does the concatenation be
written as an event function so that the juxtaposition isn’t needed? (I’ve
never written an event function and the extending manual doesn’t provide much
info about their capabilities/limitations.)
The difference between a music function and an
even function is that the return type of an event
function is narrower -- it must return something
suitable as a post-event, such as \p, -., \marcato,
etc. This brings syntax flexibility in the case
where a note is immediately followed by the application
of an event function. The handling of arguments remains
the same. It does not help here.
Since you ask about this again, here is some code that
I wrote when you asked the first time. It post-processes
the lyrics to squash punctuation with the previous lyric
event. I had abandoned it because it was getting complex.
Try it and see how it fares -- it has not been extensively
tested.
\version "2.22.1"
#(use-modules (ice-9 regex))
#(define punctuation (make-regexp "^[.,;:?!]+$"))
magneticPunctuation =
#(define-music-function (music) (ly:music?)
(for-some-music
(lambda (m)
(let ((elts (ly:music-property m 'elements)))
(if (pair? elts)
(let loop ((e elts)
(last-lyric #f)
(acc '()))
(if (null? e)
(ly:music-set-property! m 'elements (reverse! acc))
(let ((next (car e)))
(cond
((and (music-is-of-type? m 'sequential-music)
(music-is-of-type? next 'sequential-music))
; #{ \lyricmode { ... } #} yields sequential music,
; so flatten it.
(loop (append (ly:music-property next 'elements)
(cdr e))
last-lyric
acc))
((and last-lyric
(music-is-of-type? next 'lyric-event))
(let ((previous-text (ly:music-property
last-lyric 'text))
(next-text (ly:music-property next 'text)))
(if (and (string? previous-text)
(string? next-text)
(regexp-match? (regexp-exec
punctuation next-text)))
(let ((new
(make-music 'LyricEvent
last-lyric
'text
(string-append
previous-text
next-text))))
(loop (cdr e)
new
(cons new (delq1! last-lyric acc))))
(loop (cdr e)
next
(cons next acc)))))
((music-is-of-type? next 'lyric-event)
(loop (cdr e)
next
(cons next acc)))
((equal? ZERO-MOMENT (ly:music-length next))
(loop (cdr e)
last-lyric
(cons next acc)))
(else
(loop (cdr e)
#f
(cons next acc)))))))))
#f)
music)
music)
gender = "other"
man =
#(cond
((equal? gender "male") #{ \lyricmode { man } #})
;((equal? gender "female") #{ \lyricmode{ error } #})
((equal? gender "plural") #{ \lyricmode { men } #})
(else
#{
\lyricmode {
\override Lyrics.LyricText.font-shape = #'italic
man/men
\revert Lyrics.LyricText.font-shape
}
#}))
music = { c' c' c' c' c' c' c' c' c' c' c' }
verseI = \lyricmode {
In glad re -- mem -- brance of this ho -- ly \man, \skip 4
Who sought to fol -- low you in faith and love.
}
\magneticPunctuation \new Staff
<<
\new Voice = "mel" { \music \music }
\new Lyrics \lyricsto "mel" { \verseI }
>>
Regards,
Jean