layout commun à plusieurs scores

Bonjour,

Mon projet comporte plusieurs (10 à 15) petits \score auxquels j'applique les même ajustements de contexte dans le bloc \layout. Est-il possible de "factoriser" ces (re)définitions redondantes, pour les appliquer à tous les \score du \book ?

  1. Est-il possible d'avoir d'une part un \layout local à chaque \score, où je ne modifierais que la valeur de \indent, et d'autre part toutes les modifications de contexte réunies dans un autre bloc \layout, global, qui ne serait interprété qu'une seule fois, et qui s'appliquerait à tous les \score ?
  2. A défaut d'une unique interprétation, et pour économiser au moins la frappe, quelle syntaxe employer pour réunir toutes les modifications de contexte dans une "macro symbolique", à appeler dans chaque \layout local ? (à la manière d'un #define en C, qui est appliqué au source avant la compilation)
  3. Autre approche : peut-on "surcharger" les définitions par défaut des contextes \ChoirStaff, \Score, \Staff une fois pour toutes (càd à l'échelle du fichier) (ce qui éviterait d'avoir à le rappeler pour chq \score) ? Ou peut-être faut-il créer des alias de ces contextes (\MyChoirStaff, \MyScore, \MyStaff) et les utiliser dans la définition de des systèmes ?

Merci de vos suggestions,
Germain

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\book
{

\score % 1er
{
...musique...

\layout
{
\indent = 60\mm
\context { \ChoirStaff \consists Instrument_name_engraver
\override InstrumentName #'self-alignment-X = #LEFT }
\context { \Score \remove Bar_number_engraver }
\context { \Staff \remove Time_signature_engraver
\override InstrumentName #'self-alignment-X = #RIGHT }
} % layout
}

\score % 2e
{
...musique...

\layout
{
\indent = 60\mm
\context { \ChoirStaff \consists Instrument_name_engraver
\override InstrumentName #'self-alignment-X = #LEFT }
\context { \Score \remove Bar_number_engraver }
\context { \Staff \remove Time_signature_engraver
\override InstrumentName #'self-alignment-X = #RIGHT }
} % layout
}

\score % 3e
{
...musique...

\layout
{
\indent = 60\mm
\context { \ChoirStaff \consists Instrument_name_engraver
\override InstrumentName #'self-alignment-X = #LEFT }
\context { \Score \remove Bar_number_engraver }
\context { \Staff \remove Time_signature_engraver
\override InstrumentName #'self-alignment-X = #RIGHT }
} % layout
}

...plusieurs autres \score...

} % book

  1. Est-il possible d'avoir d'une part un \layout local à chaque \score, où je ne modifierais que la valeur de \indent, et d'autre part toutes les modifications de contexte réunies dans un autre bloc \layout, global, qui ne serait interprété qu'une seule fois, et qui s'appliquerait à tous les \score ?

Oui.
Il suffit de mettre un \layout (ou plusieurs ), en dehors du bloc \score et un \layout à l'intérieur de chaque \score.
par exemple :
%%%%%%%
\layout
{ \context { \ChoirStaff \consists Instrument_name_engraver
\override InstrumentName #'self-alignment-X = #LEFT }
\context { \Score \remove Bar_number_engraver }
\context { \Staff \remove Time_signature_engraver
\override InstrumentName #'self-alignment-X = #RIGHT }
} % layout commun à tous les Score

\score
{
\score \patati % 1er
\layout { \indent = 60\mm } % layout valable uniquement que pour ce score

}

\score
{
\score \patata % 2ème
\layout { \indent = 50\mm }

}

%%%%%%%%
Pour chaque \score, Lilypond collecte tous les \layout accessibles qu'il a rencontrés pour en faire un seul et unique.
NB : le \book est optionnel si on veut un seul pdf en sortie.

  1. A défaut d'une unique interprétation, et pour économiser au moins la frappe, quelle syntaxe employer pour réunir toutes les modifications de contexte dans une "macro symbolique", à appeler dans chaque \layout local ? (à la manière d'un #define en C, qui est appliqué au source avant la compilation)

J'ai appris il y a quelques jours qu'on peut utiliser les \layout dans une variable, avec quelques restrictions.
Je te renvoie à la discussion qui a eu lieu sur la liste anglaise :
http://lists.gnu.org/archive/html/lilypond-user/2008-05/msg00446.html

  1. Autre approche : peut-on "surcharger" les définitions par défaut des contextes \ChoirStaff, \Score, \Staff une fois pour toutes (càd à l'échelle du fichier) (ce qui éviterait d'avoir à le rappeler pour chq \score) ? Ou peut-être faut-il créer des alias de ces contextes (\MyChoirStaff, \MyScore, \MyStaff) et les utiliser dans la définition de des systèmes ?

Encore une fois oui.
http://lilypond.org/doc/v2.11/Documentation/user/lilypond/Defining-new-contexts#Defining-new-contexts
On peut ainsi se faire des fichiers d'inclusions (qu'on appelle avec la commande \include), définissant des contextes personnalisés, dérivés des Staff , Score et consoeurs.

Gilles

Merci de ces réponses !

From: Gilles THIBAULT
To: Germain G. Ivanoff-Trinadtzaty ; Lilypond French users
Sent: Saturday, May 24, 2008 3:48 PM
Subject: Re: layout commun à plusieurs scores

  1. Est-il possible d'avoir d'une part un \layout local à chaque \score, où je ne modifierais que la valeur de \indent, et d'autre part toutes les modifications de contexte réunies dans un autre bloc \layout, global, qui ne serait interprété qu'une seule fois, et qui s'appliquerait à tous les \score ?

Oui.
Il suffit de mettre un \layout (ou plusieurs ), en dehors du bloc \score et un \layout à l'intérieur de chaque \score.
par exemple :
%%%%%%%
\layout
{ \context { \ChoirStaff \consists Instrument_name_engraver
\override InstrumentName #'self-alignment-X = #LEFT }
\context { \Score \remove Bar_number_engraver }
\context { \Staff \remove Time_signature_engraver
\override InstrumentName #'self-alignment-X = #RIGHT }
} % layout commun à tous les Score

\score
{
\score \patati % 1er
\layout { \indent = 60\mm } % layout valable uniquement que pour ce score

}

\score
{
\score \patata % 2ème
\layout { \indent = 50\mm }

}

%%%%%%%%
Pour chaque \score, Lilypond collecte tous les \layout accessibles qu'il a rencontrés pour en faire un seul et unique.
NB : le \book est optionnel si on veut un seul pdf en sortie.

J'avais bien essayé, mais en plaçant le \layout extérieur (commun) EN DESSOUS de tous les \score, ce qui ne marche pas...
Il faut le placer AVANT.

  1. A défaut d'une unique interprétation, et pour économiser au moins la frappe, quelle syntaxe employer pour réunir toutes les modifications de contexte dans une "macro symbolique", à appeler dans chaque \layout local ? (à la manière d'un #define en C, qui est appliqué au source avant la compilation)
    J'ai appris il y a quelques jours qu'on peut utiliser les \layout dans une variable, avec quelques restrictions.
    Je te renvoie à la discussion qui a eu lieu sur la liste anglaise :
    http://lists.gnu.org/archive/html/lilypond-user/2008-05/msg00446.html

J'étais passé à côté (j'ai qq centaines de fils en retard !)

  1. Autre approche : peut-on "surcharger" les définitions par défaut des contextes \ChoirStaff, \Score, \Staff une fois pour toutes (càd à l'échelle du fichier) (ce qui éviterait d'avoir à le rappeler pour chq \score) ? Ou peut-être faut-il créer des alias de ces contextes (\MyChoirStaff, \MyScore, \MyStaff) et les utiliser dans la définition de des systèmes ?

Encore une fois oui.
http://lilypond.org/doc/v2.11/Documentation/user/lilypond/Defining-new-contexts#Defining-new-contexts
On peut ainsi se faire des fichiers d'inclusions (qu'on appelle avec la commande \include), définissant des contextes personnalisés, dérivés des Staff , Score et consoeurs.

Gilles

Je vais "investiguer"...

Tout de bon,
Germain

···

----- Original Message -----