Hi,
ich möchte die Funktion aus diesem Thread (https://lilypondforum.de/index.php/topic,629.0.html) um eine Variable erweitern, die bestimmte Bookparts wahlweise weglässt.
Dazu habe ich den Code folgendermaßen modifiziert:
\version "2.20.0"
\language "deutsch"
test =
#(define-music-function (p)
(ly:pitch?)
#{
\new Staff \transpose c $p \relative c'' { cis e g }
#})
xtest =
#(define-scheme-function (p q) (ly:pitch? ly:pitch?)
(scorify-music (test p)))
#(define (make-book-parts-with-top-markup markup scores)
(let* ((output-def (ly:make-output-def))
(raw-paper
(begin
(ly:output-def-set-variable! output-def 'is-paper #t)
output-def))
(bp #{ \bookpart { $raw-paper } #}))
(for-each
(lambda (score) (ly:book-add-score! bp score))
(cons (list markup) scores))
bp))
#(define (fill-book-part-paper! bookpart key-value-alist)
(for-each
(lambda (key-value)
(ly:output-def-set-variable!
(ly:book-paper bookpart) (car key-value) (cdr key-value)))
key-value-alist))
#(define-markup-command (my-header layout props p text1 text2)
(ly:pitch? string? string?)
(interpret-markup layout props
#{
\markup
\fill-line
{
\null
\rounded-box \concat { $text1 $text2 }
\null
}
#}))
#(define (add-bookparts-to-toplevel-bookparts pitch mitvier)
(let* ((bk (ly:make-book $defaultpaper $defaultheader '()))
(my-titel
#{ \markup \my-header ##{ $pitch #} "Kadenzen " "-Dur" #})
(paper-kadenzen #{ \paper { line-width = 120 ragged-right = ##f } #})
(paper-dreiklang #{ \paper { top-markup-spacing.padding = 40 } #})
(paper-vierklang #{ \paper { top-markup-spacing.padding = 20 } #})
(bk-parts
(list
(make-book-parts-with-top-markup
my-titel
(list (xtest pitch pitch)))
(make-book-parts-with-top-markup
my-titel
(list (xtest pitch pitch) (xtest #{ d #} pitch)))
(if mitvier
(make-book-parts-with-top-markup
my-titel
(list (xtest pitch pitch) (xtest #{ d #} pitch)))
'())
)))
(for-each
(lambda (book-part key-values)
(fill-book-part-paper! book-part key-values))
bk-parts
(map
(lambda (paper)
(ly:module->alist (ly:output-def-scope paper)))
(list paper-kadenzen)))
(for-each
(lambda (book-part)
(ly:parser-define! 'toplevel-bookparts
(cons book-part (ly:parser-lookup 'toplevel-bookparts))))
bk-parts)))
myBookparts =
#(define-void-function (mus mit) (ly:music? boolean?)
(let ((pitches (music-pitches mus)))
(for-each
(lambda (pitch) (add-bookparts-to-toplevel-bookparts pitch mit))
pitches)))
Das folgende funktioniert mit diesem Code:
\myBookparts < des as > ##t
Sobald ich den Parameter auf ##f setze, stürzt Lilypond ab
\myBookparts < des as > ##f
Parsing...
Wurde mit dem Return-Code -1073741819 beendet.
Wenn ich den else-Zweig mit einer Leerseite auffülle, funktioniert es. Wie muss der Code beschaffen sein, damit er auch ohne zusätzliche Leerseite funktioniert?