Subject: Recueil - gestion du nombre de système par page

From: [email-masked]
Date: Sun, 6 Dec 2020 12:18:18 +0100 (CET)

Bonjour à tous,

Je suis en train d'essayer de faire un recueil de partitions, et je n'arrive pas à gérer le nombre de systèmes par page.

J'aimerai que sur chaque page, il y ait 6 systèmes au maximum.

De plus, s'il y a un nouveau titre sur la page (changement de mouvement), il n'y ait plus que 5 systèmes de musique.

(dans mon idée, la ligne de titre serait comptée en tant que 6ème système)

si j'utilise page-count=9 : ça fonctionne à peu près ici, parce qu'il n'y a que 4 morceaux avec uniquement des rondes. si j'utilise cette commande dans mon recueil, ça serait compliqué d'estimer le nombre de pages que je souhaite au final.... c'est pour celà que j'aimerai pouvoir régler automatiquement le nombre de système par page

De plus, le journal me donne cette info étrange :

Dessin des systèmes...

Sortie mise en page vers « /tmp/lilypond-SNA562 »...

Avertissement : Détection d'une valeur infini ou non numérique. Substitution par 0.0

Avertissement : Détection d'une valeur infini ou non numérique. Substitution par 0.0

Avertissement : Détection d'une valeur infini ou non numérique. Substitution par 0.0

Avertissement : Détection d'une valeur infini ou non numérique. Substitution par 0.0

Conversion à « test-recueil.pdf »...

Suppression de « /tmp/lilypond-SNA562 »...

Compilation menée à son terme, avec succès.

J'ai essayé d'utiliser :

min-systems-per-page = 5
max-systems-per-page = 6

Dans ce cas, la compilation reste bloquée sur 100% sans terminer et je suis obligé d'arrêter la compilation à la main

Répartition de la musique sur 8 à 9 pages...

Abandon lilypond 2.20.0 [test-recueil.ly]...

Arrêté avec le code de retour 15.

voici un code simplifié de la structure de mon recueil (c'est le même en pièce jointe)

(il y aura une première de couverture, en \bookpart)

\version "2.20.0"
\language "français"

\paper { print-all-headers = ##t
         ragged-last-bottom = ##f
         tocTitleMarkup = \markup \huge \column { \fill-line { \null "Table des matières" \null } \hspace #1 }
         tocItemMarkup = \tocItemWithDotsMarkup
         tocActMarkup = \markup \large \column {
                        \fill-line { \null \italic \fromproperty #'toc:text \null }
         }
} 

tocAct =
#(define-music-function (parser location text) (markup?)
   (add-toc-item! 'tocActMarkup text))

\paper { left-margin = 15\mm
         right-margin = 10\mm
         top-margin = 10\mm
         bottom-margin = 10\mm
         %page-count = 9
         %min-systems-per-page = 5
         %max-systems-per-page = 6
         }

\book { 

%{
\paper { first-page-number = #-1 }

%% petit bookpart de couverture :
\bookpart { 
   \header { copyright = ##f tagline = ##f }
%% bloc \paper local :
  \paper { left-margin = 0
           top-margin = -2\mm
           bookTitleMarkup = \markup  {  \epsfile #X #120 #"Duos-Couverture.eps" } 
           evenHeaderMarkup = ##f
           oddHeaderMarkup = ##f }
  \pageBreak
  \markup \null }
%}

\markuplist \table-of-contents
\pageBreak

% 001 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\tocItem \markup "n° 1 - do"
\score { \new StaffGroup <<
  \new Staff \with { instrumentName = "Violoncelle 1" shortInstrumentName = "1." }
             { \clef bass \repeat unfold 150 do1 }
  \new Staff \with { instrumentName = "Violoncelle 2" shortInstrumentName = "2." }
             { \clef bass \repeat unfold 150 do1 \bar "|." } >>
\header { title = "1" subtitle = "do" } }
\markup { \vspace #2 }

% 002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\tocItem \markup "n° 2 - ré"
\score { \new StaffGroup <<
  \new Staff \with { instrumentName = "Violoncelle 1" shortInstrumentName = "1." }
             { \clef bass \repeat unfold 150 ré1 }
  \new Staff \with { instrumentName = "Violoncelle 2" shortInstrumentName = "2." }
             { \clef bass \repeat unfold 150 ré1 \bar "|." } >>
\header { title = "2" subtitle = "ré" } }
\markup { \vspace #2 }

% 003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\tocItem \markup "n° 3 - mi"
\score { \new StaffGroup <<
  \new Staff \with { instrumentName = "Violoncelle 1" shortInstrumentName = "1." }
             { \clef bass \repeat unfold 150 mi1 \bar "|." }
  \new Staff \with { instrumentName = "Violoncelle 2" shortInstrumentName = "2." }
             { \clef bass \repeat unfold 150 mi1 \bar "|." } >>
\header { title = "3" subtitle = "mi" } }
\markup { \vspace #2 }

% 004 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\tocAct \markup { }
\tocItem \markup "n° 4 - fa"
\score { \new StaffGroup <<
  \new Staff \with { instrumentName = "Violoncelle 1" shortInstrumentName = "1." }
             { \clef bass \repeat unfold 150 fa1 \bar "|." }
  \new Staff \with { instrumentName = "Violoncelle 2" shortInstrumentName = "2." }
             { \clef bass \repeat unfold 150 fa1 \bar "|." } >>
\header { title = "4" subtitle = "fa" } }
\markup { \vspace #2 } 

}%Fin du book

---

From: Bernard Meylan <[email-masked]>
Date: Sun, 6 Dec 2020 04:51:07 -0700 (MST)

C'est un des problèmes non encore résolus… enfin pas complètement.

J'ai trouvé ce code sur le forum anglais de LilyPond… mais autant te dire
d'emblée que je n'en suis pas convaincu… 

% Avec le code ci-dessous, il est possible de définir à la fois le nombre de
mesures par système + le nombre de systèmes par page. 
#(define (expand-repetitions arg)
;; 4*5 --> 4 4 4 4 4
;; (at any level of nesting)
  (fold-right
    (lambda (elem prev)
            (cond ((pair? elem)
                   (cons (expand-repetitions elem) prev))
                  ((symbol? elem)
                   (let* ((str (symbol->string elem))
                          (split (string-split str #\*))
                          (split (map (lambda (elem) (string->number elem))
split)))
                     (append (make-list (cadr split) (car split))
                             prev)))
                  (else (cons elem prev))))
    '()
    arg))

#(define ((bars-per-line-systems-per-page-engraver lst) ctx)
  (let* ((bars-and-systems? (any pair? lst))
         (working-copy (expand-repetitions lst))
         (systems-per-page
           (if bars-and-systems?
               (car working-copy)
               #f))
         (total
           (if systems-per-page
               (1+ (car systems-per-page))
               (1+ (car working-copy))))
         (last-measure-seen (ly:context-property ctx 'internalBarNumber)))
  `((stop-translation-timestep
      . ,(lambda (trans)
          (let ((internal-bar (ly:context-property ctx 'internalBarNumber))
                (current-col (ly:context-property ctx
'currentCommandColumn)))
            ;; we are only interested in the first NonMusicalPaperColumn of
            ;; each measure
            (if (and (> internal-bar last-measure-seen)
                     (= (remainder internal-bar total) 0)
                     (pair? working-copy))
                (begin
                  (set! (ly:grob-property current-col
'line-break-permission) 'force)
                  (set! last-measure-seen internal-bar)
                  (if bars-and-systems?
                      (begin
                        (if (null? (cdr systems-per-page))
                            (begin
                              (set! (ly:grob-property current-col
'page-break-permission) 'force)
                              (if (pair? (cdr working-copy))
                                  (begin
                                    (set! working-copy (cdr working-copy))
                                    (set! systems-per-page (car
working-copy)))
                                  (set! working-copy '())))
                            (set! systems-per-page (cdr systems-per-page)))
                        (set! total (+ total (car systems-per-page))))
                      (begin
                        (if (null? (cdr working-copy))
                            (set! working-copy lst)
                            (begin
                              (set! working-copy (cdr working-copy))))
                              (set! total (+ total (car
working-copy)))))))))))))

%{\layout {
  \context {
    \Score
    \consists #(bars-per-line-systems-per-page-engraver '((1 6) (4 4 4)
(1)))
% 3 pages: 1° page = 2 systèmes, 1°système avec 1 mesure, 2° système avec 4
mesures
% 2° page avec 3 systèmes de 4 mesures....
  }
} 

-----
Cordialement

Bernard
--
Sent from: http://lilypond-french-users.1298960.n2.nabble.com/

---

From: [email-masked]
Date: Sun, 6 Dec 2020 14:21:35 +0100 (CET)

Merci pour l'idée !

Le problème c'est que mon recueil fera environ 150 pages (il en fait 128 pour l'instant, avec la mise en page automatique)

ça va être un peu long de définir le nombre de systèmes par page + le nombre de mesures pas système ^^'

Mais s'il n'y a pas d'autre solution, je retrousserai mes manches !

De : Bernard Meylan <[email-masked]>
À : [email-masked]
Sujet : Re: Recueil - gestion du nombre de système par page
Date : 06/12/2020 12:51:07 Europe/Paris

%{\layout {
\context {
\Score

-----
Cordialement

Bernard

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 6 Dec 2020 14:35:56 +0100

Bonjour,

Le 06/12/2020 à 12:18, [email-masked] a écrit :
> Bonjour à tous,
>
> Je suis en train d'essayer de faire un recueil de partitions, et je 
> n'arrive pas à gérer le nombre de systèmes par page.
>
> De plus, s'il y a un nouveau titre sur la page (changement de 
> mouvement), il n'y ait plus que 5 systèmes de musique.
> si j'utilise page-count=9 : ça fonctionne à peu près ici, parce qu'il 
> n'y a que 4 morceaux avec uniquement des rondes. si j'utilise cette 
> commande dans mon recueil, ça serait compliqué d'estimer le nombre de 
> pages que je souhaite au final.... c'est pour celà que j'aimerai 
> pouvoir régler automatiquement le nombre de système par page

Le problème provient de

\tocAct \markup { }

Pourquoi ceci ? LilyPond est dépassé quant à l'espacement, de la même 
manière qu'avec \markup \box "", par exemple. Si vous souhaitez vraiment 
un espacement vertical supplémentaire, mettez \markup " " (avec une 
espace), voire \markup \vspace #5.1, avec une valeur réglable.

> J'ai essayé d'utiliser :
> min-systems-per-page = 5
> max-systems-per-page = 6
> Dans ce cas, la compilation reste bloquée sur 100% sans terminer et je 
> suis obligé d'arrêter la compilation à la main
>

Il s'agit d'un bug, que Kevin Barry est justement en train de résoudre 
en ce moment même :

https://gitlab.com/lilypond/lilypond/-/merge_requests/529

L'idée, c'est que LilyPond teste différentes configurations de sauts de 
page et leur attribue une note de laideur. Comme elle n'apprécie pas 
l'espacement que vous avez choisi, qu'elle trouve trop étalé, elle donne 
des notes très mauvaises à toutes les configurations qu'elle essaie, ce 
qui la conduit à augmenter le nombre de systèmes toujours plus dans 
l'espoir, évidemment vain, de découvrir une configuration acceptable.

Avec le code de Kevin, elle finit par se rend compte que cela ne sert à 
rien et abandonne la partie.

Comme ceci touche au cœur de LilyPond en C++, je n'ai rien de mieux à 
vous proposer pour l'instant que

\paper {
   page-breaking = #ly:page-turn-breaking
}

Cela semble fonctionner, même si des avertissements étranges sont émis.

Si d'aventure les sauts ne vous convenaient pas, il faudrait ajouter des 
\break à la main ou à l'aide du code de Bernard.

Cordialement,
Jean