lilypond-user
[Top][All Lists]
Advanced

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

Scheme help? snippet for movement page headers


From: Shevek
Subject: Scheme help? snippet for movement page headers
Date: Mon, 20 Nov 2017 01:45:28 -0700 (MST)

Hi all,

It would be quite nice to be able to use \fromproperty #'header:piece in
oddHeaderMarkup and evenHeaderMarkup, so that the title of the current
movement will display in the page header. Unfortunately, after investigating
the Lilypond source code, I can't see how to make that work, because it
requires the markup command knowing the top system of the current page and
what score it belongs to. That information isn't included in either the
layout or props argument to a markup function.

But! Lilypond has a table of contents feature that is able to find out what
page a particular musical moment happens on, and to print it in a markup.
I've copied and hacked that code to come up with the following very rough
snippet:

\version "2.18.2"

#(define-markup-command (curent-toc-section layout props)
  ()
  (ly:stencil-add (ly:make-stencil
   `(delay-stencil-evaluation
     ,(delay (ly:stencil-expr
              (let* ((table (ly:output-def-lookup layout 'label-page-table))
                      (curr (chain-assoc-get 'page:page-number props))
                      (prevs (filter (lambda (item) (<= curr (cdr item)))
table))
                      (winpage  (apply min (map cdr prevs)))
                      (winner (filter (lambda (item) (eq? (cdr item)
winpage)) prevs))
                      (wintext (cdr (assoc-get (caar winner) (toc-items))))
                      (winmarkup (interpret-markup layout props
                                   (car wintext)))
                     )
                 (display winner)
                 (interpret-markup layout props
                                   (car wintext))
                ))))
   )))


\paper {
  evenHeaderMarkup = \markup { \curent-toc-section " " }
  oddHeaderMarkup = \markup { \curent-toc-section " " }
}

\score {
  \new Staff {
    s1
    \pageBreak
    s1
    \tocItem "Title 1"
  }
}

\score {
  \new Staff {
    s1
    \pageBreak
    s1
    \tocItem "Title 2"
  }
}

The idea here is to put a table of contents entry at the very end of the
music for each movement score, so that the page header reflects the first
system of the page. This behavior can almost certainly be improved, so that
the snippet can coexist with an actual table of context listing movement
beginning pages. Maybe the page header should just reflect if a new movement
starts on that page.

I'd much appreciate feedback on this snippet. In particular, I don't quite
understand how the delayed evaluation part of the code works — I just copied
that from the definition of page-ref in define-markup-commands.scm. It seems
silly to define a whole new stencil when in the end it's just a plain old
markup. For page numbers, it's fine to make the stencil the same size every
time using a template, but since my snippet is for movement titles, and
might be used within text flow, it really ought to have a flexible stencil
extent. Currently, the returned stencil has null extent, since I cut out the
fixed-extent code from page-ref.



--
Sent from: http://lilypond.1069038.n5.nabble.com/User-f3.html



reply via email to

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