Subject: Table des matières en colonnes

From: Vincent Gay <[email-masked]>
Date: Sat, 27 Aug 2022 09:16:11 +0200

Bonjour la liste

J'avance péniblement sur mon projet de recueil de partitions. Mon 
problème du jour est la place occupée par la table des matière. Avec 300 
titres multipliés par 3 entrées en moyenne ça va faire plus de 30 pages 😠

Serait-il possible  de la présenter en deux ou trois colonnes ? 
Ci-dessous une capture d'écran réduite avec 3 titres seulement et le 
code de mon bloc \paper. Il est difficile d'envoyer le code complet du 
fait de la multiplication des \includes et des fonctions additionnelles 
mais si nécessaire je tacherai de faire un exemple minimal.

Merci et bon week-end

% correction de bug transmis par Jean
#(let ((default-table-of-contents make-table-of-contents-markup-list))
    (define-markup-list-command (table-of-contents layout props) ()
      (let* ((result (interpret-markup-list layout props 
(default-table-of-contents)))
             (alist (ly:output-def-lookup layout 'label-alist-table))
             (parent (ly:output-def-parent layout)))
        (when (not (null? parent))
          (ly:output-def-set-variable! parent 'label-alist-table alist))
        result)))

\paper {
   ragged-last-bottom = ##t
   ragged-last = ##f
   tocActMarkup = \markup
     {  \vspace #1 \hspace #-4 \italic \fromproperty #'toc:text }
   tocItemMarkup = \markup
   \fill-line {
     \fill-with-pattern #1.5 #CENTER .
     \line {
       \hspace #-4 %% Cancelling the first level's tocIndentMarkup
       \fromproperty #'toc:indent \fromproperty #'toc:text
       \hspace #2
     }
     \fromproperty #'toc:page
   }
   tocTitleMarkup =
   \markup {
     \column {
       \vspace #3
       \fill-line { \fontsize #9 "My Real Book" }
        \vspace #1
       \fill-line { \fontsize #3 "For C Instruments" }
        \vspace #2
     }
   }
}

tocAct =
#(define-music-function (label text) (symbol-list-or-symbol? markup?)
    (add-toc-item! 'tocActMarkup text label))

-- 
Vincent Gay
Envoyé depuis mon saxo-phone :)
https://myrealbook.vintherine.org/  -http://photos.vintherine.org/

---

From: Jean Abou Samra <[email-masked]>
Date: Sat, 27 Aug 2022 11:20:16 +0200

> Le 27 août 2022 à 09:41, Vincent Gay <[email-masked]> a écrit :
> 
>  Bonjour la liste
> 
> J'avance péniblement sur mon projet de recueil de partitions. Mon problème du jour est la place occupée par la table des matière. Avec 300 titres multipliés par 3 entrées en moyenne ça va faire plus de 30 pages 😠
> 
> Serait-il possible  de la présenter en deux ou trois colonnes ? Ci-dessous une capture d'écran réduite avec 3 titres seulement et le code de mon bloc \paper. Il est difficile d'envoyer le code complet du fait de la multiplication des \includes et des fonctions additionnelles mais si nécessaire je tacherai de faire un exemple minimal.
> 
> Merci et bon week-end

Avant toute chose, est-ce que tu souhaites une disposition comme ceci

1  2
3  4
5   6
7   8

ou bien comme ceci

1  5
2   6
3  7
4   8

?

>      (let* ((result (interpret-markup-list layout props (default-table-of-contents)))
> https://myrealbook.vintherine.org/ - http://photos.vintherine.org/

---

From: Vincent Gay <[email-masked]>
Date: Sat, 27 Aug 2022 17:58:08 +0200

ça me paraît plus logique

Par contre on change de colonne avant de changer de page donc ça fait 
quelque chose comme ça (si c'est possible) :

1 	

	2
1 	9 	
	17 	25
2 	10 	
	18 	26
3 	11 	
	19 	27
4 	12 	
	20 	28
5 	13 	
	21 	29
6 	14 	
	22 	30
7 	15 	
	23 	31
8 	16 	
	24 	32

---

From: Jean Abou Samra <[email-masked]>
Date: Sat, 27 Aug 2022 21:41:33 +0200

> quelque chose comme ça (si c'est possible) :

Et sur la dernière page, tu souhaites que ce soit comment ?

+-----------+
|  30  34   |
|  31  35   |
|  32  36   |
|  33  37   |
|           |
|           |
|           |
+-----------+

ou

+-----------+
| 30  36    |
| 31  37    |
| 32        |
| 33        |
| 34        |
| 35        |
+-----------+

---

From: Vincent Gay <[email-masked]>
Date: Sat, 27 Aug 2022 22:42:03 +0200

celle çi.

Tiens, je te l'ai fais avec Libreoffice 2 colonnes et un ls de mon 
répertoire

Bonne nuit à tous et merci à Jean

---

From: Jean Abou Samra <[email-masked]>
Date: Sun, 28 Aug 2022 19:06:11 +0200

> Bonne nuit à tous et merci à Jean

Tu me remercieras quand tu seras satisfait du résultat :-)

Voici un brouillon qui fonctionne à peu près mais n'est pas encore très
sophistiqué. En particulier, tu voudrais probablement éviter que les 
différentes
entrées pour une même pièce (lead sheet, bass line, harmonic grid, ...) ne
se retrouvent sur des colonnes différentes, mais je ne l'ai pas encore 
implémenté.

Cordialement,
Jean

\version "2.23.12"

% Toujours le même contournement de bug

#(use-modules (ice-9 match))

#(define (group-to-fill-partial-sums lst weight threshold initial)
    (let loop ((lst lst)
               (i 0)
               (partial-sum (initial 0))
               (acc '()))
      (match lst
        (()
         (reverse! (map reverse! acc)))
        ((elt . rest)
         (let* ((elt-weight (weight elt))
                (new-sum (+ partial-sum elt-weight)))
           (cond
            ((null? acc)
             (loop rest i new-sum (list (list elt))))
            ((<= new-sum threshold)
             (loop rest i new-sum (cons (cons elt (car acc))
                                             (cdr acc))))
            (else
             (loop rest
                   (1+ i)
                   (+ (initial (1+ i))
                      elt-weight)
                   (cons (list elt)
                         acc)))))))))

#(define (index-map f . lsts)
    (let loop ((lsts lsts)
               (i 0))
      (if (any null? lsts)
          '()
          (cons (apply f i (map car lsts))
                (loop (map cdr lsts)
                      (1+ i))))))

#(define-markup-list-command (multicolumn-toc layout props columns) (index?)
    #:properties ((baseline-skip)
                  (padding 5)
                  (line-width))
    (let ((width (/ (- line-width (* padding (1- columns)))
                      columns))
          (height (- (ly:output-def-lookup layout 'paper-height)
                     (ly:output-def-lookup layout 'top-margin)
                     (ly:output-def-lookup layout 'bottom-margin))))
      (let ((mkup (ly:output-def-lookup layout 'tocItemMarkup)))
        (ly:output-def-set-variable! layout 'tocItemMarkup 
(make-override-markup `(line-width . ,width) mkup)))
      (match-let*
            (((title . stils)
              (interpret-markup-list layout
                                     props
(make-table-of-contents-markup-list)))
             (split (group-to-fill-partial-sums
                     stils
                     (lambda (stil)
                       (+ (interval-length (ly:stencil-extent stil Y))
                          baseline-skip))
                     height
                     (let ((title-height (interval-length 
(ly:stencil-extent title Y))))
                       (lambda (i)
                         (if (< i columns)
                             title-height
                             0)))))
             (cols (group-to-fill-partial-sums
                    split
                    (const 1)
                    columns
                    (const 0))))
        (cons title
              (map (lambda (page-cols)
                     (apply ly:stencil-add
                            (index-map
                             (lambda (i col-stils)
                               (ly:stencil-translate-axis
                                (stack-stencils Y DOWN baseline-skip 
col-stils)
                                (* i (+ width padding))
                                X))
                             page-cols)))
                   cols)))))

\bookpart {
   \paper {
     left-margin = 20
     right-margin = 20
   }
   \markuplist
   % les \override sont facultatifs
   \override #'(padding . 10)
   \override #'(baseline-skip . 2.5)
   \multicolumn-toc #3
}

\bookpart {
   $@(map (lambda (i)
            #{ \tocItem #(format #f "Item ~a" i) c' #})
          (iota 150))
}

---

From: Vincent Gay <[email-masked]>
Date: Sun, 28 Aug 2022 18:47:43 +0000 (UTC)

Le 28/08/2022 à 19:06, Jean Abou Samra a écrit :
Tu me remercieras quand tu seras satisfait du résultat :-)

Déjà c'est magnifique. Le réglage du nombre de colonnes, de l'espacement entre colonnes et entre les lignes vont au delà de ce que je pouvais imaginer.

En particulier, tu voudrais probablement éviter que les différentes
entrées pour une même pièce (lead sheet, bass line, harmonic grid, ...) ne
se retrouvent sur des colonnes différentes, mais je ne l'ai pas encore implémenté.

Oui, c'est la seule remarque que je me suis faite

Pour l'heure je ne suis qu'à 10 entrées (soit 31 lignes) mais dans quelques jours je po

---

From: Vincent Gay <[email-masked]>
Date: Sun, 28 Aug 2022 22:15:42 +0200

> Tu me remercieras quand tu seras satisfait du résultat :-)

Il faudrait un jour que je compte le nombre de choses que je peux faire 
grâce à Jean et que je n'aurai jamais pu faire sans lui. Par bonheur, 
quand ça fini par passer dans une release, je me dis que mes idées ne 
sont pas aussi loufoque que je ne le craignais et que ça peut servir à 
d'autre.

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 29 Aug 2022 21:17:58 +0200

Le 28/08/2022 à 20:47, Vincent Gay a écrit :
> Déjà c'est magnifique. Le réglage du nombre de colonnes, de 
> l'espacement entre colonnes et entre les lignes vont au delà de ce que 
> je pouvais imaginer.
>

J'ai fini par trouver une solution qui me plaît assez. La voici
en pièce jointe.

---

From: Vincent Gay <[email-masked]>
Date: Mon, 29 Aug 2022 23:30:34 +0200

> J'ai fini par trouver une solution qui me plaît assez. La voici

Merci Jean.

je n'ai pas compris ce que signifie

>   %% Attention : s'il y a plusieurs éléments à l'intérieur du 
> tocActMarkup,
>   %% ne pas faire \new-toc-group { ... } mais \new-toc-group \line { ... }

De quels genre d'éléments peut-il s'agir ?

Pour l'heure j'ai fait avec ce que j'avais et ça marche bien. 
J'essaierai avec 3 colonnes quand j'aurai intégré suffisamment de 
morceaux mais c'est assez long car j'ai plusieurs versions de grilles 
harmoniques et je dois tout convertir à la main. Sans compter les \mark 
qui ne fonctionnent plus bien avec \polyMark.

Merci encore.

---

From: Jean Abou Samra <[email-masked]>
Date: Mon, 29 Aug 2022 23:46:42 +0200

> De quels genre d'éléments peut-il s'agir ?

Je veux dire qu'il faut donner seulement un argument à
\new-toc-group, pas plusieurs arguments entre accolades.

OK :

\new-toc-group \italic ...

Pas OK :

\new-toc-group { ... }

OK :

\new-toc-group \line { ... }

Dans le même tonneau, il arrive que les gens soient surpris par la
différence de rendu entre ces deux lignes, ou ne comprennent pas ce
qu'il faut pour obtenir le rendu de la deuxième :

\markup \rotate #30 { a b c d }
\markup \rotate #30 \line { a b c d }

Car si \fonction est une fonction pour markups qui accepte un argument
de type markup (plus précisément son dernier argument),

\fonction [arguments] { plusieurs markups }

est une sorte d'équivalent à

{ \fonction [arguments] markup1 \fonction [arguments] markup2 ... }

Le code

\markup \rotate #30 { a b c d }

fait la même chose que

\markup { \rotate #30 a \rotate #30 b \rotate #30 c \rotate #30 d }

Et avec \new-toc-group, ça ne va pas parce que cette commande ajoute
une sorte de marqueur qui identifie un tocAct, et le marqueur doit
se trouver sur le markup entier.

> harmoniques et je dois tout convertir à la main. Sans compter les 
> \mark qui ne fonctionnent plus bien avec \polyMark.

Ah oui, j'avais oublié cette histoire de polymarks (enfin non, je n'ai
pas oublié \textMark et \textEndMark dont nous discutions sur 
lilypond-devel,
mais j'avais oublié que tu avais besoin d'un polymark qui marche aussi
avec \mark en attendant). Deux minutes, je te fais ça (et je le poste dans
le fil qui va bien).

Jean

---

From: Jacques Menu <[email-masked]>
Date: Tue, 30 Aug 2022 10:11:15 +0200

> Il faudrait un jour que je compte le nombre de choses que je peux faire grâce à Jean et que je n'aurai jamais pu faire sans lui. 

J’ai fait le calcul pour nous tous : ∞

JM

---

From: Ya Gloops <[email-masked]>
Date: Tue, 30 Aug 2022 08:50:02 +0000 (UTC)

(1+ ∞)
;-)

JM