\version "2.19.25" #(define ls (list)) #(define (reset-part-first-page layout props arg) (let* ((actual-book-page (chain-assoc-get 'page:page-number props -1)) (actual-part-first-page (ly:output-def-lookup layout 'first-page-number 1)) (reset-part-first-page-number (ly:output-def-lookup layout 'reset-part-first-page-number #f)) (new-props (if reset-part-first-page-number (prepend-alist-chain 'page:page-number-string (number->string ;; In case `reset-part-first-page-number' was set #t, do some ;; calculation to put out every bookpart starting with ;; page-number 1, increasing the follow page-numbers ;; ;; Otherwise we try to find a list of page-settings, probably ;; stored in `reset-part-first-page-number'. ;; If found, we choose the appropiate entry and do some ;; calculations to put out this entry as the new ;; bookparts-first-page-number, with incresing follow ups. (if (boolean? reset-part-first-page-number) (- actual-book-page (1- actual-part-first-page)) (begin ;; `ls' is defined in \paper ;; accumulate there every part-first-page, if not ;; already present. (if (or (null? ls) (not (= (car ls) actual-part-first-page))) (set! ls (cons actual-part-first-page ls))) ;; (length ls) shows us how many bookparts are present ;; at the state of current compilation. ;; Therefore we can use (length ls) to choose which ;; element of `reset-part-first-page-number' should be ;; taken for the new book-part-first-page-number. ;; list-ref starts with 0, therefore we do 1- ;; As a fall-back, put out the real `actual-book-page' (if (or (< (length reset-part-first-page-number) (length ls)) (null? ls)) actual-book-page (let ((bookpart-new-first-page (list-ref reset-part-first-page-number (1- (length ls))))) ;; Put out `actual-book-page', if a boolean was ;; catched from `reset-part-first-page-number' (if (boolean? bookpart-new-first-page) actual-book-page (+ (- actual-book-page actual-part-first-page) bookpart-new-first-page))))))) props) props))) (interpret-markup layout new-props arg))) \paper { %% This list may contain booleans, to get default page-counting for a certain %% bookpart reset-part-first-page-number = #'(1 60 17 613 41) oddHeaderMarkup = \markup \fill-line { " " \on-the-fly #print-page-number-check-first \on-the-fly #reset-part-first-page \fromproperty #'page:page-number-string } evenHeaderMarkup = \markup \fill-line { \on-the-fly #print-page-number-check-first \on-the-fly #reset-part-first-page \fromproperty #'page:page-number-string " " } } %%%%%%%%%%%%%%%%%% %% EXAMPLE %%%%%%%%%%%%%%%%%% #(set-default-paper-size "a6") \book { \markuplist \table-of-contents \pageBreak \markup "Prolog" \bookpart { \markup "first bookpart" \tocItem "first bookpart" \repeat unfold 3 { c''1 \pageBreak } } \bookpart { \markup "second bookpart" \tocItem "second bookpart" \repeat unfold 2 { d''1 \pageBreak } } \bookpart { \markup "third bookpart" \tocItem "third bookpart" \repeat unfold 4 { e''1 \pageBreak } } \bookpart { \markup "fourth bookpart" \tocItem "fourth bookpart" \repeat unfold 5 { f''1 \pageBreak } } }