diff --git a/private_includes/book/book_include.ily b/private_includes/book/book_include.ily index 9b8b9a7..43f80e2 100644 --- a/private_includes/book/book_include.ily +++ b/private_includes/book/book_include.ily @@ -216,6 +216,12 @@ songs = (end (if (null? (cdr chs)) total (cdadr chs))) (cnt (count-bookmark-songs start end))) (loop (cdr chs) (cons (list start title cnt) acc)))))) + ;; Aktuell aktives Kapitel (Titel-String) waehrend des Durchlaufs. Wird + ;; gesetzt, sobald ein Kapitel aktiviert (aus `pending` entfernt) wird -- + ;; egal ob auf einer Seite (chapter-prefixed-markup) oder auf dem ersten + ;; Song. Jeder danach folgende Song erhaelt dieses Kapitel als + ;; chapterref-Header-Feld, woraus toc_include.ily den Kapitel-Index baut. + (current-chapter #f) ;; Stellt einer beliebigen Seite (markup-/image-/emptyPage) den Kapitel- ;; Eintrag (chapter-to-pdf-toc) bei, falls an Position `this-index` ein ;; Kapitel faellig ist, und entfernt es aus `pending`. So fuehrt die @@ -230,6 +236,7 @@ songs = (let ((cnt (caddr (car pending))) (title (cadr (car pending)))) (set! pending (cdr pending)) + (set! current-chapter title) (make-combine-markup base-markup (make-with-dimensions-markup '(0 . 0) '(0 . 0.1) @@ -275,18 +282,25 @@ songs = (chaptertitle (if (and (pair? pending) (<= (car (car pending)) this-index)) (cadr (car pending)) #f)) (chaptercount (if chaptertitle (caddr (car pending)) 0)) + ;; Startet das Kapitel erst auf diesem Song (nicht schon auf + ;; einer vorangehenden Seite), wird current-chapter jetzt + ;; gesetzt und pending entfernt -- vor dem Bau des Headers, + ;; damit chapterref bereits das neue Kapitel enthaelt. + (_ (if chaptertitle + (begin (set! current-chapter chaptertitle) + (set! pending (cdr pending))))) (header #{ \bookpart { $(assq-ref songvars 'header) \header { songfilename = $(symbol->string filename) myindexlabel = #(assq-ref songvars 'label) songnumber = #(number->string newnumber) chaptertitle = #chaptertitle chaptercount = #chaptercount + chapterref = #current-chapter } } #}) (music (assq-ref songvars 'music)) (layout (assq-ref songvars 'layout)) (text-pages (assq-ref songvars 'text-pages)) (label (assq-ref songvars 'label))) - (if chaptertitle (set! pending (cdr pending))) (set! song-number newnumber) #{ \bookpart { diff --git a/private_includes/book/toc_include.ily b/private_includes/book/toc_include.ily index d9c2611..a79ae29 100644 --- a/private_includes/book/toc_include.ily +++ b/private_includes/book/toc_include.ily @@ -132,6 +132,37 @@ author-index-hash) (lambda (a b) (string-cisymbol chapter)) + (existing (hashq-ref chapter-index-hash chaptersym #f)) + (chapterlist (or existing + (begin + (set! chapter-order (cons chaptersym chapter-order)) + (list (list label 'indexChapterMarkup `(((combine-with-next . #t) (rawtext . ,chapter)))))))) + ) + (hashq-set! chapter-index-hash chaptersym + (cons (list label markup-symbol textoptions) chapterlist))) + (make-music 'EventChord + 'page-marker #t + 'page-label label + 'elements (list (make-music 'LabelEvent + 'page-label label))))) + (set! chapter-index-items (lambda () + (append-map (lambda (chaptersym) (reverse (hashq-ref chapter-index-hash chaptersym (list)))) + (reverse chapter-order))))) + #(define-markup-command (with-link-symbol-ref layout props symbol arg) (symbol? markup?) @@ -215,6 +246,11 @@ (make-null-markup)) \vspace #.4 } + indexChapterMarkup = \markup \override #'(baseline-skip . 1.5) \left-column { + \vspace #1 + \sans \bold \fontsize #3 \fromproperty #'index:text + \vspace #.4 + } } #(define (prepare-item-markup items layout) @@ -247,7 +283,8 @@ (let ((items (case index-type ((alphabetical) index-items) ((categories) category-index-items) - ((authors) author-index-items))) + ((authors) author-index-items) + ((chapters) chapter-index-items))) (title (interpret-markup layout props title-markup))) (cons title (interpret-markup-list layout props @@ -294,7 +331,7 @@ headerToTOC = #(define-music-function (parser location header label) (ly:book? s )) (let* ( - (extractedheadervars (extract-and-check-vars-from-header header '(title starttext alttitle categorytitle categories authors songnumber))) + (extractedheadervars (extract-and-check-vars-from-header header '(title starttext alttitle categorytitle categories authors songnumber chapterref))) (title (assq-ref extractedheadervars 'title)) (starttext (assq-ref extractedheadervars 'starttext)) (alttitle (assq-ref extractedheadervars 'alttitle)) @@ -302,12 +339,14 @@ headerToTOC = #(define-music-function (parser location header label) (ly:book? s (categories (assq-ref extractedheadervars 'categories)) (authors (assq-ref extractedheadervars 'authors)) (songnumber (assq-ref extractedheadervars 'songnumber)) + (chapterref (assq-ref extractedheadervars 'chapterref)) (textoptions (lambda (text alternative) `(((rawtext . ,text) (alternative . ,alternative) (songnumber . ,songnumber))))) (add-to-toc! (lambda (toctitle alternative) (add-index-item! 'indexItemMarkup (textoptions toctitle alternative) toctitle label))) ) (if categories (add-category-index-item! (string-tokenize categories) 'indexItemMarkup (textoptions (if categorytitle categorytitle title) #f) label)) (if authors (add-author-index-item! (all-author-ids authors) 'indexItemMarkup (textoptions (if categorytitle categorytitle title) #f) label)) + (if chapterref (add-chapter-index-item! chapterref 'indexItemMarkup (textoptions (if categorytitle categorytitle title) #f) label)) (if starttext (add-to-toc! starttext #t)) (if alttitle (if (list? alttitle)