2011/1/18 Marc Hohl <[email protected]>:
> Am 15.01.2011 21:51, schrieb Neil Puttock:
>>
>> On 15 January 2011 19:01, Marc Hohl<[email protected]> 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
> [email protected]
> http://lists.gnu.org/mailman/listinfo/lilypond-user
>
_______________________________________________
lilypond-user mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-user