Subject: Numérotation des pages

From: Vincent Gay <[email-masked]>
Date: Sun, 10 Jul 2022 10:27:53 +0200

Bonjour à toutes et à tous

Pierre Perol-Schneider m'avait donné une astuce pour redémarrer la 
numérotation des pages à chaque \bookpart. Cela fonctionnait à 
merveille. Mais ça ne fonctionne plus !

J'ai ré-essayé avec des fichiers datant de quelques mois (28/12/2021) 
compilés en 2.22.1 et recompilés aujourd'hui en 2.22.2 sans modifier la 
moindre ligne de code : pas de message d'erreur mais aucun résultat !

Si quelque bonne âme peut m'expliquer

voici un exemple "minimaliste" :

\version "2.22.2"
#(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 ((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 {
   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
           }
         }
     #})

   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
             " "
           }
         }
     #})
  }

\header { title = "Essai numérotation bookparts" }

\book {
   \bookpart {
     \score {
       \new Staff \with { instrumentName = "Part 1" }
       { c''1 }
     }
   }
   \bookpart {
     \score {
       \new Staff \with { instrumentName = "Part 2" }
       { c''1 }
     }
   }
}

-- 
Vincent Gay
Envoyé depuis mon saxo-phone :)
https://myrealbook.vintherine.org/ - http://photos.vintherine.org/

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 10 Jul 2022 17:46:18 +0200

Bonjour Vincent,

Le 10/07/2022 à 10:27, Vincent Gay a écrit :
> compilés en 2.22.1 et recompilés aujourd'hui en 2.22.2 sans modifier 
> la moindre ligne de code : pas de message d'erreur mais aucun résultat !
>

Est-ce que tu n'aurais pas oublié un morceau soit dans ta partition, 
soit dans l'exemple que tu donnes ? ll y a plein de code pour définir 
les fonctions \evenMarkup et \oddMarkup, et elles ne sont utilisées 
nulle part. Dans le \paper, j'ai rajouté

   oddHeaderMarkup = \oddMarkup #'roman
   evenHeaderMarkup = \evenMarkup #'roman

et ça marche pour moi, en 2.22.2 comme en 2.23.11 (après avoir passé 
convert-ly).

Cordialement,
Jean

---

From: Vincent Gay <[email-masked]>
Date: Sun, 10 Jul 2022 19:24:34 +0200

Le 10/07/2022 à 17:46, Jean Abou Samra a écrit :
> soit dans l'exemple que tu donnes ? 

Oui, c'est ça... Le bloc paper est dans un fichier inclus (avec la 
fonction) et je ne comprends pas comment il a pu perdre ces éléments...

En tous cas merci

---

From: Vincent Gay <[email-masked]>
Date: Mon, 11 Jul 2022 09:21:22 +0200

Le 10/07/2022 à 17:46, Jean Abou Samra a écrit :
> Dans le \paper, j'ai rajouté
>

Oui mais... question suivante : le numéro de page est bon mais pas 
l'emplacement...

même code (rectifié), *1ère partie*, c'est bon

*2ème partie* : le numéro est à gauche (devrait aussi être à droite...)

Une idée ? Merci d'avance.

Rappel du code :

\version "2.22.2"

      (set! props
            (cons
             (list

    (set! props
          (cons
           (list

\paper {
   #(set-paper-size "a6")

   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
            " "
          }
        }
      #})
     oddHeaderMarkup = \oddMarkup #'arabic
     evenHeaderMarkup = \evenMarkup #'arabic
}

\header { title = "Essai" }

\book {
   \bookpart {
     \score {
       \new Staff \with { instrumentName = "Part 1" }
       { c''1 \label #'theLastPage }
     }
   }
   \bookpart {
     \paper { first-page-number = #0 }
     \score {
       \new Staff \with { instrumentName = "Part 2" }
       { c''1  \label #'theLastPage }
     }
   }
}

-- 
Vincent Gay
Envoyé depuis mon saxo-phone :)
https://myrealbook.vintherine.org/  -http://photos.vintherine.org/

---

From: Vincent Gay <[email-masked]>
Date: Mon, 11 Jul 2022 09:48:01 +0200

> Oui mais... question suivante : le numéro de page est bon mais pas 

Et autant aller au bout de mon idée... Ce que je recherche c'est de 
fusionner
BookPartPagesNumber.ly (le code pour une numérotation par \bookpart)
la numérotation N° de page / nombre de pages (code ci-dessous)

\paper {
   oddHeaderMarkup = \markup {
     \on-the-fly \print-page-number-check-first {
       \fill-line { \null \concat { \fromproperty 
#'page:page-number-string "/" \page-ref #'theLastPage "0" "?"} }
   } }
   evenHeaderMarkup = \markup {
     \on-the-fly \print-page-number-check-first {
       \fill-line { \concat { \fromproperty #'page:page-number-string 
"/" \page-ref #'theLastPage "0" "?"} \null }
   } }
}

qui suppose \label #'theLastPage en fin de score

Je ne sais vraiment pas par quel bout prendre le problème : si je 
remplace \fromproperty #'page:page-number-string par oddMarkup #'arabic 
ou evenMarkup #'arabic le "/" \page-ref reste toujours à droite.

Mon essai :

\version "2.22.2"

      (set! props
            (cons
             (list

    (set! props
          (cons
           (list

\paper {
   ragged-bottom = ##t

   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
            " "
          }
        }
      #})
%     oddHeaderMarkup = \oddMarkup #'arabic
%     evenHeaderMarkup = \evenMarkup #'arabic
     oddHeaderMarkup = \markup {
       \on-the-fly \print-page-number-check-first {
         \fill-line { \null \concat { \oddMarkup #'arabic "/" \page-ref 
#'theLastPage "0" "?"} }
     } }
     evenHeaderMarkup = \markup {
       \on-the-fly \print-page-number-check-first {
         \fill-line { \concat { \evenMarkup #'arabic "/" \page-ref 
#'theLastPage "0" "?"} \null }
     } }
}

\header { title = "Essai"  tagline = ##f }
\layout {
   \context { \Score \omit BarNumber }
}

\book {
   \bookpart {
     \score {
       \new Staff \with { instrumentName = "Part 1" }
       { c''1 \pageBreak c''1 \pageBreak c'' \label #'theLastPage }
     }
   }
   \bookpart {
     \paper { first-page-number = #0 }
     \score {
       \new Staff \with { instrumentName = "Part 2" }
       { c''1  \pageBreak c''1 \pageBreak c'' \label #'theLastPage }
     }
   }
}

---

From: yagloops <[email-masked]>
Date: Mon, 11 Jul 2022 09:58:14 +0200

Peut-être
evenHeaderMarkup = \oddHeaderMarkup
Ou le contraire
oddHeaderMarkup = \evenHeaderMarkup
Le 10 juil. 2022 à 17:46 +0200, a écrit :
> oddHeaderMarkup = \

---

From: Vincent Gay <[email-masked]>
Date: Mon, 11 Jul 2022 10:13:08 +0200

> evenHeaderMarkup = \oddHeaderMarkup

Nop, ça marche pas : le placement est systématiquement à droite (ce qui 
est logique)

---

From: yagloops <[email-masked]>
Date: Mon, 11 Jul 2022 10:16:59 +0200

Désolé je n’ai pas comprendre ce que tu voulais !

---

From: Vincent Gay <[email-masked]>
Date: Mon, 11 Jul 2022 10:21:55 +0200

> la numérotation N° de page / nombre de pages (code ci-dessous)

Et tant qu'à faire d'être pénible !

avec la formule \concat { \fromproperty #'page:page-number-string "/" 
\page-ref #'theLastPage "0" "?"} si le label #'theLastPage n'existe pas  
la page est numérotée 1/?

si je remplace le "?" par "" j'ai logiquement une numérotation 1/

vous l'avez compris, j'aimerai qu'il n'y ait rien du tout, ni le point 
d’interrogation ni le slash.

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 13 Jul 2022 02:15:42 +0200

Le 10/07/2022 à 10:27, Vincent Gay a écrit :
> [...]

Bonjour Vincent,

Je n'ai pas cherché à comprendre ce code, car il me paraît beaucoup
trop compliqué. En effet, il existe une solution nettement plus simple
pour afficher des numéros de page relatifs au bookpart :

\version "2.22.2"

%% Fichier inclus

\paper {
   make-header =
     #(lambda (layout scopes page-number is-last-bookpart 
is-bookpart-last-page)
        ((marked-up-headfoot 'oddHeaderMarkup 'evenHeaderMarkup)
         layout scopes
         (if (ly:output-def-lookup layout 'number-pages-per-bookpart #f)
             (1+ (- page-number  (ly:output-def-lookup layout 
'first-page-number)))
             page-number)
         is-last-bookpart is-bookpart-last-page))
}

%% Fichier principal

\paper {
   number-pages-per-bookpart = ##t %% à enlever si non souhaité
   print-first-page-number = ##t
}

\book {
   \bookpart {
     \score {
       { c''1 \pageBreak c''1 }
     }
   }
}

Et voici un code qui va un peu plus loin et automatise aussi la
numérotation avec "/total", d'une manière qui fonctionne également
avec le code précédent :

\version "2.22.2"

%% Fichier inclus

\paper {
   make-header =
     #(lambda (layout scopes page-number is-last-bookpart 
is-bookpart-last-page)
        ((marked-up-headfoot 'oddHeaderMarkup 'evenHeaderMarkup)
         layout scopes
         (if (ly:output-def-lookup layout 'number-pages-per-bookpart #f)
             (1+ (- page-number (ly:output-def-lookup layout 
'first-page-number)))
             page-number)
         is-last-bookpart is-bookpart-last-page))
}

#(define-markup-command (page-number layout props) ()
    (if (ly:output-def-lookup layout 'print-page-total #f)
        (let* ((make-stil
                (lambda (total-string)
                  (stack-stencils
                   X
                   RIGHT
                   0.0
                   (map (lambda (m)
                          (interpret-markup layout props m))
                          (list (chain-assoc-get 
'page:page-number-string props)
                                "/"
                                total-string)))))
               (gauge-stil (make-stil "0")))
          (ly:make-stencil
           `(delay-stencil-evaluation
             ,(delay
               (ly:stencil-expr (make-stil (ly:output-def-lookup layout 
'page:page-total)))))
           (ly:stencil-extent gauge-stil X)
           (ly:stencil-extent gauge-stil Y)))
        (interpret-markup layout props (make-fromproperty-markup 
'page:page-number-string))))

\paper {
   page-post-process =
   #(lambda (paper pages)
      (let ((per-bookpart (ly:output-def-lookup paper 
'number-pages-per-bookpart #f)))
        (for-each
         (lambda (page)
           (let ((local-paper
                  (if per-bookpart
                      (ly:paper-book-paper (ly:prob-property page 
'paper-book))
                      paper))
                 (page-number (ly:prob-property page 'page-number)))
             (ly:output-def-set-variable!
              local-paper
              'page:page-total
              (number->string
               (max (if per-bookpart
                        (1+ (- page-number (ly:output-def-lookup 
local-paper 'first-page-number)))
                        page-number)
                    (string->number (ly:output-def-lookup local-paper 
'page:page-total "0")))))))
        pages)))

   oddHeaderMarkup = \markup {
     \on-the-fly \print-page-number-check-first {
       \fill-line { \null \concat { \page-number } }
     }
   }

   evenHeaderMarkup = \markup {
     \on-the-fly \print-page-number-check-first {
       \fill-line { \concat { \page-number } \null }
     }
   }
}

%% Fichier principal

\paper {
   number-pages-per-bookpart = ##t %% à enlever si non souhaité
   print-page-total = ##t %% à enlever si non souhaité
   print-first-page-number = ##t
}

\book {
   \bookpart {
     \score {
       \new Staff \with { instrumentName = "Part 1" }
       { c''1 \pageBreak 1 \pageBreak 1 \label bookpartI }
     }
   }
   \bookpart {
     \score {
       \new Staff \with { instrumentName = "Part 2" }
       { c''1 \pageBreak c''1 \label bookpartII }
     }
   }
}

Cordialement,
Jean

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 13 Jul 2022 02:18:19 +0200

>       { c''1 \pageBreak c''1 \label bookpartII }

Oups, les \label à la fin sont en trop. Ils ne sont plus nécessaires.

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 13 Jul 2022 12:10:48 +0200

> merveille. Mais ça ne fonctionne plus !

Au fait, j'en profite pour une petite question. Pourquoi rendre les 
\bookpart indépendants au niveau de la numérotation ? Il ne vaudrait pas 
mieux faire des \book différents ?

Cordialement,
Jean

---

From: Vincent Gay <[email-masked]>
Date: Wed, 13 Jul 2022 16:22:30 +0200

> numérotation avec "/total", d'une manière qui fonctionne également

C'est juste parfait, comme d'hab. Merci infiniment.

---

From: Vincent Gay <[email-masked]>
Date: Wed, 13 Jul 2022 16:23:24 +0200

Le 13/07/2022 à 12:10, Jean Abou Samra a écrit :
> \bookpart indépendants au niveau de la numérotation ? Il ne vaudrait 
> pas mieux faire des \book différents ? 
La notion de book dans mon cas est sans doute éloignée de celle 
ordinairement en usage. Imaginons un big band : il est composé 
d'instruments en Ut (généralement la rythmique, piano / guitare / basse, 
éventuellement la flute, le violon... ) mais aussi d'instruments en Si♭ 
ou en Mi♭ (trompettes, saxophones, clarinettes...). J'ai pour habitude 
de regrouper par tonalité (books) puis par partitions (bookparts). Cela 
correspond à ce que les jazzeux trouvent dans les partitions genre play 
alond tels Aebersold ou Hal Leonard.

---

From: Vincent Gay <[email-masked]>
Date: Wed, 13 Jul 2022 16:26:34 +0200

Le 13/07/2022 à 16:23, Vincent Gay a écrit :
> il est composé d'instruments en Ut (généralement la rythmique, piano / 
> guitare / basse, éventuellement la flute, le violon... ) mais aussi 
> d'instruments en Si♭ ou en Mi♭ 

J'ai oublié de précisée que toutes les partitions à part celles 
spécifiques pour piano et guitare sont transposées dans les 2 tonalités 
Si♭ et Mi♭ : on ne sait pas à l'avance par quel instrument sera jouée 
telle ou telle partie.

---

From: Vincent Gay <[email-masked]>
Date: Fri, 15 Jul 2022 18:48:05 +0200

> C'est juste parfait, comme d'hab. Merci infiniment.

Heu... presque parfait, juste un tout petit bug...

si  dans l'exemple donné je mets
\paper {
   number-pages-per-bookpart = ##f
}

je numéro de page est correctement calculé mais pas le total des pages

Voici ce que j'obtiens  :
1er bookpart 1/3 2/3 3/3
2ème bookpart 4/5 5/5

Bonne soirée.

---

From: Jean Abou Samra <[email-masked]>
Date: Sat, 16 Jul 2022 00:18:53 +0200

> je numéro de page est correctement calculé mais pas le total des pages

Ça, c'est ce qui arrive quand on code trop tard le soir…
Je me reprends :

\version "2.22.2"

%% Fichier inclus

\paper {
   make-header =

\paper {
   page-post-process =
   #(lambda (paper pages)
                      paper
                      (ly:output-def-parent paper)))

%% Fichier principal

\paper {
   %number-pages-per-bookpart = ##t %% à décommenter si souhaité
   print-page-total = ##t %% à enlever si non souhaité
   print-first-page-number = ##t
}

\book {
   \bookpart {
     \score {

Cordialement,
Jean

---

From: Ya Gloops <[email-masked]>
Date: Fri, 22 Jul 2022 20:58:19 +0000 (UTC)

Bonsoir !
S'il n'y a pas de bookpart on obtient une erreur, c'est normal ?
Gilles

\version "2.22.2"

%% Fichier inclus

\paper {
  make-header =

    #(lambda (layout scopes page-number is-last-bookpart is-bookpart-last-page)
       ((marked-up-headfoot 'oddHeaderMarkup 'evenHeaderMarkup)
        layout scopes
        (if (ly:output-def-lookup layout 'number-pages-per-bookpart #f)

            (1+ (- page-number (ly:output-def-lookup layout 'first-page-number)))
            page-number)
        is-last-bookpart is-bookpart-last-page))
}

                         (list (chain-assoc-get 'page:page-number-string props)
                               "/"
                               total-string)))))
              (gauge-stil (make-stil "0")))
         (ly:make-stencil
          `(delay-stencil-evaluation
            ,(delay

              (ly:stencil-expr (make-stil (ly:output-def-lookup layout 'page:page-total)))))
          (ly:stencil-extent gauge-stil X)
          (ly:stencil-extent gauge-stil Y)))

       (interpret-markup layout props (make-fromproperty-markup 'page:page-number-string))))
\paper {
  page-post-process =
  #(lambda (paper pages)

     (let ((per-bookpart (ly:output-def-lookup paper 'number-pages-per-bookpart #f)))
       (for-each
        (lambda (page)
          (let ((local-paper
                 (if per-bookpart
                     paper
                     (ly:output-def-parent paper)))
                (page-number (ly:prob-property page 'page-number)))
            (ly:output-def-set-variable!
             local-paper
             'page:page-total
             (number->string
              (max (if per-bookpart

                       (1+ (- page-number (ly:output-def-lookup local-paper 'first-page-number)))
                       page-number)

                   (string->number (ly:output-def-lookup local-paper 'page:page-total "0")))))))
       pages)))

%% Fichier principal

\paper {

    \score {

    \score {

Le samedi 16 juillet 2022 à 00:19:11 UTC+2, Jean Abou Samra <[email-masked]> a écrit : 

\version "2.22.2"

%% Fichier inclus

\paper {
  make-header =

\paper {
  page-post-process =
  #(lambda (paper pages)

%% Fichier principal

\paper {

\book {
  \bookpart {
    \score {

Cordialement,

Jean

---

From: Jean Abou Samra <[email-masked]>
Date: Fri, 22 Jul 2022 23:11:28 +0200

> S'il n'y a pas de bookpart on obtient une erreur, c'est normal ?

Effectivement, c'était un autre bug dans mon code… Je me reprends
(bis repetita placent) :

\version "2.22.2"

%% Fichier inclus

\paper {
   make-header =

\paper {
   #(use-modules (srfi srfi-2))
   page-post-process =
   #(lambda (paper pages)
      (let ((per-bookpart (ly:output-def-lookup paper 
'number-pages-per-bookpart #f)))
        (for-each
         (lambda (page)
           (let ((local-paper
                  (or (and-let* (((not per-bookpart))
                                 (parent (ly:output-def-parent paper))
                                 ((not (null? parent))))
                         parent)
                      paper))
                 (page-number (ly:prob-property page 'page-number)))
             (ly:output-def-set-variable!
              local-paper
              'page:page-total
              (number->string
               (max (if per-bookpart
                        (1+ (- page-number (ly:output-def-lookup 
local-paper 'first-page-number)))
                        page-number)
                    (string->number (ly:output-def-lookup local-paper 
'page:page-total "0")))))))
        pages)))

%% Fichier principal

\paper {
   number-pages-per-bookpart = ##t %% à décommenter si souhaité
   print-page-total = ##t %% à enlever si non souhaité
   print-first-page-number = ##t
}

%\bookpart {
     \score {
%}

%\bookpart {
     \score {
%}

Cordialement,
Jean

---

From: Ya Gloops <[email-masked]>
Date: Sat, 23 Jul 2022 00:15:02 +0000 (UTC)

Merci Jean !
Ca fonctionne parfaitement ...

Le vendredi 22 juillet 2022 à 23:11:32 UTC+2, Jean Abou Samra <[email-masked]> a écrit : 

\version "2.22.2"

%% Fichier inclus

\paper {
  make-header =

\paper {

                        parent)
                     paper))

%% Fichier principal

\paper {

%\bookpart {
    \score {

%\bookpart {
    \score {

Cordialement,
Jean