Subject: Signets de pages pdf

From: Vincent Gay <[email-masked]>
Date: Wed, 24 Aug 2022 18:00:11 +0200

J'ai un vague souvenir à propos de la possibilité de créer des signets 
de pages pour les fichiers pdf mais je ne retrouve pas où j'ai vu ça. 
Ai-je rêvé ?

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

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 24 Aug 2022 18:34:20 +0200

> de pages pour les fichiers pdf mais je ne retrouve pas où j'ai vu ça. 

Si j'ai bien compris ce dont tu parles, ils sont créés automatiquement 
avec la table des matières.

Cordialement,
Jean

---

From: Vincent Gay <[email-masked]>
Date: Wed, 24 Aug 2022 18:47:56 +0200

> avec la table des matières. 

Hum... non justement. Je vois des vignettes mais pas des signets. L'idée 
serait de dupliquer la table des matières dans les signets ce qui 
faciliterait la navigation dans des gros fichiers

Okular

Master PDF Editor

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

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 24 Aug 2022 19:03:03 +0200

Le 24/08/2022 à 18:47, Vincent Gay a écrit :
>> Si j'ai bien compris ce dont tu parles, ils sont créés 
>> automatiquement avec la table des matières. 
>
> Hum... non justement. Je vois des vignettes mais pas des signets. 
> L'idée serait de dupliquer la table des matières dans les signets ce 
> qui faciliterait la navigation dans des gros fichiers

Qu'est-ce que tu entends exactement par des « vignettes » ? J'ai testé 
avec Okular, je vois cela dans l'onglet « Contenu », mais effectivement 
pas dans l'onglet « Signets ». C'est important pour toi que ce soient 
vraiment des signets ?

Copie d'écran :

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 24 Aug 2022 19:04:36 +0200

> Copie d'écran :

Aïe, ce n'est pas passé. Il doit y avoir un souci dans mes paramètres 
Thunderbird. La voici en pièce jointe.

---

From: Vincent Gay <[email-masked]>
Date: Wed, 24 Aug 2022 19:20:02 +0200

> Le 24/08/2022 à 19:03, Jean Abou Samra a écrit :

Je n'ai pas d'onglet contenu dans mon Okular mais j'ai quelque chose 
d’approchant dans Master PDF Editor. Pas très utile.

Les vignettes ça donne ça

Ce que j'aimerai c'est ça :

Ça permettrait de naviguer facilement dans un realbook de plusieurs 
centaines de pages. Ce serait un plus indéniable et il suffirait de 
reprendre les tocItem markups

La page d'Adobe qui va bien

https://helpx.adobe.com/fr/acrobat/using/page-thumbnails-bookmarks-pdfs.html

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 24 Aug 2022 20:03:14 +0200

> https://helpx.adobe.com/fr/acrobat/using/page-thumbnails-bookmarks-pdfs.html

À ce que je comprends de 
https://pspdfkit.com/blog/2019/understanding-pdf-outline/, le format PDF 
comporte une confusion concernant la différence entre les « bookmarks » 
(signets) et la « outline » (table des matières, ou « contenus » dans 
Okular). Au départ, les bookmarks sont faits pour que chaque utilisateur 
du PDF en ajoute ou en enlève à sa guise, tandis que la outline est 
fournie par le document et fixe, mais apparemment, toutes les 
visionneuses ne sont pas de cet avis. À ce que j'en comprends, ton 
Okular n'affiche que les bookmarks. LilyPond ajoute bien les \tocItems, 
ça c'est sûr, mais dans la outline. Mais ton Okular n'affiche qu'un 
onglet pour les signets, ce qui (d'après un test rapide) signifie qu'il 
n'y a pas d'outline dans le document. Bizarre.

À tout hasard, est-ce que tu as mis des \tocItem mais sans \markuplist 
\table-of-contents ? Car c'est ce \markuplist \table-of-contents qui 
ajoute la outline. Si tu ne veux pas que la table des matières s'affiche 
dans le contenu du PDF, tu peux faire

\version "2.23.12"

#(define-markup-command (hide layout props arg) (markup-list?)
    (interpret-markup-list layout props arg)
    empty-stencil)

\markup \hide \table-of-contents

\tocItem \markup "AAA"
{ c' }

---

From: Vincent Gay <[email-masked]>
Date: Wed, 24 Aug 2022 22:47:00 +0200

Le 24/08/2022 à 20:03, Jean Abou Samra a écrit :
> ajoute la outline. 
Non, j'ai tout fait comme il faut

Par contre j'ai avancé un peu avec Okular. La notion de Signet est 
purement interne et absolument pas lié à un pdf : c'est un peu comme les 
marque-pages de Firefox et enregistré dans la config locale. Par contre 
il existe bien un onglet contenu mais celui-ci ne s'affiche que s'il 
existe un contenu. Exemple (New Real Book vol. II) :

Dans ce que je produit avec Lily rien, nada, que dalle ! L’icône ne 
s'affiche même pas. pdf joint (tiré du même exemple que précédemment) et 
code ci-dessous

N.B. je suis toujours en 2.23.11

\version "2.23.11"

\paper {
   indent = 0\mm
   ragged-last-bottom = ##t
   ragged-last = ##f
   %   markup-system-spacing = #'((basic-distance . 18)
   %                              (minimum-distance . 8)
   %                              (padding . 1))
   tocActMarkup = \markup \large \column {
     \hspace #1
     \fill-line { \null \italic \fromproperty #'toc:text \null }
     \hspace #1
   }
   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 "Music Title" }
       \fill-line { \fontsize #3 "Music from Someone" }
     }
   }
}

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

\header { tagline = ##f }

basse = { \clef "bass" \repeat unfold 4 { c1 } }
tenor = { \repeat unfold 4 { e'1 } }
trompette = { \repeat unfold 4 { bes'1 } }
accords = \chordmode { c1:7 }

\book {
   \paper {
     #(set-paper-size "a4")
     print-first-page-number = ##f
   }
   #(define output-suffix "a4")
   \bookpart {
     \paper { line-width = 13.0\cm }
         \markuplist \table-of-contents
   }
   \bookpart {
     \header { subtitle = "For C Instruments" }
     \tocAct CaIV \markup { "For C Instruments" }
     \tocItem \markup { \underline "Trumpet Part" }
     \score {
       <<
         \new ChordNames { \accords }
         \new Staff  \with { instrumentName = Trumpet } \trompette
       >>
     }
   }
   \bookpart {
     \header { subtitle = "For C Instruments" }
     \tocItem \markup { \underline "Tenor Part" }
     \score {
       <<
         \new ChordNames { \accords }
         \new Staff  \with { instrumentName = Tenor } \tenor
       >>
     }
   }
   \bookpart {
     \header { subtitle = "For C Instruments" }
     \tocItem \markup { \underline "Bass Part" }
     \score {
       <<
         \new ChordNames { \accords }
         \new Staff  \with { instrumentName = Bass } \basse
       >>
     }
   }
   \bookpart {
     \header { subtitle = \markup \concat { "For B" \flat " Instruments" } }
     \tocAct BbaIV \markup \concat { "For B" \flat " Instruments" }
     \tocItem \markup { \underline "Trumpet Part" }
     \score {
       <<
         \new ChordNames { \transpose c d \accords }
         \new Staff  \with { instrumentName = Trumpet } \transpose c d 
\trompette
       >>
     }
   }
   \bookpart {
     \header { subtitle = \markup \concat { "For B" \flat " Instruments" } }
     \tocItem \markup { \underline "Tenor Part" }
     \score {
       <<
         \new ChordNames { \transpose c d \accords }
         \new Staff  \with { instrumentName = Tenor } \transpose c d \tenor
       >>
     }
   }
   \bookpart {
     \header { subtitle = \markup \concat { "For E" \flat " Instruments" } }
     \tocAct EbaIV \markup \concat { "For E" \flat " Instruments" }
     \tocItem \markup { \underline "Trumpet Part" }
     \score {
       <<
         \new ChordNames { \transpose c a \accords }
         \new Staff  \with { instrumentName = Trumpet } \transpose c a 
\trompette
       >>
     }
   }
   \bookpart {
     \header { subtitle = \markup \concat { "For E" \flat " Instruments" } }
     \tocItem \markup { \underline "Tenor Part" }
     \score {
       <<
         \new ChordNames { \transpose c a \accords }
         \new Staff  \with { instrumentName = Tenor } \transpose c a \tenor
       >>
     }
   }
}

---

From: Vincent Gay <[email-masked]>
Date: Wed, 24 Aug 2022 22:53:33 +0200

Le 24/08/2022 à 22:47, Vincent Gay a écrit :
> Par contre j'ai avancé un peu avec Okular

Même essai avec Firefox et même résultat

avec The New Real Book vol2

avec mon exemple (lily 2.23.11) icône grisée indisponible, affichage des 
vignettes

---

From: Jean Abou Samra <[email-masked]>
Date: Wed, 24 Aug 2022 23:10:19 +0200

Le 24/08/2022 à 22:47, Vincent Gay a écrit :
>> À tout hasard, est-ce que tu as mis des \tocItem mais sans 
>> \markuplist \table-of-contents ? Car c'est ce \markuplist 
>> \table-of-contents qui ajoute la outline. 
> purement interne et absolument pas lié à un pdf : c'est un peu comme 
> les marque-pages de Firefox et enregistré dans la config locale. Par 
> contre il existe bien un onglet contenu mais celui-ci ne s'affiche que 
> s'il existe un contenu. Exemple (New Real Book vol. II) :
>
> s'affiche même pas. pdf joint (tiré du même exemple que précédemment) 
> et code ci-dessous
>
> [...]

Ah, mais je vois. C'est un bug :

https://gitlab.com/lilypond/lilypond/-/issues/6355

Pour faire court, LilyPond ne produit pas le « contenu » s'il y a des
bookparts. Voici une solution de contournement possible, à insérer
au début du fichier :

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

---

From: Vincent Gay <[email-masked]>
Date: Thu, 25 Aug 2022 10:01:18 +0200

Le 24/08/2022 à 23:10, Jean Abou Samra a écrit :
> Voici une solution de contournement possible, à insérer
> au début du fichier :

Merci Jean, c'est presque parfait. J'imagine avec ça pouvoir faire un 
"vrai" RealBook d'environ 300 partitions. Je suis juste un peu inquiet 
sur le temps de compilation...

Le seul petit problème restant est l'ordre des items

La table des matières en page 1 est parfaitement ordonnée

Mais pas le contenu :

Le code

\version "2.23.11"

\paper {
   indent = 0\mm
   ragged-last-bottom = ##t
   ragged-last = ##f

tocAct =

\book {
   \paper {
     #(set-paper-size "a4")
   \pageBreak
     \tocAct BbaIV \markup { "For B♭ Instruments" }
     \tocAct EbaIV \markup  { "For E♭ Instruments" }

---

From: Jean Abou Samra <[email-masked]>
Date: Thu, 25 Aug 2022 10:51:43 +0200

> La table des matières en page 1 est parfaitement ordonnée

Aïe, j'espérais que tu ne tomberais pas dans ce problème-là...

C'est un deuxième bug. Le pire, c'est que c'est moi-même qui l'ai 
introduit en
2.23.11, en corrigeant un troisième bug. Allons bon. Je m'en suis rendu 
compte
hier grâce à ce fil, et j'ai déjà posté un patch qui résout ce deuxième 
bug :

https://gitlab.com/lilypond/lilypond/-/merge_requests/1575

Une solution de contournement en attendant la 2.23.13 :

\paper {
   #(use-modules (ice-9 match)
                 (srfi srfi-1))
   page-breaking =
     #(lambda (paper-book)
        (let* ((paper (ly:paper-book-paper paper-book))
               (parent (ly:output-def-parent paper))
               (top-paper (if (null? parent)
                              paper
                              parent))
               (alist-before (ly:output-def-lookup top-paper 
'label-page-table))
               (result (ly:optimal-breaking paper-book))
               (alist-after (ly:output-def-lookup top-paper 
'label-page-table))
               (alist-part (let loop ((after alist-after)
                                      (acc '()))
                             (if (eq? after alist-before)
                                 (reverse! acc)
                                 (loop (cdr after)
                                       (cons (car after)
                                             acc)))))
               (new-alist (let loop ((alist alist-part)
                                     (acc '())
                                     (same-pgnum '())
                                     (last-pgnum #f))
                            (match alist
                              (()
                               (append-reverse same-pgnum acc))
                              (((label . page) . rest)
                               (if (or (not last-pgnum)
                                       (eqv? last-pgnum page))
                                   (loop rest
                                         acc
                                         (acons label page same-pgnum)
                                         page)
                                   (loop rest
                                         (append-reverse same-pgnum acc)
                                         (list (cons label page))
                                         page)))))))
          (ly:output-def-set-variable! top-paper 'label-page-table 
(append-reverse new-alist alist-before))
          result))
}

---

From: Jean Abou Samra <[email-masked]>
Date: Thu, 25 Aug 2022 10:55:09 +0200

> La table des matières en page 1 est parfaitement ordonnée

Au fait, au lieu de (par exemple)

je suggère de faire

   \tocItem CaIV.trumpet \markup { \underline "Trumpet Part" }

Cela donne une table des matières hiérarchique, le « Trumpet Part » 
s'insérant à l'intérieur du « For C Instruments ».

---

From: Vincent Gay <[email-masked]>
Date: Thu, 25 Aug 2022 10:13:42 +0200

> sur le temps de compilation...

Capture d'écran avec Acrobat sur téléphone Android

---

From: Vincent Gay <[email-masked]>
Date: Thu, 25 Aug 2022 11:00:21 +0200

Le 25/08/2022 à 10:55, Jean Abou Samra a écrit :
> u fait, au lieu de (par exemple)
>

Ah oui, c'est beaucoup mieux, merci

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