Subject: Table des matières ordonnée

From: Dominique Audéoud <[email-masked]>
Date: Thu, 7 Jan 2021 08:56:37 +0100

Merci beaucoup, Jean, pour cette réponse, qui semble répondre à mon besoin.
J'ai installé la version 2.21.82, ainsi que le fichier toc-init.ly dans un
répertoire sys local

Après insertion de la déclaration \include "sys/toc-init.ly" dans le
fichier de test et lancement de la compilation sur l'exemple donné, le
système me renvoie le message suivant :

Pré-traitement des éléments graphiques... <racine-locale>
/sys/toc-init.ly:72:32 <0>: In procedure memoization in expression (let* (#
# # ...) (interpret-markup layout # ...)):

<racine-locale>/sys/toc-init.ly:72:32 <1>: In file "<racine-locale>/sys/
toc-init.ly", line 71: Bad binding précédemment. in expression (let*
((label (car toc-item)) (alist (cdr toc-item)) (toc-markup (assoc-get
(quote toc-markup) alist)) (text (assoc-get (quote text) alist)) (level
(assoc-get (quote level) alist)) précédemment. (no (assoc-get (quote no)
alist))) (interpret-markup layout (cons (list (cons (quote toc:page)
(markup #:with-link label #:page-ref label "XXX" "?")) (cons (quote
toc:text) (markup #:with-link label text)) (cons (quote toc:label) label)
(cons (quote toc:level) level) dans le \paper. (cons (quote toc:no)
(number->string no)) (cons (quote toc:toplevel-formatter)
toplevelFormatter) ...) props) (ly:output-def-lookup layout toc-markup))).

Arrêté avec le code de retour 1.

Désolé, je ne me suis pas (encore) plongé dans le code.
Peut-on avoir encore de l'aide ?
Merci par avance

---

From: Jean Abou Samra <[email-masked]>
Date: Thu, 7 Jan 2021 20:33:23 +0100

Le 07/01/2021 à 08:56, Dominique Audéoud a écrit :

> J'ai installé la version 2.21.82, ainsi que le fichier toc-init.ly 
> <http://toc-init.ly> dans un répertoire sys local
>
> Après insertion de la déclaration \include "sys/toc-init.ly 
> <http://toc-init.ly>" dans le fichier de test et lancement de la 
> compilation sur l'exemple donné, le système me renvoie le message 
> suivant :
>
> Pré-traitement des éléments graphiques... 
> <racine-locale>/sys/toc-init.ly:72:32 <0>: In procedure memoization in 
> expression (let* (# # # ...) (interpret-markup layout # ...)):
>
> <racine-locale>/sys/toc-init.ly:72:32 <1>: In file 
> "<racine-locale>/sys/toc-init.ly <http://toc-init.ly>", line 71: Bad 
> binding précédemment. in expression (let* ((label (car toc-item)) 
> (alist (cdr toc-item)) (toc-markup (assoc-get (quote toc-markup) 
> alist)) (text (assoc-get (quote text) alist)) (level (assoc-get (quote 
> level) alist)) précédemment. (no (assoc-get (quote no) alist))) 
> (interpret-markup layout (cons (list (cons (quote toc:page) (markup 
> #:with-link label #:page-ref label "XXX" "?")) (cons (quote toc:text) 
> (markup #:with-link label text)) (cons (quote toc:label) label) (cons 
> (quote toc:level) level) dans le \paper. (cons (quote toc:no) 

Bonjour,

Ça, c'est encore une surprise du facétieux Nabble, qui
raccourcit les lignes automatiquement en introduisant
des retours à la ligne, ce qui a introduit un mot de
commentaire au milieu du code. Essayez en copiant
plutôt depuis l'autre archive :

https://lists.gnu.org/archive/html/lilypond-user-fr/2021-01/msg00013.html

(Il manque un retour à la ligne quelque part, mais c'est
plus probablement une faute de frappe que j'ai réalisée en
éditant mon message, et puis cela ne pose pas de problème
à la compilation.)

Voilà qui m'apprendra à respecter la sacro-sainte limite
des 80 caractères…

Cordialement,
Jean

---

From: Jean Abou Samra <[email-masked]>
Date: Sat, 9 Jan 2021 23:28:49 +0100

Bonjour,

Le 08/01/2021 à 11:50, Dominique Audéoud a écrit :
> Effectivement, l'erreur disparaît maintenant.
> Wouaouh! La fonction de tri marche super-bien !
> Merci grandement pour votre aide !
>
> Il reste encore 3 problèmes, si vous me permettez encore, et si c'est 
> possible :
>
> 1) Certains caractères spéciaux que j'utilise (Œ, À,É, etc) se 
> retrouvent à la fin.
> Comment peut-on les avoir dans l'ordre comme dans l'exemple ci-dessous ?

Misère, vous avez raison… Le pire, c'est que Guile 1.8 ne
comprend pas l'Unicode et qu'il faut donc, en plus de
définir manuellement une liste de substitutions à opérer
avant la comparaison comme celle qui remplace É par E,
écrire du code peu élégant et que je ne peux pas totalement
garantir pour gérer les accents qui sont représentés sur
plusieurs caractères.

(LilyPond est engagé depuis dix ans dans une transition
fort difficile vers Guile 2, qui, lui, prend en charge l'Unicode.
À l'heure actuelle, il est devenu possible de compiler LilyPond
avec Guile 2, le problème étant la performance qui est toujours
nettement inférieure.)

> 2) La table des matières résultante est compressée verticelement dans 
> une seule page, et est donc illisible. Est-il possible de désactiver 
> la compression de la page, et d'avoir des sauts de pages automatiques ?

Ce n'est pas ce qui se produit dans mes tests, la table des
matières est répartie automatiquement sur plusieurs pages.
Si cela ne marche toujours pas avec le nouveau code,
pourrez-vous donner un exemple complet ?

> 3) J'ai en fait plusieurs strophes (groupe de vers) par pièce.
> Peut-on faire la même chose avec une liste à 2 niveaux ?
> J'ai cru comprendre qu'avec la dernière version Lilypond, les tables 
> des matières fonctionnaient à plusieurs niveaux.

Exactement, c'est ce dont je parlais plus haut. Utiliser
ceci en même temps que la fonction de tri est possible,
mais un peu plus délicat.

Notez qu'un effet secondaire de cet ajout est que vous
ne pourrez plus écrire \tocItem "Chaîne" car l'argument
"Chaîne" serait pris comme le label et il manquerait un
argument. Donc, les formes possibles sont :

- avec label, pour déclarer une pièce faisant partie d'un
groupe :

     \tocItem label "Chaîne"

- avec label et autant de sous-labels que souhaité,
pour former des sous-groupes :

   \tocItem label.souslabel "Chaîne"

- sans label :

   \tocItem \default "Chaîne"

ou bien (astucieux)

   \tocItem \markup "Chaîne"

Le code repris :

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

\version "2.21.80"

#(define to-ascii-replacements
    '(("Â" . "A")
      ("â" . "a")
      ("À" . "A")
      ("à" . "a")
      ("Ä" . "A")
      ("ä" . "a")
      ("Æ" . "A")
      ("æ" . "a")
      ("Ç" . "C")
      ("ç" . "c")
      ("É" . "E")
      ("é" . "e")
      ("Ê" . "E")
      ("ê" . "e")
      ("È" . "E")
      ("è" . "e")
      ("Ë" . "E")
      ("ë" . "e")
      ("Î" . "I")
      ("î" . "i")
      ("Ï" . "I")
      ("ï" . "i")
      ("Ô" . "O")
      ("ô" . "o")
      ("Ö" . "O")
      ("ö" . "o")
      ("Œ" . "O")
      ("œ" . "o")
      ("Û" . "U")
      ("Ü" . "U")))

#(define char-replacements
    (map
      (lambda (entry)
        (cons
          ;;;; Dans le string->list de la chaîne avec le caractère
          ;;;; spécial se trouvent en fait deux caractères, #\303 et un
          ;;;; autre. On ne conserve que l'autre dans la liste
          ;;;; associative.
          (second (string->list (car entry)))
          (first (string->list (cdr entry)))))
      to-ascii-replacements))

#(define (normalize-string str)
    (apply string
           (filter-map
             (lambda (char)
               ;;;; On supprime les #\303 qui indiquent que le caractère
               ;;;; suivant est spécial.
               (if (char=? char #\303)
                   #f
                   (or
                     (assv-ref char-replacements char)
                     char)))
             (string->list str))))

#(define ((compare-func-from-key key-func key-compare) a b)
    (key-compare
      (key-func a)
      (key-func b)))

#(define toc-entry<?
    (compare-func-from-key
      (lambda (entry)
        (normalize-string (assq-ref (cdr entry) 'text)))
      string<?))

#(define (max-common-length-eq lst1 lst2)
    (cond ((null? lst1)
           0)
          ((null? lst2)
           0)
          ((eq? (car lst1)
                (car lst2))
           (1+ (max-common-length-eq
                 (cdr lst1)
                 (cdr lst2))))
          (else
            0)))

#(let ((toc-item-list (list))
        (path '(0))
        (level '()))
    (set! add-toc-item!
     (lambda* (markup-symbol text new-level)
                (let* ((new-level
                         (if (symbol? new-level)
                             (list new-level)
                             new-level))
                       (common-part-length
                         (max-common-length-eq
                           level
                           new-level))
                       (id (gensym "toc")))
                  (if (> (length path) (1+ common-part-length))
                      (set! path
                            (list-head path
                                       (1+ common-part-length))))
                  (list-set! path
                             (1- (length path))
                             (1+ (last path)))
                  (set! path
                        (append! path
                                 (make-list
                                   (-
                                     (1+ (length new-level))
                                     (length path))
                                   1)))
                  (set! toc-item-list
                        (acons id `((text . ,text)
                                    (toc-markup . ,markup-symbol)
                                    (parents . ())
                                    (children . ())
                                    (path . ,(copy-tree path))
                                    (level . 0))
                               toc-item-list))
                  (set! level new-level)

                  #{ \label $id #})))
    (set! toc-items (lambda ()
                      (stable-sort (reverse toc-item-list) toc-entry<?))))

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

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

#(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))
          ;;;; Lire la variable toc-no-separator
          (toc-no-separator (ly:output-def-lookup layout
'toc-no-separator))
          (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
             (filter-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))
                        (children (assoc-get 'children alist))
                        (path (assoc-get 'path alist)))
                   ;;;; On n'affiche pas les entrées qui en contiennent
                   ;;;; d'autres, seulement le dernier niveau.
                   (if (null? children)
                     (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)
                             (cons 'toc:path path)
                             (cons 'toc:toplevel-formatter 
toplevelFormatter)
                             ;;;; Pas d'indentation des sous-niveaux
                             (cons 'toc:indent indentMarkup))
                                                ;(make-line-markup
                                                ; (make-list level 
indentMarkup))))
                            props)
                      (ly:output-def-lookup layout
                                            toc-markup))
                     #f)))
               toc-alist)))))

#(define-markup-command
   (toc-path-with-separator layout props separator)
   (markup?)
   #:properties ((toc:path #f))
   (interpret-markup layout props #{
     \markup \line {
       #@(cdr (apply append
                     (zip (make-list (length toc:path)
                                     separator)
                          (map number->string toc:path))))
     }
   #}))

\paper {
   toc-no-separator = " : "
   tocItemMarkup = \markup
     \bold
     %%%% \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:page
     \toc-path-with-separator ":"
   }
}

%% Exemple (mots au hasard).

\markuplist \table-of-contents

\pageBreak

\tocItem zéphyr "Zéphyr (1)"
\tocItem zéphyr "Zéphyr (2)"
\tocItem galbe "Galbe"
\tocItem capitale.suiteUne "Première pièce du premier sous-groupe de 
Capitale"
\tocItem capitale.suiteUne "Deuxième pièce du premier sous-groupe de 
Capitale"
\tocItem capitale.suiteDeux "Première pièce du deuxième sous-groupe de 
Capitale"
\tocItem capitale.suiteDeux "Deuxième pièce du deuxième sous-groupe de 
Capitale"
\tocItem élision "Élision"

% La table des matières se répartit automatiquement
% sur plusieurs pages.
#(for-each
    (lambda (i)
      (add-score #{ \score { { \tocItem rien "Rien" c' } } #}))
    (iota 50))

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

> Simple question corollaire :
> Le code Lilypond ressemble étrangement à un langage de manipulation de 
> listes, de type Lisp.
> Est-ce que je me trompe ?

Comme l'a signalé Christophe, il s'agit de code Scheme.
LilyPond utilise l'interpréteur Guile, qui est le langage
d'extension officiel du projet GNU.

Nous avons un manuel (pas encore tout à fait complet)
sur les différentes possibilités pour programmer LilyPond
en Scheme :

http://lilypond.org/doc/v2.21/Documentation/extending/index.html

Voici également une ressource rudement utile pour
apprendre le langage Scheme lui-même, dans le
contexte de LilyPond :

https://scheme-book.ursliska.de/introduction/index.html

Cordialement,
Jean

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 11 Jan 2021 07:18:02 +0100

Bonjour,

(Pensez à garder la liste en copie pour que la
discussion puisse se prolonger collectivement.)

Le 10/01/2021 à 21:28, Dominique Audéoud a écrit :
> Merci pour toutes vos réponses, et bravo pour le résultat !
> Voici le résultat de mes essais, en prenant en compte tous vos conseils.
>
> 1) Pour les caractères spéciaux, ça marche très bien.
> J'ai juste eu une surprise avec les guillemets typographiques (voir 
> l'exemple ci-dessous).
> L'insertion de l'élément ("« D" . "D") dans la liste 
> to-ascii-replacements du fichier toc-init.ly <http://toc-init.ly> n'a 
> malheureusement rien donné de plus.
> Si ce n'est pas résoluble, tant pis, je supprimerai les guillemets 
> typographiques dans la TDM.

D'accord, j'ai réécrit la fonction pour opérer des
substitutions arbitraires et rajouté ("«" . ""),
etc. dans la liste pour supprimer les guillemets.

> 2) Après quelques tests, j'ai observé que ce sont les 2 commandes 
> suivantes du paper qui compriment la page de la table des matières :
> systems-per-page = 4
> min-systems-per-page = 3
> (La commande max-systems-per-page ne la comprime pas.)
> Dommage, je les utilisais dans le paper pour toutes les partitions !

Joli ! C'est clairement un bug. Vous seriez très gentil,
si vous parlez un peu l'anglais, de le signaler à la
liste [email-masked] (voir
http://lilypond.org/contact.fr.html) avec un exemple minimal,
par exemple ceci :

\version "2.23.0"

\paper {
   systems-per-page = 3
}

\markuplist { #@(make-list 300 "a") }

Pour le contourner, on peut définir le systems-per-page
ou min-systems-per-page au niveau d'un \bookpart qui
contient toutes les partitions, et placer la table
des matières en dehors de ce \bookpart, soit schématiquement :

\bookpart {
   \paper {
     systems-per-page = 4
   }
   \score { ... }
   \score { ... }
   ...
}

En effet, les variables d'espacement sont propres à
chaque bloc \bookpart comme indiqué sur

http://lilypond.org/doc/v2.22/Documentation/notation/page-breaking#manual-page-breaking

> 3) Le tri marche très bien, presque trop bien !
> En effet, avec le code suivant :
>
> %%%%%%%%%%%%%%%%%
> % Identification de la 1e pièce (via le nom de sa strophe 1)
> \tocItem B-pièce "S 1e vers strophe 1"
> % Strophes successives
> \tocItem B-pièce.strophe "S 1e vers strophe 1"
> \tocItem B-pièce.strophe "U 1e vers strophe 2"
> \tocItem B-pièce.strophe "« D » 1e vers strophe 3"
>
> % Identification de la 2e pièce (via le nom de sa strophe 1)
> \tocItem A-pièce "X 1e vers strophe 1"
> % Strophes successives
> \tocItem A-pièce.strophe "X 1e vers strophe 1"
> \tocItem A-pièce.strophe "B 1e vers strophe 2"
> \tocItem A-pièce.strophe "G 1e vers strophe 3"
> \tocItem A-pièce.strophe "K 1e vers strophe 4"
> %%%%%%%%%%%%%%%%%
>
> J'obtiens le résultat suivant :
> B 1e vers strophe 2 . . . .  2:2:2
> G 1e vers strophe 3 . . . .  2:2:3
> K 1e vers strophe 4 . . . .  2:2:4
> S 1e vers strophe 1 . . . .    1:1
> S 1e vers strophe 1 . . . .  1:2:1
> U 1e vers strophe 2 . . . .  1:2:2
> X 1e vers strophe 1 . . . .    2:1
> X 1e vers strophe 1 . . . .  2:2:1
> « D » 1e vers strophe 3 . .  1:2:3
>
> Alors que j'attendais plutôt celui-ci :
> B 1e vers strophe 2 . . . . .  2:2
> « D » 1e vers strophe 3 . . .  1:3
> G 1e vers strophe 3 . . . . .  2:3
> K 1e vers strophe 4 . . . . .  2:4
> S 1e vers strophe 1 . . . . .    1
> S 1e vers strophe 1 . . . . .  1:1
> U 1e vers strophe 2 . . . . .  1:2
> X 1e vers strophe 1 . . . . .    2
> X 1e vers strophe 1 . . . . .  2:1

Mon idée était plutôt de mettre toutes les pièces
qui sont au même niveau dans le même label, comme
ceci :

\tocItem B-pièce "S 1e vers strophe 1"
\tocItem B-pièce "S 1e vers strophe 1"
\tocItem B-pièce "U 1e vers strophe 2"
\tocItem B-pièce "« D » 1e vers strophe 3"

\tocItem A-pièce "X 1e vers strophe 1"
\tocItem A-pièce "X 1e vers strophe 1"
\tocItem A-pièce "B 1e vers strophe 2"
\tocItem A-pièce "G 1e vers strophe 3"
\tocItem A-pièce "K 1e vers strophe 4"

Et, par exemple, « X 1e vers strophe 1 » s'affiche
comme « 2 : 1 ». Faut-il simplement « 2 » à la
place ? On pourrait enlever tous les « 1 » à la
fin de la liste.

Le code commence à devenir long, je le joins
à ce message.

> J'ai bien conscience que je ne peux guère que tester les propositions...
> Si j'avais quelques années de moins, je crois que je me lancerais dans 
> le code !
> Mais je veux bien continuer à tester, en pensant que cela pourra 
> servir à d'autres.
> Merci beaucoup, en tout cas, pour le temps passé pour nous offrir ces 
> fonctionnalités !

De rien ! C'est un plaisir pour moi.

Cordialement,
Jean

---

From: Dominique Audéoud <[email-masked]>
Date: Mon, 11 Jan 2021 19:47:03 +0100

Wouaouh, le résultat est impeccable ! Rien à dire, la présentation est
irréprochable !
Merci mille fois pour ces améliorations significatives.
Le bug identifié dans le mail précédent sera déclaré dans la liste
https://lists.gnu.org/mailman/listinfo/bug-lilypond dès que j'aurais reçu
la validation de mon inscription.
Bon courage et bien cordialement !

Le lun. 11 janv. 2021 à 07:18, Jean Abou Samra <[email-masked]> a
écrit :

> L'insertion de l'élément ("« D" . "D") dans la liste to-ascii-replacements
> du fichier toc-init.ly n'a malheureusement rien donné de plus.
> Si j'avais quelques années de moins, je crois que je me lancerais dans le
> code !
> Mais je veux bien continuer à tester, en pensant que cela pourra servir à
> d'autres.

---

From: Dominique Audéoud <[email-masked]>
Date: Wed, 13 Jan 2021 09:36:52 +0100

Encore un petite question, si je n'abuse pas !

Tout fonctionne bien sur un ensemble important de pièces, sauf qu'en
utilisant la commande

tocItemMarkup = \tocItemWithDotsMarkup

la numérotation nn:mm dans la TDM saute et donne simplement nn, avec un
décalage des numéros nn.
La mise en commentaire de cette commande fait disparaître le problème.

Doit-on utiliser une autre commande ?
Merci encore par avance

---

From: Dominique Audéoud <[email-masked]>
Date: Wed, 13 Jan 2021 10:42:08 +0100

Voici encore un moyen (peut-être pas très académique !)  de contourner la
compression de la table des matières en utilisant le script toc-init.ly :
%%%%%%%%%%%%%%%%
\version "2.21.82"
\include "toc-init.ly"

\paper {
  systems-per-page = 4
  max-systems-per-page = 4
  min-systems-per-page = 3
}

\tocItem B-pièce "S 1e vers strophe 1"
\tocItem B-pièce "S 1e vers strophe 1"
\tocItem B-pièce "U 1e vers strophe 2"
\tocItem B-pièce "D 1e vers strophe 3"

\bookpart {
  \paper {
    systems-per-page = ##f
    max-systems-per-page = ##f
    min-systems-per-page = ##f
    %%%tocItemMarkup = \tocItemWithDotsMarkup
  }
  \markuplist \table-of-contents
  \markuplist { #@(make-list 300 "entrée de tdm") }
}
%%%%%%%%%%%%%%%%

Bien cordialement

Le mer. 13 janv. 2021 à 09:36, Dominique Audéoud <[email-masked]> a
écrit :

>> to-ascii-replacements du fichier toc-init.ly n'a malheureusement rien
>> donné de plus.

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 13 Jan 2021 20:37:42 +0100

Le 13/01/2021 à 09:36, Dominique Audéoud a écrit :

> la numérotation nn:mm dans la TDM saute et donne simplement nn, avec 
> un décalage des numéros nn.

Bonjour,

C'est normal. Le code que je vous ai fourni contient
(sans les commentaires) :

\paper {
   tocItemMarkup = \markup
     \bold
     \fill-line {

Ceci permet de remplacer les numéros de page par des numéros
de pièces. Si vous rajoutez un  tocItemMarkup = \tocItemWithDotsMarkup,
vous écrasez la définition précédente, et le comportement
par défaut s'applique.

Voici la définition de tocItemWithDotsMarkup dans le
fichier d'initialisation fourni avec LilyPond ly/toc-init.ly :

tocItemWithDotsMarkup = \markup \fill-with-pattern #1 #RIGHT .
\fromproperty #'toc:text \fromproperty #'toc:page

Vous trouverez le fichier en question sur

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

Pour appliquer la même mise en forme à notre table
des matières modifiée, il faut intégrer la commande
\fill-with-pattern dans le tocItemMarkup, comme ceci :

\paper {
   tocItemMarkup = \markup
     \bold
     \fill-with-pattern
       #1
       #RIGHT
       "."

Le code amendé est en pièce jointe.

Cordialement,
Jean

---

From: Dominique Audéoud <[email-masked]>
Date: Thu, 14 Jan 2021 11:23:43 +0100

Ah oui, j'aurais pu y penser, et peut-être compléter le code !
Merci en tout cas, cela fonctionne nickel sur ma TDM, qui contient 184
lignes !
Mon document est prêt pour l'édition. Un grand merci pour votre aide !
Bien cordialement

Le mer. 13 janv. 2021 à 20:37, Jean Abou Samra <[email-masked]> a
écrit :

> tocItemWithDotsMarkup = \markup \fill-with-pattern #1 #RIGHT .  \fromproperty #'toc:text \fromproperty #'toc:page
>