\version "2.12.3" % to be defined in a closure later (see toc-init.ly) #(define-public (add-foot-item! dir text) #f) #(define-public (foot-items) #f) % define add item and get list functions #(let ((foot-item-list (list))) (set! add-foot-item! (lambda (dir gauge short text) (let ((label (gensym "foot"))) (set! foot-item-list (cons (cons label text) foot-item-list)) (make-music 'SequentialMusic 'elements (list (make-music 'EventChord 'page-marker #t 'page-label label 'elements (list (make-music 'LabelEvent 'page-label label) (make-music 'TextScriptEvent 'direction dir 'text (markup #:concat ( short #:super #:fosterisk label gauge))))) ))))) (set! foot-items (lambda () (reverse foot-item-list)))) % conditionally add text markup, if we are on the right page #(define (runfi pagelist cur-page table label text) (let ((label-page (and (list? table) (assoc label table)))) (if (and label-page (= cur-page (cdr label-page))) (markup pagelist #:fostermark label text) pagelist ) ) ) % define markup command to be used in footer- or header-markup % delayed stencil-evaluation like in page-ref - so we know the pagenumber of the label and the current page % needs 'gauge'-stencil --- is hardcoded right now #(define-markup-command (footer-items layout props reserve)(number?) "markup footer items" (let* ((line-width (- (ly:output-def-lookup layout 'line-width) reserve)) (gauge-stencil (interpret-markup layout props (markup #:super "*" "X" #:draw-line (cons line-width 0) ))) (x-ext (ly:stencil-extent gauge-stencil X)) (y-ext (ly:stencil-extent gauge-stencil Y))) (ly:make-stencil `(delay-stencil-evaluation ,(delay (ly:stencil-expr (let* ((table (ly:output-def-lookup layout 'label-page-table)) (cur-page 0) (pagelist (markup))) ;;(display "run footeritems\n") (set! cur-page (chain-assoc-get 'page:page-number props -1)) (map (lambda (fn) (let ((label (car fn)) (text (cdr fn))) (set! pagelist (runfi pagelist cur-page table label text)) ) ) (foot-items)) (interpret-markup layout props (markup pagelist)) ) ) )) x-ext y-ext))) #(define-public smulti (lambda (n r b) (begin (if (> n 0)(set! r (string-append r b))) (set! n (- n 1)) (if (> n 0)(set! r (smulti n r b))) r))) #(define-markup-command (fosterisk layout props label gauge)(symbol? markup?) "markup footer asterisk" (let* ((gauge-stencil (interpret-markup layout props (markup gauge))) (x-ext (ly:stencil-extent gauge-stencil X)) (y-ext (ly:stencil-extent gauge-stencil Y))) (ly:make-stencil `(delay-stencil-evaluation ,(delay (ly:stencil-expr (let* ((table (ly:output-def-lookup layout 'label-page-table)) (cur-page (cdr (and (list? table) (assoc label table)))) (pagecount 0) (fossi "")) ;;(display "run fosterisk\n") (map (lambda (fn) (let ((lab 'foot00) (pag 0)) (set! lab (car fn)) (set! pag (and (list? table) (assoc lab table))) (if (and pag (= (cdr pag) cur-page)) (set! pagecount (+ pagecount 1))) (if (eq? label lab) (set! fossi (smulti pagecount "" "*"))) ;;(display "loop fosterisk\n") ) ) (foot-items)) (interpret-markup layout props (markup fossi)) ) ) )) x-ext y-ext))) #(define-markup-command (fostermark layout props label)(symbol?) (let* ((table (ly:output-def-lookup layout 'label-page-table)) (cur-page (cdr (and (list? table) (assoc label table)))) (pagecount 0) (fossi "")) ;;(display "run fostermark\n") (map (lambda (fn) (let ((lab 'foot00) (pag 0)) (set! lab (car fn)) (set! pag (and (list? table) (assoc lab table))) (if (and pag (= (cdr pag) cur-page)) (set! pagecount (+ pagecount 1))) (if (eq? label lab) (set! fossi (smulti pagecount "" "*"))) ;;(display "loop fostermark\n") ) ) (foot-items)) (interpret-markup layout props (markup fossi)) )) % the footnote function % takes direction (UP/DOWN) and markup % other layout properties can be set via [\once] \override TextScript #'... = ... addfoot = #(define-music-function (parser location dir gauge text)(integer? string? markup?) (begin (add-foot-item! dir (markup gauge) (markup #:null) text) )) addfootD = #(define-music-function (parser location dir gauge short text)(integer? string? markup? markup?) (begin (add-foot-item! dir (markup gauge) short text) )) #(define (not-part-first-page layout props arg) (if (= (chain-assoc-get 'page:page-number props -1) (ly:output-def-lookup layout 'first-page-number)) empty-stencil (interpret-markup layout props arg))) \paper { #(set-paper-size "a5" 'landscape) oddHeaderMarkup = \markup \fill-line { \on-the-fly #not-part-first-page \concat { \fromproperty #'header:composer ", " \bold \fromproperty #'header:title } } evenHeaderMarkup = \markup \fill-line { \on-the-fly #not-part-first-page \concat { \fromproperty #'header:composer ", " \bold \fromproperty #'header:title } } oddFooterMarkup = \markup { \fill-line { % fill in footer-items \footer-items #(* (magstep mm) 6) \fromproperty #'page:page-number-string } } evenFooterMarkup = \markup { \fill-line { \fromproperty #'page:page-number-string % fill in footer-items \footer-items #(* (magstep mm) 6) } } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % some really boaring music with \addfoot notenA = \relative c' { \addfoot #UP #"**" \markup { "The C in the beginning is not confirmed!" } \repeat unfold 24 { c d e f } \once \override TextScript #'self-alignment-X = #-0.7 \addfootD #UP #"**" \markup { "go on" } \markup { "This is started very fast on G" } { g( f e d) } \repeat unfold 23 { c d e f } \bar "|." } \bookpart { \header { title = "title" composer = "composer" } \score { \new Staff \new Voice { \notenA } \header { piece = "first" } } \score { \relative c' { \repeat unfold 10 { c d e f } \addfoot #0 #"*" \markup { "Test3" } \repeat unfold 10 { c d e f } \bar "|." } \header { piece = "second" } } } remark = { \addfoot #UP #"**" \markup { \italic "another odd tone" } } \bookpart { \header { title = "Really boaring!!!!" composer = "James the Chordbreaker" } \score { \new StaffGroup << \new Staff \new Voice = "voc" { \relative c' { \repeat unfold 10 { c d e f } % override TextScript properties to move the number \once \override TextScript #'self-alignment-X = #RIGHT \once \override TextScript #'X-offset = #2 \once \override TextScript #'extra-offset = #'(0 . -0.6) \addfoot #DOWN #"**" \markup { \italic "mi = \"la\" in ancient ork" } \repeat unfold 4 { c d e f } \bar "|." } } \new Lyrics \lyricsto "voc" \lyricmode { \repeat unfold 10 { la la la la } \repeat unfold 4 { mi mi mi mi } } \new Staff \new Voice { \relative c' \repeat unfold 10 { e f g a } \relative c' \repeat unfold 4 { \remark b' f g a } %\relative c' \repeat unfold 6 { b' f g a } } >> \header { piece = "third" } } }