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

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

Re: Table des matières ordonnée


From: Jean Abou Samra
Subject: Re: Table des matières ordonnée
Date: Wed, 6 Jan 2021 23:46:39 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.0

Bonjour,


Le 05/01/2021 à 22:43, Domyck a écrit :
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.


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 ?

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'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.

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.

\markuplist \table-of-contents

\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




reply via email to

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