Subject: Table des matières ordonnée

From: Domyck <[email-masked]>
Date: Mon, 4 Jan 2021 10:29:22 -0700 (MST)

J'aimerais effectuer les 2 opérations suivantes :
1) afficher la table des matières dans l'ordre alphabétique des titres
2) Faire apparaître les numéros des partitions plutôt que les numéros de
page.

   Table of Contents
A-mouvement  . . . .  31
B-mouvement  . . . .  33
C-mouvement  . . . .  32

Ci-joint le code minimaliste.
J'ai essayé avec \tocnum, mais ça ne fonctionne pas.
Merci pour votre aide.

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

---

From: Domyck <[email-masked]>
Date: Tue, 5 Jan 2021 01:51:21 -0700 (MST)

Voici mon code :

---

From: Domyck <[email-masked]>
Date: Tue, 5 Jan 2021 14:43:01 -0700 (MST)

Décidément, rien n'apparaît entre les balises raw ! Désolé !
Je supprime donc les balises, j'espère que ça va marcher cette fois.
Merci pour votre patience... et votre aide !

\version "2.20.0"

\paper {
  tocItemMarkup = \tocItemWithDotsMarkup
  tocNumMarkup = \markup \large \column {
    \hspace #1
    \fill-line { \null \italic \fromproperty #'toc:text \null }
    \hspace #1
  }
}

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

\bookpart {
\markup 32
\tocItem \markup "C-mouvement"
%\tocNum \markup "C-mouvement"
\score { \relative c' { a'4 b4 } }
}

\bookpart {
\markup 33
\tocItem \markup "B-mouvement"
%\tocNum \markup "B-mouvement"
\score { \relative c' { c'4 d4 } }
}

\bookpart {
\markup 31
\tocItem \markup "A-mouvement"
%\tocNum \markup "A-mouvement"
\score { \relative c' { e'4 f4 } }
\markup {"..."}
}
\pageBreak

\markuplist \table-of-contents

---

From: Christophe Pochon <[email-masked]>
Date: Wed, 6 Jan 2021 11:25:46 +0100

Bonjour et bienvenue sur cette liste. Pour info, j'ai dû valider
manuellement vos messages car vous n'êtes pas abonné à la liste. Merci d'y
remédier.

Après quelques essais, je pense qu'il serait plus simple de créer votre
table des matières à la main, dans un markup. En effet, l'usage de
\table-of-contents est surtout utile parce qu'on ne connaît pas à l'avance
à quelles pages se trouvera quoi, mais dans votre cas, vous savez
parfaitement à l'avance quel mouvement porte quel numéro.
Donc pour votre exemple :

%%%%%%%%%%%%%5
\version "2.20.0"

\bookpart {
  \markup 32
  \score {\relative  { a'4 b4 } }
}

\bookpart {
  \markup 33
  \score { \relative { c''4 d4 } }
}

\bookpart {
  \markup 31
  \score { \relative  { e''4 f4 } }
  \markup {"..."}
}
\pageBreak

\markup \huge \column {
  \fill-line { \null "Table des matières" \null }
  \hspace #1
  \fill-line {
    \fill-with-pattern #1.5 #CENTER . "A-mouvement"  31}
  \fill-line {
    \fill-with-pattern #1.5 #CENTER . "B-mouvement"  33}
  \fill-line {
    \fill-with-pattern #1.5 #CENTER . "C-mouvement"  32}
}%%%%%%%%%%%%

Christophe Pochon

---

From: Domyck <[email-masked]>
Date: Wed, 6 Jan 2021 06:48:09 -0700 (MST)

Merci pour votre réponse. En effet je croisn qu'il est plus simple de créer
la table des matières à la main, même si, avec les entrées correspondant à
chaque stanza de paroles, cela représente 200 lignes ! (39 partitions de
cantiques).
Par ailleurs, quand, tout en étant connecté, je réponds à un fil, le système
me renvoie la fenêtre suivante. Je clique sur le bouton "Je suis abonné,
laissez-moi poster maintenant". Après quoi je mets mon message et je valide
sans problème. - Ai-je fait une mauvaise manip ?
Merci Lilypond.JPG
<http://lilypond-french-users.1298960.n2.nabble.com/file/t395789/Lilypond.JPG>

---

From: Jean-Charles Malahieude <[email-masked]>
Date: Wed, 6 Jan 2021 19:26:48 +0100

> parfaitement à l'avance quel mouvement porte quel numéro.

On peut tout à fait récupérer le numéro de page (cf. le Manuel de 
notation, section 3.2.5 Référencement des numéros de page) :

%%% le code %%%
\version "2.20.0"

\bookpart {
   \markup 32 \label #'T32

\bookpart {
   \markup 33 \label #'T33

\bookpart {
   \markup 31 \label #'T31

\markup \huge \column {
   \fill-line { \null "Table des matières" \null }
   \hspace #1
   \fill-line {
     \fill-with-pattern #1.5 #CENTER .
     "A-mouvement"
     \concat { "Nº 31 – p. " \page-ref #'T31 "000" "?" }}
   \fill-line {
     \fill-with-pattern #1.5 #CENTER .
     "B-mouvement"
     \concat { "Nº 33 – p. " \page-ref #'T33 "000" "?" }}
   \fill-line {
     \fill-with-pattern #1.5 #CENTER .
     "C-mouvement"
     \concat { "Nº 32 – p. " \page-ref #'T32 "000" "?" }}
   \fill-line {
     \fill-with-pattern #1.5 #CENTER .
     "Z-mouvement"
     \concat { "Nº 127 – p. " \page-ref #'T127 "000" "?" }}
}
%%% qui marche %%%

Cordialement, avec tous mes vœux,
--
Jean-Charles

---

From: Christophe Pochon <[email-masked]>
Date: Wed, 6 Jan 2021 23:21:34 +0100

Oh, joli ! Bravo Jean-Charles ! J'avais fouillé un peu, mais sans trouver
comment faire.

Dommage qu'entre-temps Dominique a tout fait à la main. Vraiment désolé
Dominique. J'aurais dû vous dire d'attendre un peu les réponses des autres.

Bonne soirée,

Christophe Pochon

Le mer. 6 janv. 2021 à 19:26, Jean-Charles Malahieude <[email-masked]> a

---

From: Christophe Pochon <[email-masked]>
Date: Wed, 6 Jan 2021 23:22:53 +0100

Ah mais non. En fait, les numéros 33, 32, 31... sont toujours mis à la
main. Donc bon. Ce n'est pas ce que cherchait à faire Dominique, il me
semble.

Christophe Pochon

Le mer. 6 janv. 2021 à 23:21, Christophe Pochon <[email-masked]>
a écrit :

> Le mer. 6 janv. 2021 à 19:26, Jean-Charles Malahieude <[email-masked]>
> a écrit :
>

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 6 Jan 2021 23:46:39 +0100

Bonjour,

> Décidément, rien n'apparaît entre les balises raw ! Désolé !

Le forum Nabble depuis lequel vous postez nous a joué des tours
plus d'une fois. Si vous écrivez par mail à la liste, tout devrait
bien se passer.

> sans problème. - Ai-je fait une mauvaise manip ?

L'inscription à Nabble et l'inscription à la liste sont deux
choses différentes. Pour vous abonner à la liste de diffusion,
rendez-vous sur https://lists.gnu.org/mailman/listinfo/lilypond-user-fr .

Ce n'est pas une mauvaise manip tant que vous êtes effectivement
inscrit à la liste.

> J'ai essayé avec \tocnum, mais ça ne fonctionne pas.

C'est possible automatiquement ; j'espère qu'il n'est pas trop
tard et que vous n'avez pas encore fait toute la table des
matières à la main (et quoi qu'il arrive, ce sera peut-être
utile à d'autres par le futur).

Le moyen le plus simple, à mon sens en tous cas, consiste à
copier un paquet de définitions depuis le fichier ly/toc-init.ly
et à les modifier légèrement. Vous trouverez l'original ici :

https://gitlab.com/lilypond/lilypond/-/blob/master/ly/toc-init.ly

J'ai commenté mes ajouts.

Veuillez noter qu'en raison de changements apportés à ce
code il y a six mois (la fonctionnalité permettant des tables
des matières à plusieurs niveaux imbriqués, implémentée par
Valentin), il vous faudra une version instable de LilyPond,
téléchargeable à l'adresse http://lilypond.org/development.fr.html

Le code, qui est donc un peu effrayant à première vue, mais il
ne s'agit que d'ajouts épars aux fonctions définies par LilyPond :

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

\version "2.21.80"

#(let ((toc-item-list (list))
        ;;;; Compteur qui augmente au fur et à mesure que
        ;;;; des pièces sont ajoutées à la table des matières.
        (no 1))
    (set! add-toc-item!
     (lambda* (markup-symbol text #:optional label)
                (let* ((id (gensym "toc"))
                       (path (cond
                              ((symbol? label) (list label))
                              ((or (not label) (null? label)) (list id))
                              ((list? label) (reverse label))
                              (else (begin
                                     (ly:warning (_i "Invalid toc label: 
~a")
                                                 label))
                                    (list id))))
                       (name (car path))
                       (parents (cdr path)))
                  (set! toc-item-list
                        (acons id `((name . ,name)
                                    (text . ,text)
                                    (toc-markup . ,markup-symbol)
                                    (parents . ,parents)
                                    (children . ())
                                    (level . ,(length parents))
                                    ;;;; Ajout du numéro de la pièce
                                    (no . ,no))
                               toc-item-list))
                  ;;;; Incrémenter le compteur.
                  (set! no (1+ no))
                  #{ \label $id #})))
    (set! toc-items (lambda ()
                      ;;;; Trier la table des matières par ordre 
alphabétique
                      ;;;; des valeurs du champ 'text.
                      (sort (setup-toc-hierarchy toc-item-list)
                            (lambda (entry1 entry2)
                              (string<?
                                (assq-ref (cdr entry1) 'text)
                                (assq-ref (cdr entry2) 'text)))))))

%%%% Redéfinition de la fonction \tocItem pour n'accepter
%%%% qu'une chaîne de caractères et pas un \markup, car
%%%% il faut pouvoir trier dans l'ordre alphabétique des
%%%% chaînes.

tocItem =
#(define-music-function (text) (string?)
    (add-toc-item! 'tocItemMarkup text '()))

#(define-markup-list-command (table-of-contents layout props) ()
   #:properties ((baseline-skip))
   ( _i "Outputs the table of contents, using the paper variable
@code{tocTitleMarkup} for its title, then the list of lines
built using the @code{tocItem} music function.
Usage: @code{\\markuplist \\table-of-contents}" )
   (let* ((titleMarkup (ly:output-def-lookup layout 'tocTitleMarkup))
          (indentMarkup (ly:output-def-lookup layout 'tocIndentMarkup))
          (toplevelFormatter (ly:output-def-lookup layout 'tocFormatMarkup))
          (toc-alist (toc-items)))
     (ly:output-def-set-variable! layout 'label-alist-table
                                  (append (ly:output-def-lookup layout 
'label-alist-table)
                                          toc-alist))
     (cons (interpret-markup layout props titleMarkup)
           (space-lines baseline-skip
                        (map (lambda (toc-item)
                               (let* ((label (car toc-item))
                                      (alist (cdr toc-item))
                                      (toc-markup (assoc-get 'toc-markup 
alist))
                                      (text (assoc-get 'text alist))
                                      (level (assoc-get 'level alist))
                                      ;;;; Lire le numéro écrit 
précédemment.
                                      (no (assoc-get 'no alist)))
                                 (interpret-markup
                                  layout
                                  (cons (list
                                         (cons 'toc:page
                                               (markup #:with-link label
                                                       #:page-ref label 
"XXX" "?"))
                                         (cons 'toc:text (markup 
#:with-link label text))
                                         (cons 'toc:label label)
                                         (cons 'toc:level level)
                                         ;;;; Rendre le numéro visible 
dans le \paper.
                                         (cons 'toc:no (number->string no))
                                         (cons 'toc:toplevel-formatter 
toplevelFormatter)
                                         (cons 'toc:indent
                                               (make-line-markup
                                                (make-list level 
indentMarkup))))
                                        props)
                                  (ly:output-def-lookup layout 
toc-markup))))
                             toc-alist)))))

\paper {
   tocItemMarkup = \markup \on-the-fly #format-toc-toplevel \fill-line {
     \line { \fromproperty #'toc:indent \fromproperty #'toc:text }
     %%%% Au lieu du numéro de page, 'toc:page, on met le numéro
     %%%% de la pièce.
     \fromproperty #'toc:no
   }
}

%% Exemple simpliste.

\pageBreak

\tocItem \markup "C"
\score {
   \header {
     piece = "C"
   }
   { c'1 }
}

\tocItem \markup "A"
\score {
   \header {
     piece = "A"
   }
   { c'1 }
}

\tocItem \markup "B"
\score {
   \header {
     piece = "B"
   }
   { c'1 }

}

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

Cordialement,
Jean