Connaitre le numéro de la dernière page d'un bookpart

Bonjour à tous,
Je réalise des partitions avec des parties séparées et j'aimerais que la numérotation des pages de chaque partie soit automatique. Pour déterminer le numéro de la dernière page, j'utilise \page-ref associé à un label que je positionne après la dernière note, comme sur cet exemple. Malheureusement, cela ne fonctionne pas ; le label contient le nombre de page de tout le recueil. Voici un MWE :

\version "2.24.0"

#(define-markup-command (bookpart-page-number layout props) ()
   (let ((first-page-number (ly:output-def-lookup layout 'first-page-number))
         (page-number (chain-assoc-get 'page:page-number props 0)))
     (interpret-markup layout props (format #f "~a" (1+ (- page-number first-page-number))))))

\book {
  % Continuo part
  \bookpart {
    \header { title = \markup {  "— Bassus Continuus —"  } }  
    \score { 
      \new Staff
      <<
        \new Voice {      
          \clef bass
          \repeat unfold 250 { c1}
          \label #'lastpage
        }
      >>
    }
  
    \paper {
      print-page-number = ##f
      evenFooterMarkup = \markup {
        \fill-line {
          \tiny {
            \fill-line {
              \line { \concat { "Page "\bookpart-page-number" / " \page-ref #'lastpage "0" "?" } }
            }
          }
        }
      }
      oddFooterMarkup = \evenFooterMarkup
    } 
  }
  
  % Violin part
  \bookpart {
    \header {  title = \markup { "— Violino primo —"  } }
    \score { 
      \new Staff
      <<
        \new Voice {
          \clef treble
          \repeat unfold 300 c''1
          \label #'lastpage
        }
      >>
    }
  
    \paper {
      print-page-number = ##f
      evenFooterMarkup = \markup {
        \fill-line {
          \tiny {
            \fill-line {
              \line { \concat { "Page "\bookpart-page-number" / " \page-ref #'lastpage "0" "?" } }
            }
          }
        }
      }
      oddFooterMarkup = \evenFooterMarkup
    } 
  }

}

Sauriez-vous m'aider à trouver une solution ?
Merci
Bonne journée,
Rémy

J'aurais tendance à dire que, quel que soit le chapitre, la dernière page d'un roman ou du bouquin de math, est invariable.
Lorsque je réalise un matériel d'orchestre, chaque pupitre fait l'objet d'un \book (ouvrage) spécifique qui peut comporter plusieurs \bookpart (partie d'un même ouvrage) selon le nombre d'actes ou pour faciliter la mise en page : le premier violon commence à sa page une, l'hélicon aussi.

Bonsoir,
J'adopte aussi cette façon de faire assez souvent. En l'occurrence, j'aurais aimé assembler toutes les parties instrumentales dans un seul \book.
Cela semble assez complexe....
Rémy

Ce que je constate au vu de ton code est que même si tu réinitialise le numéro de première page, le compteur continue à s'incrémenter.
Il faudrait dans un premier temps affecter un \label (qui enregistre en interne un numéro de page absolu) particulier à chaque partie puis fournir au pied de page la différence déterminée au fur et à mesure.

Question subsidiaire : le nombre de pages est-il vraiment nécessaire ?

Oui, J'aimerai bien avoir le numéro de page pour avoir "1 / 3" comme indication de pied de page.
Je ne sais pas programmer la solution que tu proposes, tu aurais une idée ??
Merci !!
Rémy

Bonjour à tous.
Je ne dois pas comprendre le problème.
Moi, quand je veux les numeros de pages, je note :

\label #'theLastPage
en fin de score.

Et

\paper
{
oddFooterMarkup = \markup {\fontsize #1 \fill-line { \fromproperty #'header:title } }
print-page-number = ##t
oddHeaderMarkup =
\markup
{
\if \should-print-page-number
{\fill-line { \null \concat { \fromproperty #'page:page-number-string "/" \page-ref #'theLastPage "00" "?"} } }
}
evenHeaderMarkup =
\markup
{
\if \should-print-page-number
{\fill-line { \concat { \fromproperty #'page:page-number-string "/" \page-ref #'theLastPage "00" "?"} \null }}
}
}
Mais cela ne doit pas être la question !
bonne journée atous

Bonjour Christian,
Merci pour cette réponse.
Ton code fonctionne bien mais dans un \book avec un seul \bookpart. Si dans ce \book, tu utilises plusieurs \bookpart avec des numérotations spécifiques, cela ne fonctionne pas.
Je cherche une solution à ce problème.
Merci et bon WE à tous !
Rémy

Rémy,

Si je comprends bien, l'idée recherchée est d'avoir le format suivant :
"numéro_de_la_page_du_bookpart"/"nombre_total_de_pages_du_bookpart".
Si c'est bien cela, je suis parti de votre exemple et :

  1. j'ai enlevé la définition du "bookpart-page-number" au début pour la
    remplacer par "bookpart-level-page-numbering = ##t" dans le bloc \paper
    (voir ici la doc
    https://lilypond.org/doc/v2.24/Documentation/notation/other-paper-variables#paper-variables-for-page-numbering.)
    avec le même effet, recommencer à 1 la numérotation, mais plus simple.
  2. j'ai remplacé la fonction "\bookpart-page-number" par "\fromproperty
    #'page:page-number-string" qui numérote les pages.

Cela donne le code suivant :
\version "2.24.0"

\book {
% Continuo part
\bookpart {
\header { title = \markup { "— Bassus Continuus —" } }
\score {
\new Staff
<<
\new Voice {
\clef bass
\repeat unfold 250 { c1}
\label #'lastpage
}
>>
}

 \paper {
   print-page-number = ##f
   bookpart-level-page-numbering = ##t
   evenFooterMarkup = \markup {
     \fill-line {
       \tiny {
         \fill-line {
           \line { \concat { "Page "\fromproperty 

#'page:page-number-string" / " \page-ref #'lastpage "0" "?" } }
}
}
}
}
oddFooterMarkup = \evenFooterMarkup
}
}

% Violin part
\bookpart {
\header { title = \markup { "— Violino primo —" } }
\paper {bookpart-level-page-numbering = ##t}
\score {
\new Staff
<<
\new Voice {
\clef treble
\repeat unfold 300 c''1
\label #'lastpage
}
>>
}

 \paper {
   print-page-number = ##f
   evenFooterMarkup = \markup {
     \fill-line {
       \tiny {
         \fill-line {
           \line { \concat { "Page "\fromproperty 

#'page:page-number-string" / " \page-ref #'lastpage "0" "?" } }
}
}
}
}
oddFooterMarkup = \evenFooterMarkup
}
}

}

J'espère avoir répondu à votre question.
Bonne journée,
Luc
Le 16/05/2026 à 08:30, Rémy Claverie via LilyPond a écrit :

[Remy] Rémy Claverie https://lilypond.community/u/remy Remy
Mai 16

Bonjour Christian,
Merci pour cette réponse.
Ton code fonctionne bien mais dans un \book avec un seul \bookpart. Si
dans ce \book, tu utilises plusieurs \bookpart avec des numérotations
spécifiques, cela ne fonctionne pas.
Je cherche une solution à ce problème.
Merci et bon WE à tous !
Rémy


Pour poster dans ce sujet, répondez à cet email ou visitez la page du
sujet
https://lilypond.community/t/connaitre-le-numero-de-la-derniere-page-dun-bookpart/6166/8.

Pour créer un nouveau sujet, écrivez à user-fr@lilypond.community ou
visitez la page d'accueil de lilypond.community
https://lilypond.community.

Vous recevez cet e-mail car vous avez activé la liste de diffusion.

Pour vous désabonner de ces e-mails, modifiez vos préférences
https://lilypond.community/my/preferences/emails.

Bonjour,

alors ou je n'ai pas compris comment ça fonctionne ,
mais quant on fait un conducteur avec le code ci-dessus on obtient à la fin page 3/2

Bonsoir,

C'est à cause du nom de label.
J'avais laissé le même nom dans chaque voix (alors que dans votre
conducteur, il y a fort à parier que les \bookpart ne font pas tous le
même nombre de pages).
Il suffit de donner un nom de label différent pour chaque partie.
Voici un exemple toujours à partir du code de Rémy (le conducteur fait
plus de pages, le label récupéré s'appelle "lastpageConductor" avec 4
pages, et pour la basse continue, il s'appelle "lastpageContinuus" avec
2 pages...
\version "2.24.0"
\book {
% Conductor
\bookpart {
\header { title = \markup { "— Conductor —" } }
\score {
\new StaffGroup <<
\new Staff
<<
\new Voice {
\clef treble
\repeat unfold 380 {c''1}
\label #'lastpageConductor
}
>>
\new Staff
<<
\new Voice {
\clef bass
\repeat unfold 380 { c1}
}
>>
>>
}

 \paper {
   print-page-number = ##f
   bookpart-level-page-numbering = ##t
   evenFooterMarkup = \markup {
     \fill-line {
       \tiny {
         \fill-line {
           \line { \concat { "Page "\fromproperty

                             #'page:page-number-string" / " 

\page-ref #'lastpageConductor "0" "?" } }
}
}
}
}
oddFooterMarkup = \evenFooterMarkup
}
}

% Continuo part
\bookpart {
\header { title = \markup { "— Bassus Continuus —" } }
\score {
\new Staff
<<
\new Voice {
\clef bass
\repeat unfold 280 { c1}
\label #'lastpageContinuus
}
>>
}

 \paper {
   print-page-number = ##f
   bookpart-level-page-numbering = ##t
   evenFooterMarkup = \markup {
     \fill-line {
       \tiny {
         \fill-line {
           \line { \concat { "Page "\fromproperty

                             #'page:page-number-string" / " 

\page-ref #'lastpageContinuus "0" "?" } }
}
}
}
}
oddFooterMarkup = \evenFooterMarkup
}
}

% Violin part
\bookpart {
\header { title = \markup { "— Violino primo —" } }
\paper {bookpart-level-page-numbering = ##t}
\score {
\new Staff
<<
\new Voice {
\clef treble
\repeat unfold 300 c''1
\label #'lastpageViolino
}
>>
}

 \paper {
   print-page-number = ##f
   evenFooterMarkup = \markup {
     \fill-line {
       \tiny {
         \fill-line {
           \line { \concat { "Page "\fromproperty

                             #'page:page-number-string" / " 

\page-ref #'lastpageViolino "0" "?" } }
}
}
}
}
oddFooterMarkup = \evenFooterMarkup
}
}

}

Bonne soirée,
Luc

Le 16/05/2026 à 18:59, MartialR via LilyPond a écrit :

[MartialR] MartialR
Mai 16

Bonjour,

alors ou je n'ai pas compris comment ça fonctionne ,
mais quant on fait un conducteur avec le code ci-dessus on a la fin
|page 3/2|


Pour poster dans ce sujet, répondez à cet email ou visitez la page du
sujet
https://lilypond.community/t/connaitre-le-numero-de-la-derniere-page-dun-bookpart/6166/10.

Pour créer un nouveau sujet, écrivez à user-fr@lilypond.community ou
visitez la page d'accueil de lilypond.community
https://lilypond.community.

Vous recevez cet e-mail car vous avez activé la liste de diffusion.

Pour vous désabonner de ces e-mails, modifiez vos préférences
https://lilypond.community/my/preferences/emails.

Bonjour, et merci.
Je vais refaire mon modèle, c'est pratique le nombre de pages quand on à un fouillis de partitions plutôt que de chercher les suites de numéro de mesures en début de portée et la double barre .

Merci LucDR pout ta réponse et la solution que tu proposes et qui fonctionne parfaitement bien. Je remets ci-dessous, ton code mis en forme. Les deux points importants pour résoudre mon pb étaient i) qu'il fallait bien un label de fin de partie musical pour chaque instrument et ii) qu'il fallait ajouter bookpart-level-page-numbering = ##t dans la section \paper.

\version "2.24.0"
\book {
  % Continuo part
  \bookpart {
    \header { title = \markup {  "— Bassus Continuus —"  } }  
    \score { 
      \new Staff
      <<
        \new Voice {      
          \clef bass
          \repeat unfold 250 { c1}
          \label #'lastpageBC
        }
      >>
    }  
    \paper {
      bookpart-level-page-numbering = ##t
      print-page-number = ##f
      evenFooterMarkup = \markup {
        \fill-line {
          \tiny {
            \fill-line {
              \line { \concat { "Page "\fromproperty #'page:page-number-string " / " \page-ref #'lastpageBC "0" "?" } }
            }
          }
        }
      }
      oddFooterMarkup = \evenFooterMarkup
    } 
  }
  % Violin part
  \bookpart {
    \header {  title = \markup { "— Violino primo —"  } }
    \score { 
      \new Staff
      <<
        \new Voice {
          \clef treble
          \repeat unfold 300 { c''1 }
          \label #'lastpageVnI
        }
      >>
    }  
    \paper {    
      bookpart-level-page-numbering = ##t
      print-page-number = ##f
      evenFooterMarkup = \markup {
        \fill-line {
          \tiny {
            \fill-line {
              \line { \concat { "Page "\fromproperty #'page:page-number-string" / " \page-ref #'lastpageVnI "0" "?" } }
            }
          }
        }
      }
      oddFooterMarkup = \evenFooterMarkup
    } 
  }

  % Violin part
  \bookpart {
    \header {  title = \markup { "— Violino secundo —"  } }
    \score { 
      \new Staff
      <<
        \new Voice {
          \clef treble
          \repeat unfold 500 { c''1 }
          \label #'lastpageVnII
        }
      >>
    }
    \paper {    
      bookpart-level-page-numbering = ##t
      print-page-number = ##f
      evenFooterMarkup = \markup {
        \fill-line {
          \tiny {
            \fill-line {
              \line { \concat { "Page "\fromproperty #'page:page-number-string" / " \page-ref #'lastpageVnII "0" "?" } }
            }
          }
        }
      }
      oddFooterMarkup = \evenFooterMarkup
    } 
  }

}

J'avais oublié la possibilité de numérotation par chapitre que Jean avait implémenté en 2022…

Les clauses bookpart-level-page-numbering, print-page-number et oddFooterMarkup = \evenFooterMarkup peuvent même ne se mentionner qu'une seule fois dans un bloc \paper au niveau au niveau du \book.