\version "2.22.2" #(define (symbol-or-false-or-procedure? x) (or (symbol? x) (not x) (procedure? x))) % An alist for saving predefined comparator functions. Could just define them and pass a reference, but this way might be a bit cleaner. #(define orderings (list (cons 'lex-by-text (lambda (item1 item2) (let ((mkup1 (assoc-get 'text (cdr item1))) (mkup2 (assoc-get 'text (cdr item2)))) (stringstring mkup1) (markup->string mkup2))))))) %% Copied from LilyPond's definition and modified % @param filterfn can be % A) A symbol (filter on label == filterfn) % B) A procedure (filter on (filterfn tocitem)) % C) #f (Do not filter) % @param cmp can be % A) A symbol (use predefined procedure from orderings alist) % B) A procedure (sort using (cmp tocitem1 tocitem2)) % C) #f (Do not sort) #(define-markup-list-command (filtered-ordered-table-of-contents layout props filterfn cmp) (symbol-or-false-or-procedure? symbol-or-false-or-procedure?) #:properties ((baseline-skip)) (if (symbol? cmp) (set! cmp (assoc-get cmp orderings cmp))) (if (symbol? cmp) (ly:error "Predefined ordering ~a does not exist" cmp)) (let* ((titleMarkup (ly:output-def-lookup layout 'tocTitleMarkup)) (indentMarkup (ly:output-def-lookup layout 'tocIndentMarkup)) (toplevelFormatter (ly:output-def-lookup layout 'tocFormatMarkup)) (toc-alist (toc-items)) (filtered-toc-alist (if filterfn (if (symbol? filterfn) (filter (lambda (item) (eq? filterfn (assoc-get 'name (cdr item)))) toc-alist) (filter filterfn toc-alist)) toc-alist)) (sorted-toc-alist (if cmp (sort filtered-toc-alist cmp) filtered-toc-alist))) (ly:output-def-set-variable! layout 'label-alist-table (append (ly:output-def-lookup layout 'label-alist-table) toc-alist)) (cons (interpret-markup layout props titleMarkup) (space-lines baseline-skip (map (lambda (toc-item) (let* ((label (car toc-item)) (alist (cdr toc-item)) (toc-markup (assoc-get 'toc-markup alist)) (text (assoc-get 'text alist)) (level (assoc-get 'level alist))) (interpret-markup layout (cons (list (cons 'toc:page (markup #:with-link label #:page-ref label "XXX" "?")) (cons 'toc:text (markup #:with-link label text)) (cons 'toc:label label) (cons 'toc:level level) (cons 'toc:toplevel-formatter toplevelFormatter) (cons 'toc:indent (make-line-markup (make-list level indentMarkup)))) props) (ly:output-def-lookup layout toc-markup)))) sorted-toc-alist))))) \markup \fill-line { " " \fontsize #6 "Index by name" " " } \markuplist \filtered-ordered-table-of-contents #'title #'lex-by-text \markup \fill-line { " " \fontsize #6 "Index by lyrics" " " } \markuplist \filtered-ordered-table-of-contents #'first-lyrics #'lex-by-text \tocItem #'title \markup "Abraham ate an apple" \tocItem #'first-lyrics \markup "O behold how marvellous" { c' } \pageBreak \tocItem #'title \markup "Cesar’s chatting computer" \tocItem #'first-lyrics \markup "All of this works, splendid!" { c' } \pageBreak \tocItem #'title \markup "Ernest’s eery emu" \tocItem #'first-lyrics \markup "I do not want to brag, but this is quite a thing!" { c' } \pageBreak \tocItem #'title \markup "Flying Fools frolicking funnily" \tocItem #'first-lyrics \markup "How many pieces are there left, exactly?" { c' } \pageBreak \tocItem #'title \markup "Hernado held his hands high" \tocItem #'first-lyrics \markup "Really I’m starting to loose inspiration for these lyrics!" { c' } \pageBreak \tocItem #'title \markup "Good Geese giggling" \tocItem #'first-lyrics \markup "Three more to go, come on, you can do it!" { c' } \pageBreak \tocItem #'title \markup "Beethoven broke Bach’s Biathlon-Record" \tocItem #'first-lyrics \markup "Um ... Row, row, row your boat?" { c' } \pageBreak \tocItem #'title \markup "Did not expect this, did you?" \tocItem #'first-lyrics \markup "I’m so glad I’m FINALLY done with this ..." { c' }