\version "2.15.36"
#(define (book-first-page layout props)
(define (ancestor layout)
"Return the topmost layout ancestor"
(let ((parent (ly:output-def-parent layout)))
(if (not (ly:output-def? parent))
layout
(ancestor parent))))
(ly:output-def-lookup (ancestor layout) 'first-page-number))
#(define-markup-command (with-link layout props label arg)
(symbol? markup?)
(let* ((arg-stencil (interpret-markup layout props arg))
(x-ext (ly:stencil-extent arg-stencil X))
(y-ext (ly:stencil-extent arg-stencil Y)))
(ly:make-stencil
`(delay-stencil-evaluation
,(delay (ly:stencil-expr
(let* ((table (ly:output-def-lookup layout 'label-page-table))
(first-page-number (book-first-page layout props))
(orig-page-number (if (list? table)
(assoc-get label table)
#f))
(p-nr (ly:output-def-lookup layout 'first-page-number))
(page-number (+ orig-page-number (+ 1 (* -1
first-page-number) )))
(link-expr (list 'page-link page-number
`(quote ,x-ext) `(quote ,y-ext))))
(newline)(display "first-page-number__")(display first-page-number)
(newline)(display "p-nr_______________")(display p-nr)
(ly:stencil-add (ly:make-stencil link-expr x-ext y-ext)
arg-stencil)))))
x-ext
y-ext)))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%---- Test
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paper {
first-page-number = #-2
}
mus = \relative c'' {
\repeat unfold 10 { c1 \break }
}
\book {
\bookpart {
\markup \bold \fontsize #10 \fill-line { "TITLE" }
}
\bookpart {
\markup \fontsize #2 \fill-line { "Some Text" }
\paper {
oddHeaderMarkup = \markup { \null }
evenHeaderMarkup = \markup { \null }
}
}
\bookpart {
\markuplist \table-of-contents
\paper {
oddHeaderMarkup = \markup { \null }
evenHeaderMarkup = \markup { \null }
}
}
\bookpart {
\tocItem \markup { "Piece 1" }
\score {
\mus
\header { piece = "Piece 1" }
}
}
\bookpart {
\tocItem \markup { "Piece 2" }
\score {
\transpose c cis \mus
\header { piece = "Piece 2" }
}
}
\bookpart {
\tocItem \markup { "Piece 3" }
\score {
\transpose c d \mus
\header { piece = "Piece 3" }
}
}
}
%%%%%%%%%%%%
The lines with p-nr and (display ...) should be deleted. I let them in
for testing-purpose.