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.