lilypond-user
[Top][All Lists]
Advanced

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

Re: No pdf marks with bookparts?


From: Thomas Morley
Subject: Re: No pdf marks with bookparts?
Date: Sun, 2 Aug 2020 11:31:23 +0200

Am So., 2. Aug. 2020 um 10:22 Uhr schrieb Thomas Morley
<thomasmorley65@gmail.com>:
>
> Am Sa., 1. Aug. 2020 um 23:06 Uhr schrieb David Kastrup <dak@gnu.org>:
> >
> > Thomas Morley <thomasmorley65@gmail.com> writes:
> >
> > > Hi,
> > >
> > > the following code generates outlined nested pdf-marks, see attached.
> > >
> > > \version "2.21.4"
> > >
> > > \book {
> > >   \markuplist \table-of-contents
> > >   \tocItem x #"foo"
> > >   \tocItem x.y #"foo-1"
> > >   { R1 }
> > > }
> > >
> > > Though, if I switch from \book to \bookpart pdf-marks are gone (while
> > > the table-of-content is still unaffected).
> >
> > Wouldn't that warrant putting the \bookpart inside of a \book?  That's
> > sort of it's point, isn't it?
> >
> > --
> > David Kastrup
>
> Sure. My code-example was intended to be as short as possible.
> Nevertheless, if you add something like
>
>   (write (ly:output-def-lookup paper 'label-alist-table))
>
> to `output-framework' in framework-ps.scm and compile this example you
> get (manually refomated):
>
> ((toc104
>   (name . x)
>   (text . "foo")
>   (toc-markup . tocItemMarkup)
>   (parents)
>   (children y)
>   (level . 0))
>  (toc105
>   (name . y)
>   (text . "foo-1")
>   (toc-markup . tocItemMarkup)
>   (parents x)
>   (children)
>   (level . 1)))
>
> Which is ok.
>
> Though, doing the same with
>
> \book {
>   \bookpart {
>     \markuplist \table-of-contents
>   }
>   \bookpart {
>     \tocItem x #"foo"
>     \tocItem x.y #"foo-1"
>     { R1 }
>   }
> }
>
> Returns an empty list for 'label-alist-table
>
> Thanks,
>   Harm

Well, I've found a workaround, sort of...

Changing output-framework in framework-ps.scm to (modified code is marked):

(define-public (output-framework basename book scopes fields)
  (let* ((port (make-tmpfile basename))
         (tmp-name (port-filename port))
         (outputter (ly:make-paper-outputter port 'ps))
         (paper (ly:paper-book-paper book))
         (header (ly:paper-book-header book))
         (systems (ly:paper-book-systems book))
         (page-stencils (map page-stencil (ly:paper-book-pages book)))
         (landscape? (eq? (ly:output-def-lookup paper 'landscape) #t))
         (page-number (1- (ly:output-def-lookup paper 'first-page-number)))
         (page-count (length page-stencils)))
    (cond-expand
      (guile-2 (set-port-encoding! port "Latin1"))
      (else))
    (initialize-font-embedding)
    (if (ly:get-option 'clip-systems)
        (clip-system-EPSes basename book))
    (if (ly:get-option 'dump-signatures)
        (write-system-signatures basename (ly:paper-book-systems book) 1))
    (output-scopes scopes fields basename)
    (display (file-header paper page-count #t) port)
    ;; don't do BeginDefaults PageMedia: A4
    ;; not necessary and wrong
    (write-preamble paper #t port)
    (handle-metadata header port)
    (for-each
     (lambda (page)
       (set! page-number (1+ page-number))
       (dump-page outputter page page-number page-count landscape?))
     page-stencils)
    (if (ly:get-option 'outline-bookmarks)
        (dump-pdf-bookmarks
;;;;;;;;;;;;;; changed:
         (let* ((lat (ly:output-def-lookup paper 'label-alist-table)))
           (if (pair? lat)
                  lat
                  (ly:output-def-lookup
                         (ly:parser-lookup '$defaultpaper)
                         'label-alist-table)))
         (ly:output-def-lookup paper 'label-page-table)
         port))
    (display "%%Trailer\n%%EOF\n" port)
    (ly:outputter-close outputter)
    (postprocess-output book framework-ps-module (ly:output-formats)
                        basename tmp-name #f)))

and compiling with a post-process-hook like below works with and
without \bookpart:

\version "2.21.4"

#(define (set-paper-label-page-table layout pages)
  (let* ((label-table (ly:output-def-lookup layout 'label-page-table)))
    (if (null? label-table)
        (ly:output-def-set-variable!
          $defaultpaper 'label-alist-table
          (append
            (ly:output-def-lookup $defaultpaper 'label-alist-table)
            (toc-items))))))

\book {
  \paper {
    #(define (page-post-process layout pages)
      (set-paper-label-page-table layout pages))
  }
  \bookpart {
    \markuplist \table-of-contents
  }
  \bookpart {
    \tocItem x #"foo"
    \tocItem x.y #"foo-1"
    { R1 }
  }
}

Not exactly what I'd call pretty...

Cheers,
  Harm



reply via email to

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