Am Do., 15. Feb. 2024 um 19:16 Uhr schrieb Hwaen Ch'uqi <hwaench...@gmail.com>:
>
> Greetings,
>
> Until upgrading to 2.24, I had been using certain Scheme code and
> \paper block layouts in order to output books consisting of prefatory
> material with Roman numeral page numbers and the music itself with
> Arabic page numbers. When I upgraded one such file to 2.24.3 using
> convert-ly, the result was puzzling. The actual page numbering is
> correct - ten pages of either invisible or Roman numerals followed by
> Arabic numerals starting on page 1. However, the Table of Contents
> shows Arabic numerals from the beginning, so that the first page of
> actual music is 11. I am not sure what to present as an MWE; I am
> guessing that the Scheme code and \paper blocks should suffice. The
> original was laid out as follows:
>
> %%% roman numeral page numbers
> #(define begin-arabic 11)
>
> %% The following is an adaptation of a function found in
> `define-markup-commands.scm' which is used to create tables of
> contents. An offset to the Arabic numerals has been incorporated so
> that the first page of the music is 1.
> #(define-markup-command (page-ref layout props label gauge default)
>   (symbol? markup? markup?)
>   #:category other
>   "
> @cindex referencing page numbers in text
>
> Reference to a page number.  @var{label} is the label set on the referenced
> page (using the @code{\\label} command), @var{gauge} a markup used to estimate
> the maximum width of the page number, and @var{default} the value to display
> when @var{label} is not found."
>   (let* ((gauge-stencil (interpret-markup layout props 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))
>                        (page-number (if (list? table)
>                                         (assoc-get label table)
>                                         #f))
>                        (page-markup
>                          (if page-number
>                              (if (< page-number begin-arabic)
>                                  (format #f "~(~@r~)" page-number) ;
> Roman numerals
>                                  ; Arabic numerals, but offset to begin on 1
>                                  (format #f "~a" (- (1+ page-number)
> begin-arabic)))
>                              default))
>                        (page-stencil (interpret-markup layout props
> page-markup))
>                        (gap (- (interval-length x-ext)
>                                (interval-length (ly:stencil-extent
> page-stencil X)))))
>                   (interpret-markup layout props
>                                     (markup #:concat (#:hspace gap
> page-markup)))))))
>      x-ext
>      y-ext)))
>
> #(define-markup-command (roman-numeral-page-number layout props) ()
>   (let ((page-number (chain-assoc-get 'page:page-number props -1)))
>     (interpret-markup layout props
>       (if (> page-number 0) ; only positive integers can be `romanized'
>           (format #f "~(~@r~)" page-number)
>           (chain-assoc-get 'page:page-number-string props -1)))))
>
> #(define-markup-command (offset-page-number layout props offset) (integer?)
>   (let ((page-number (chain-assoc-get 'page:page-number props -1)))
>     (interpret-markup layout props
>       (format #f "~a" (- page-number offset)))))
>
> #(define (part-not-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)))
>
> \book {
>
> \bookpart {
>
>     \paper {
>       oddHeaderMarkup = \markup \fill-line {
>         " "
>       }
>       evenHeaderMarkup = \markup \fill-line {
>         " "
>       }
>     }
>
> Title, copyright, and dedication pages.
>
>   }
>
> \bookpart {
>
>     \paper {
>       oddHeaderMarkup = \markup \fill-line {
>         " "
>       }
>       evenHeaderMarkup = \markup \fill-line {
>         " "
>       }
>       oddFooterMarkup = \markup \fill-line {
>         " "
>         \on-the-fly #print-page-number-check-first \roman-numeral-page-number
>         " "
>       }
>       evenFooterMarkup = \oddFooterMarkup
>       tocTitleMarkup = \markup \column {
>         \vspace #3
>         \fill-line \abs-fontsize #16 \bold {
>           "TABLE OF CONTENTS"
>         }
>         \vspace #2
>       }
>       tocItemMarkup = \markup \column {
>         \fill-with-pattern #1 #RIGHT . \fromproperty #'toc:text \fromproperty
> #'toc:page
>         \vspace #1
>       }
>     }
>
>     \markuplist \table-of-contents
>
> Preface and Performance Notes.
>
>   }
>
> \bookpart {
>
>     \paper {
>       oddHeaderMarkup = \markup {
>         \fill-line {
>           " "
>           \on-the-fly #create-page-number-stencil \offset-page-number #(1-
> begin-arabic)
>         }
>       }
>       evenHeaderMarkup = \markup {
>         \fill-line {
>           \on-the-fly #create-page-number-stencil \offset-page-number #(1-
> begin-arabic)
>           " "
>         }
>       }
>     }
>
> Music.
>
>   }
>
> }
>
> The first of the \paper blocks remained unchanged in the new version.
> The second and thrid were replaced by the following:
>
>     \paper {
>       oddHeaderMarkup = \markup \fill-line {
>         " "
>       }
>       evenHeaderMarkup = \markup \fill-line {
>         " "
>       }
>       oddFooterMarkup = \markup \fill-line {
>         " "
>         \if \should-print-page-number \roman-numeral-page-number
>         " "
>       }
>       evenFooterMarkup = \oddFooterMarkup
>       tocTitleMarkup = \markup \column {
>         \vspace #3
>         \fill-line \abs-fontsize #16 \bold {
>           "TABLE OF CONTENTS"
>         }
>         \vspace #2
>       }
>       tocItemMarkup = \markup \column {
>         \fill-with-pattern #1 #RIGHT . \fromproperty #'toc:text \fromproperty
> #'toc:page
>         \vspace #1
>       }
>     }
>
>     \paper {
>       oddHeaderMarkup = \markup {
>         \fill-line {
>           " "
>           \if \should-print-page-numbers-global \offset-page-number #(1- 
> begin-arabic)
>         }
>       }
>       evenHeaderMarkup = \markup {
>         \fill-line {
>           \if \should-print-page-numbers-global \offset-page-number #(1- 
> begin-arabic)
>           " "
>         }
>       }
>     }
>
> At the end of the day, I am not familiar enough with Scheme to know
> how to solve this issue. I would be grateful for any assistance.
>
> Hwaen Ch'uqi
>

Hi,

would have been nice if bookpart-level-page-numbering and
page-number-type could be used to make it work out of the box.
See:
https://gitlab.com/lilypond/lilypond/-/issues/6696
https://gitlab.com/lilypond/lilypond/-/issues/6697

For now, how about attached?

HTH,
  Harm
\version "2.24.0"

%% %%% roman numeral page numbers
#(define begin-arabic 11)

#(define-markup-command (page-ref layout props label gauge default)
  (symbol? markup? markup?)
  #:category other
  #:as-string ""
  "
@cindex referencing page number, in text

Print a page number reference.

@var{label} is the label set on the referenced page (using @code{\\label} or
@code{\\tocItem}), @var{gauge} a markup used to estimate the maximum width of
the page number, and @var{default} the value to display when @var{label} is not
found.

If the current book or bookpart is set to use roman numerals for page numbers,
the reference will be formatted accordingly -- in which case the @var{gauge}'s
width may require additional tweaking."
  (let* ((gauge-stencil (interpret-markup layout props gauge))
         (x-ext (ly:stencil-extent gauge-stencil X))
         (y-ext (ly:stencil-extent gauge-stencil Y))
         ;; Ugh -- code duplication with ly/toc-init.ly -vv
         (assoc-name-get
          (lambda (name ls)
            (do ((ls ls (cdr ls)) (result '() result))
                ((null? ls) result)
              (if (and (car ls) (eq? name (assoc-get 'name (cdar ls))))
                  (set! result (cons (car ls) result)))))))
    (ly:stencil-outline
     (ly:make-stencil
      `(delay-stencil-evaluation
        ,(delay (ly:stencil-expr
                 (let* ((table (ly:output-def-lookup layout 'label-page-table))
                        (alist-table 
                          (ly:output-def-lookup layout 'label-alist-table))
                        (retrieve-id 
                          (if (list? alist-table)
                              (let ((entry (assoc-name-get label alist-table)))
                                (if (null? entry)
                                    #f
                                    (caar entry)))
                              #f))
                        (page-number 
                          (if (list? table)
                              (assoc-get (or retrieve-id label) table)
                              #f))
                        (number-type 
                          (ly:output-def-lookup layout 'page-number-type))
                        (page-markup 
                          (if page-number
                              (if (< page-number begin-arabic)
                                  (number-format 'roman-lower page-number)
                                  (number-format 
                                    number-type 
                                    (- (1+ page-number) begin-arabic)))
                              default))
                        (page-stencil 
                          (interpret-markup layout props page-markup))
                        (gap (- (interval-length x-ext)
                                (interval-length 
                                  (ly:stencil-extent page-stencil X)))))
                   (interpret-markup layout props
                                     (make-line-markup
                                      (list
                                       (make-hspace-markup gap)
                                       page-markup)))))))
      x-ext
      y-ext)
     (make-filled-box-stencil x-ext y-ext))))

#(define-markup-list-command (table-of-contents layout props) ()
  #:properties ((baseline-skip))
  "Print a table of contents.

This function uses the paper variable @code{tocTitleMarkup} for the title; it
then prints @code{\\tocItem} entries line by line.

@xref{Table of contents} for a complete discussion."
  (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)))
    (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))))
                            toc-alist)))))

#(define-markup-command (roman-numeral-page-number layout props) ()
  (let ((page-number (chain-assoc-get 'page:page-number props -1)))
    (interpret-markup layout props
      (if (> page-number 0) ; only positive integers can be `romanized'
          (format #f "~(~@r~)" page-number)
          (chain-assoc-get 'page:page-number-string props -1)))))

#(define-markup-command (offset-page-number layout props offset) (integer?)
  (let ((page-number (chain-assoc-get 'page:page-number props -1)))
    (interpret-markup layout props
      (format #f "~a" (- page-number offset)))))

#(define (part-not-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)))

\book {
  \bookpart {
    \paper {
      oddHeaderMarkup = ##f
      evenHeaderMarkup = ##f
    }

    \header { title = "Title, copyright, and dedication pages." }
    
    \tocItem  \markup "page 1" \markup "page 1"
    \pageBreak
    \tocItem  \markup "page 2" \markup "page 2"
    \pageBreak
    \tocItem  \markup "page 3" \markup "page 3"
    \pageBreak
    \tocItem  \markup "page 4" \markup "page 4"
    \pageBreak
    \tocItem  \markup "page 5" \markup "page 5"
    \pageBreak
    \tocItem  \markup "page 6" \markup "page 6"
    \pageBreak
  }

  \bookpart {
    \paper {
      oddHeaderMarkup = ##f
      evenHeaderMarkup = ##f
      oddFooterMarkup = \markup \fill-line {
        " "
        \if \should-print-page-number \roman-numeral-page-number
        " "
      }
      evenFooterMarkup = \oddFooterMarkup
      tocTitleMarkup = \markup \column {
        \vspace #3
        \fill-line \abs-fontsize #16 \bold {
          "TABLE OF CONTENTS"
        }
        \vspace #2
      }
      tocItemMarkup = \markup \column {
        \fill-with-pattern 
          #1 #RIGHT . \fromproperty #'toc:text \fromproperty #'toc:page
        \vspace #1
      }
    }

    \markuplist \table-of-contents

    \tocItem  \markup "page 7" \markup "page 7"
    \pageBreak
    \tocItem  \markup "page 8" \markup "page 8"
    \pageBreak
    \tocItem  \markup "page 9" \markup "page 9"
    \pageBreak
    \tocItem  \markup "page 10" \markup "page 10"
  }

  \bookpart {
    \paper {
      print-first-page-number = ##t
      oddHeaderMarkup = \markup {
        \fill-line {
          " "
          \if \should-print-page-numbers-global 
              \offset-page-number #(1- begin-arabic)
        }
      }
      evenHeaderMarkup = \markup {
        \fill-line {
          \if \should-print-page-numbers-global 
              \offset-page-number #(1- begin-arabic)
          " "
        }
      }
    }

    %% Music.
    \tocItem  \markup  "Music 1"
    {  b1^"Music 1" }
    \pageBreak
    \tocItem  \markup  "Music 2"
    {  b1^"Music 2" }
    \pageBreak
    \tocItem  \markup  "Music 3"
    {  b1^"Music 3" }
    \pageBreak
    \tocItem  \markup  "Music 4"
    {  b1^"Music 4" }
    \pageBreak
  }
}

Reply via email to