Table des matières en colonnes

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 :angry:

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/](https://myrealbook.vintherine.org/) - [http://photos.vintherine.org/](http://photos.vintherine.org/)

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 :angry:

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

?

···
-- 
Vincent Gay
Envoyé depuis mon saxo-phone :)
[https://myrealbook.vintherine.org/](https://myrealbook.vintherine.org/) - [http://photos.vintherine.org/](http://photos.vintherine.org/)
1  5
2  6
3  7
4  8

ç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) :

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

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

···

Le 27/08/2022 à 17:58, Vincent Gay a écrit :

Le 27/08/2022 à 11:20, Jean Abou Samra a écrit :

1 5
2 6
3 7
4 8

ç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

+-----------+

30 34 |
31 35 |
32 36 |
33 37 |
>

+-----------+

ou

+-----------+

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

+-----------+

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

ls2colonnes.odt (27.3 KB)

···

Le 27/08/2022 à 21:41, Jean Abou Samra a écrit :

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

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

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

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
#(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)))

#(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))
}

···

Le 27/08/2022 à 22:42, Vincent Gay a écrit :

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

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

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

···

Le 28/08/2022 à 19:06, Jean Abou Samra a écrit :

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

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.

···

Le 28/08/2022 à 19:06, Jean Abou Samra a écrit :

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

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

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

toc-multicol.ly (8.73 KB)

···

Le 28/08/2022 à 20:47, Vincent Gay a écrit :

Le 28/08/2022 à 19:06, Jean Abou Samra a écrit :

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

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

Merci Jean. je n'ai pas compris ce que signifie 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.

···

Le 29/08/2022 à 21:17, Jean Abou Samra a écrit :

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

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

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

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

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 ?

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.

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.

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

···

Le 29/08/2022 à 23:30, Vincent Gay a écrit :

Le 29/08/2022 à 21:17, Jean Abou Samra a écrit :

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

(1+ ∞)
:wink:

···

Le mardi 30 août 2022 à 10:11:46 UTC+2, Jacques Menu <****@****> a écrit :

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

Bonjour,

Je me permets de relancer juste pour préciser que la fonction ne marche pas dans tous les cas.

Intégré dans mon code, soit le titre de la table des matières prend toute une page et repousse la table à la suivante, soit, si je le mets à "" et mets à la place un oddHeaderMarkup, la deuxième colonne ne le voit pas et se superpose par-dessus.

Mais ce n'est pas très grave…

Bizarre. Un exemple ?

J'utilise cette fonction depuis que Jean l'a développé, avec 2 ou 3 colonnes, et je n'ai jamais rencontré ce problème...
Un exemple ?

Merci pour vos réponses!

C'est un peu compliqué de donner directement mon code, j'ai pas mal d'includes, etc.

Mais si je reprends le code de Jean et que je mets par exemple en commentaire le \tocAct, le saut de page apparaît avec le titre, comme c'est le cas chez moi:

\bookpart {
  $@(map (lambda (i)
           (let ((sym (gensym "act")))
             #{
 %              \tocAct #sym #(format #f "Pièce ~a" i)
               \tocItem #(list sym 'sheet) "Lead sheet"
               \tocItem #(list sym 'bass) "Bass line"
               c'
               #}))
         (iota 300 1))
}

Hum, je crois que j'ai dû oublier des espacements, probablement celui entre la marge du haut et le titre, dans le calcul de l'espace libre, donc mon code met parfois un peu trop de lignes pour cet espace.

Comme je n'ai pas trop le temps, je vous suggère juste de remplacer

         (height (- (ly:output-def-lookup layout 'paper-height)
                    (ly:output-def-lookup layout 'top-margin)
                    (ly:output-def-lookup layout 'bottom-margin))))

par

         (height (- (ly:output-def-lookup layout 'paper-height) 30.0)))

où la valeur 30.0 est à ajuster : avec cette valeur assez grande, il restera de l'espace en bas, diminuez-la progressivement jusqu'à ce que les entrées de la table des matières arrivent à peu près à la marge inférieure.

Cela ne change rien, mais ne vous stressez pas, je vais continuer avec une seule colonne, et à l'occasion, je ferai un script python qui placera judicieusement des \markup.

Tiens, bizarre. Même en mettant une valeur vraiment grande ? Dans ce cas, ça doit être autre chose, mais difficile de savoir sans exemple (mais si c'est plus simple pour vous de contourner que d'extraire un exemple, je comprends complètement).