2011/1/18 Marc Hohl <m...@hohlart.de>: > Am 15.01.2011 21:51, schrieb Neil Puttock: >> >> On 15 January 2011 19:01, Marc Hohl<m...@hohlart.de> wrote: >> >>> Now I wonder whether it is possible to create a kind of text book by >>> including the lyrics in a markup, perhaps with a scheme function which >>> replaces the " -- " by "". >>> >>> Is it possible to store the text in a variable? >> >> [...] >> >> For simplicity I've ignored hyphens, but it shouldn't be too difficult >> to add them (or use their position in the list of strings to restore >> the hyphenated words). > > This is what I got so far: > > \version "2.13.46" > > words = \lyricmode { This is my ex -- am -- ple text } > > #(define (lyrics->list lyrics) > "Return a flat list containing all syllables and hyphens from > @code{lyrics}." > (let ((extracted-list > (if (ly:music? lyrics) > (if (memq (ly:music-property lyrics 'name) '(LyricEvent > HyphenEvent)) > (begin (if (eq? (ly:music-property lyrics 'name) > 'LyricEvent) > (list (ly:music-property lyrics 'text)) > (list "--"))) > (let ((elt (ly:music-property lyrics 'element)) > (elts (ly:music-property lyrics 'elements))) > (if (ly:music? elt) > (lyrics->list elt) > (if (null? elts) > '() > (map (lambda(x) > (lyrics->list x)) > elts))))) > '()))) > (flatten-list extracted-list))) > > > text = #(lyrics->list words) > > melody = \relative c' { c4 d e f | g a c2 } > > \new Voice { \melody } > \addlyrics { \words } > > #(markup* (make-line-markup text)) > > The function liyrics->list extracts the syllables and the hyphens.
Cool! > > The second part (eliminating the hyphens in the list and concatenate the > surrounding > syllables) seems a bit harder, but I try to find a solution. That's a nice scheme exercise... The following would work (but not if there are consecutive hyphens) #(define (reduce-hyphens text) ;; Define initial first-word 'wd' and remaining-words 'wds' (let eat ((wd (car text)) (wds (cdr text))) (cond ;; Last syllable reached: Terminate recursion ((null? wds) (list wd)) ((and (equal? "--" (car wds)) (not (null? (cdr wds)))) ;; The first remaining word is a hyphen AND there is a syllable after that ;; Concatenate that syllable onto wd, and recurse (eat (string-concatenate (list wd (cadr wds))) (cddr wds))) ;; Not a hyphen, just use wd as the first word on the list, and then recurse. (else (cons wd (eat (car wds) (cdr wds))))))) #(define (lyrics->text lyrics) (reduce-hyphens (lyrics->list lyrics))) text = #(lyrics->text words) Cheers Jakob. > > Regards, > > Marc > > _______________________________________________ > lilypond-user mailing list > lilypond-user@gnu.org > http://lists.gnu.org/mailman/listinfo/lilypond-user > _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org http://lists.gnu.org/mailman/listinfo/lilypond-user