lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Description erronée de la commande book


From: Ben
Subject: Re: Description erronée de la commande book
Date: Mon, 13 Mar 2023 02:40:45 +0100

*) Merci pour les explications, je comprends mieux la problématique du book. 


*) Pour l'exemple donné, une autre alternative plus basique serait:

chant1.ly
deroulement = { a }
\include "modele.ly"
bookpartI = bookpart

modele.ly
bookpart = \bookpart { \score { \deroulement } }

Mais le résultat final est toujours le même: on se retrouve à devoir gérer un \include et une variable différente par include dans le fichier recueil.ly. Cela peut aller quand il n'y a que trois chants, mais quand il y en a 100, je pense que mon système actuel est finalement encore le plus simple: un seul \include, pas de \book explicite et une compilation conditionnelle via des scripts externes.


*) Enfin, j'ai essayé avec bookpart-level-page-numbering, la table-of-contents s'affiche correctement, mais le clic sur les item devient inutilisable, car il se référence sur les numéros de page du pdf, au lieu de se référencer sur la position réelle du tocitem, n'est-ce pas un petit bug? 


Au plaisir, 

Ben



Le 12 mars 2023 à 21:56, Jean Abou Samra <jean@abou-samra.fr> a écrit :

Le dimanche 12 mars 2023 à 21:02 +0100, Ben a écrit :

Dans votre exemple, vous avez raison, mais si je prends cet autre exemple, cela rend la proposition erronée: 

\version "2.25.1"

\bookpart { \markup "" }

var = "coucou"

\bookpart { \score { \relative c { c d e } } }

Ici, je n'ai bien qu'un seul bloc \score, mais dès lors que j'aimerais rendre le \book explicite, cela va retourner soit une erreur, soit un résultat différent. 

Oui, c'est vrai… Pour moi, « ne contient qu'un bloc \score » se lisait plutôt « est constitué d'un simple bloc \score (donc pas de \bookpart).

Dans l'exemple précédent les \bookpart n'appartiennent en réalité à aucun \book, puisque je ne peux mettre l'instruction \book sans changer le résultat. 

Si, je vous assure, le book existe bel et bien !

Prenons une analogie, par exemple en Python, puisque vous dites que vous écrivez des scripts dans ce langage. Imaginons une seconde, de manière fantaisiste, que la syntaxe de LilyPond soit celle de Python. Les choses (de manière simplifiée) se passent comme s'il y avait le code suivant inséré automatiquement par LilyPond :

implicit_book = Book()
explicit_books = []

def add_bookpart(bookpart: Bookpart) -> None:
    implicit_book.append(bookpart)

def add_book(book: Book) -> None:
    explicit_books.append(book)
    
def all_books() -> list[Book]:
    if implicit_book:
        explicit_books.append(implicit_book)
    return explicit_books

et que vous aviez donc les deux syntaxes suivantes à votre disposition :

add_bookpart(Bookpart(...))
...
add_bookpart(Bookpart(...))

ou

add_book(Book(Bookpart(...), Bookpart(...)))

Vous pouvez alors faire

add_bookpart(Bookpart(Markup("")))
var = Music(relative(c, [c, d, e]))
add_bookpart(Bookpart(Score(Sequential(var, var))))

mais vous ne pouvez pas faire

add_book(Book(
  Bookpart(Markup("")),
  var = Music(relative(c, [c, d, e])) # ??
  Bookpart(Score(Sequential(var, var)))
))

car une affectation est une instruction, qui ne peut pas se mettre à l'intérieur d'une _expression_. Par contre, vous pouvez faire

var = Music(relative(c, [c, d, e]))
add_book(Book(Bookpart(Markup("")), Bookpart(Score(Sequential(var, var)))))

ou bien encore

var = Music(relative(c, [c, d, e]))
second_bookpart = Bookpart(Score(Sequential(var, var)))
add_book(Book(Bookpart(Markup("")), second_bookpart))

Avec LilyPond, la syntaxe est évidemment très différente, mais le principe est exactement le même. Le \book autour de deux \bookpart existe, implicitement (c'est le implicit_book). Vous pouvez aussi créer un \book de manière explicite. Si vous ne pouvez pas mettre d'affectations à l'intérieur du \book, c'est juste pour une question de syntaxe, cela mélange les expressions et les instructions.


Je vais essayer: 

*) Soit 3 chants, Chant1.ly, Chant2.ly, Chant3.ly, etc. avec tous la même structure:

Chant1.ly
\version "2.25.1"
Deroulement = << \new Staff << \relative c { c d e } >> >>
\include "Modele.ily"

*) Soit le fichier Modele.ily avec la structure suivante:

Modele.ily
\bookpart { \score { \Deroulement } }

*) Je peux donc travailler chaque chant de manière indépendante et si je veux un recueil de tous les chants, il suffit de faire cela:

Recueil.ly
\version "2.25.1"
\include "chant1.ly"
\include "chant2.ly"
\include "chant3.ly"

=> grâce au \bookpart, chaque chant s'intègre directement au recueil. 

Mais là de nouveau, l'instruction \book ne peut être placée nulle part, alors que de facto, Recueil.ly est un book. 

Effectivement, c'est plus clair pour moi, merci. À mon avis, plutôt qu'un \include "modèle.ily" qui ajoute un \bookpart, il vaut mieux faire une fonction qui prend les paramètres que vous voulez. Exemple :

% Modele.ily
myBookpart =
#(define-scheme-function (deroulement) (ly:music?)
   #{ \bookpart { \score { \deroulement } } #})

% chant1.ly
% \include "Modele.ily"
deroulement = { c' }
bookpartI = \myBookpart \deroulement

% chant2.ly
% \include "Modele.ily"
deroulement = { d' }
bookpartII = \myBookpart \deroulement

% Recueil.ly
% \include "chant1.ly"
% \include "chant2.ly"
\book { \bookpart { \bookpartI } \bookpart { \bookpartII } }

Voire, si vous voulez vraiment conserver l'approche à base de variables plutôt que de fonctions :

% Modele.ily
% bookparts.\nomBookpart = \bookpart { \score { \deroulement } }

% chant1.ly
deroulement = { c' }
nomBookpart = bookpartI
% \include "Modele.ily"
bookparts.\nomBookpart = \bookpart { \score { \deroulement } }

% chant2.ly
deroulement = { d' }
nomBookpart = bookpartII
% \include "Modele.ily"
bookparts.\nomBookpart = \bookpart { \score { \deroulement } }

% Recueil.ly
% \include "chant1.ly"
% \include "chant2.ly"
\book {
  \bookpart { $(assq-ref bookparts 'bookpartI) }
  \bookpart { $(assq-ref bookparts 'bookpartII) }
}

Cordialement,

Jean



reply via email to

[Prev in Thread] Current Thread [Next in Thread]