Hello Vincent,

The first problem seems to be something internal to Lilypond. Basically the 
header markup seems to get called for the 0th page even though we don’t need 
it. But as only positive integers can be formatted as roman this causes a 
problem if the first bookpart is set to roman.

But we can easily fix this as shown in lines 37 and 39 in the fixed first 
example.

For your second problem: The code you are using is messing up the order of 
things. Basically it first performs the first-page check and then does the 
resetting stuff. This means that that if print-first-page-number is ##f the 
reset call is not evaluated on the first page. Apparently this fucks up this 
system. So the solution is to move the first page check after the reset part, 
as shown in lines 63-65 and 79-81 in the fixed second example.

Your third problem is basically a result from the same thing. Due to the order 
the first page check is done before resetting. This means that at the time the 
first page is checked it does not have page number 1. Changing the order again 
fixes this.

Cheers,
Valentin
\version "2.22.1"

#(define part-first-pages '(0))

#(define (part-first-page? layout props)
  (= (chain-assoc-get 'page:page-number props -1)
     (ly:output-def-lookup layout 'first-page-number)))

#(define (reset-part-first-page layout props arg)
"Returns page-number-string, starting every bookpart with page-number 0.
Relying on the extern defined `part-first-pages'.
"
  (set! props (prepend-alist-chain 'part-first-page '(0) props))

  (let* ((real-page-number (chain-assoc-get 'page:page-number props -1))
         (parts-page-number (- real-page-number (car part-first-pages))))

    (if (part-first-page? layout props)
        (set! part-first-pages (cons (1- real-page-number) part-first-pages)))

    (set! props
      (cons
        (list
          (cons 'page:page-number-string (number->string parts-page-number))
          (cons 'page:page-number parts-page-number))
        props))
    (interpret-markup layout props arg)))

#(define ((print-part-first-page-as-one number-type) layout props arg)

  (set! props
    (cons
      (list
        (cons 'page:page-number-string
              (let ((page-number
                     (chain-assoc-get 'page:page-number props -1)))
                ;(if (<= page-number 0) ""
                    (cond ((eq? number-type 'roman-lower)
                           (fancy-format #f "~(~@r~)" page-number))
                          ((eq? number-type 'roman-upper)
                           (fancy-format #f "~@r" page-number))
                          ((eq? number-type 'arabic)
                           (number->string page-number))
                          (else (number->string page-number)))));)
        (cons 'page:page-number
              (chain-assoc-get 'page:page-number props -1)))
      props))
  (interpret-markup layout props arg))

\paper {
  %first-page-number = #-3
  print-first-page-number = ##t
  oddMarkup =
  #(define-scheme-function (number-type)(symbol?)
    #{
      \markup
        \column {
          \fill-line {
            " "
            \on-the-fly #not-part-first-page \fromproperty #'header:instrument
              %% use in this order:
              \on-the-fly #reset-part-first-page
              \on-the-fly #(print-part-first-page-as-one number-type)
              \on-the-fly #print-page-number-check-first
              \fromproperty #'page:page-number-string
          }
          \vspace #5
        }
    #})

  evenMarkup =
  #(define-scheme-function (number-type)(symbol?)
    #{
      \markup
        \column {
          \fill-line {
              %% use in this order:
              \on-the-fly #reset-part-first-page
              \on-the-fly #(print-part-first-page-as-one number-type)
              \on-the-fly #print-page-number-check-first
              \fromproperty #'page:page-number-string
            \on-the-fly #not-part-first-page \fromproperty #'header:instrument
            " "
          }
          \vspace #5
        }
    #})

  oddFooterMarkup = \markup {
    \column {
      \fill-line {
            \concat {
              "real book number: "
            \on-the-fly #print-page-number-check-first
              \fromproperty #'page:page-number-string
          }
      }
      \fill-line {
        %% Copyright header field only on first page in each boob.
        \on-the-fly #part-first-page \fromproperty #'header:copyright
      }
      \fill-line {
        %% Tagline header field only on last page in the book.
        \on-the-fly #last-page \fromproperty #'header:tagline
      }
    }
  }
}


musique = \relative c'' { \repeat unfold 2 { d1 \pageBreak } }

\paper {
   print-first-page-number = ##f
}

\book {
   \bookpart {
     \paper {
       oddHeaderMarkup = \oddMarkup #'arabic
       evenHeaderMarkup = \evenMarkup #'arabic
     }
     \score {
       \musique
     }
   }
   \bookpart {
     \paper {
       oddHeaderMarkup = \oddMarkup #'arabic
       evenHeaderMarkup = \evenMarkup #'arabic
     }
     \score {
       \musique
     }
   }
}

\book {
   \bookpart {
     \paper {
       oddHeaderMarkup = \oddMarkup #'arabic
       evenHeaderMarkup = \evenMarkup #'arabic
     }
     \score {
       \musique
     }
   }
   \bookpart {
     \paper {
       oddHeaderMarkup = \oddMarkup #'arabic
       evenHeaderMarkup = \evenMarkup #'arabic
     }
     \score {
       \musique
     }
   }
}
\version "2.22.1"

#(define part-first-pages '(0))

#(define (part-first-page? layout props)
  (= (chain-assoc-get 'page:page-number props -1)
     (ly:output-def-lookup layout 'first-page-number)))

#(define (reset-part-first-page layout props arg)
"Returns page-number-string, starting every bookpart with page-number 0.
Relying on the extern defined `part-first-pages'.
"
  (set! props (prepend-alist-chain 'part-first-page '(0) props))

  (let* ((real-page-number (chain-assoc-get 'page:page-number props -1))
         (parts-page-number (- real-page-number (car part-first-pages))))

    (if (part-first-page? layout props)
        (set! part-first-pages (cons (1- real-page-number) part-first-pages)))

    (set! props
      (cons
        (list
          (cons 'page:page-number-string (number->string parts-page-number))
          (cons 'page:page-number parts-page-number))
        props))
    (interpret-markup layout props arg)))

#(define ((print-part-first-page-as-one number-type) layout props arg)

  (set! props
    (cons
      (list
        (cons 'page:page-number-string
              (let ((page-number
                     (chain-assoc-get 'page:page-number props -1)))
                (cond ((and (eq? number-type 'roman-lower) (> page-number 0))
                       (fancy-format #f "~(~@r~)" page-number))
                      ((and (eq? number-type 'roman-upper) (> page-number 0))
                       (fancy-format #f "~@r" page-number))
                      ((eq? number-type 'arabic)
                       (number->string page-number))
                      (else (number->string page-number)))))
        (cons 'page:page-number
              (chain-assoc-get 'page:page-number props -1)))
      props))
  (interpret-markup layout props arg))

\paper {
  %first-page-number = #-3
  print-first-page-number = ##t
  oddMarkup =
  #(define-scheme-function (number-type)(symbol?)
    #{
      \markup
        \column {
          \fill-line {
            " "
            \on-the-fly #not-part-first-page \fromproperty #'header:instrument
            \on-the-fly #print-page-number-check-first
              %% use in this order:
              \on-the-fly #reset-part-first-page
              \on-the-fly #(print-part-first-page-as-one number-type)
              \fromproperty #'page:page-number-string
          }
          \vspace #5
        }
    #})

  evenMarkup =
  #(define-scheme-function (number-type)(symbol?)
    #{
      \markup
        \column {
          \fill-line {
            \on-the-fly #print-page-number-check-first
              %% use in this order:
              \on-the-fly #reset-part-first-page
              \on-the-fly #(print-part-first-page-as-one number-type)
              \fromproperty #'page:page-number-string
            \on-the-fly #not-part-first-page \fromproperty #'header:instrument
            " "
          }
          \vspace #5
        }
    #})

  oddFooterMarkup = \markup {
    \column {
      \fill-line {
            \concat {
              "real book number: "
            \on-the-fly #print-page-number-check-first
              \fromproperty #'page:page-number-string
          }
      }
      \fill-line {
        %% Copyright header field only on first page in each boob.
        \on-the-fly #part-first-page \fromproperty #'header:copyright
      }
      \fill-line {
        %% Tagline header field only on last page in the book.
        \on-the-fly #last-page \fromproperty #'header:tagline
      }
    }
  }
}


musique = \relative c'' { \repeat unfold 2 { d1 \pageBreak } }

\book {
   \bookpart {
     \paper {
       oddHeaderMarkup = \oddMarkup #'roman-lower
       evenHeaderMarkup = \evenMarkup #'roman-lower
     }
     \score {
       \musique
     }
   }
   \bookpart {
     \paper {
       oddHeaderMarkup = \oddMarkup #'arabic
       evenHeaderMarkup = \evenMarkup #'arabic
     }
     \score {
       \musique
     }
   }
}

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to