lilypond-user
[Top][All Lists]
Advanced

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

Re: Access header-modules from inside markup-command


From: Thomas Morley
Subject: Re: Access header-modules from inside markup-command
Date: Tue, 28 Jun 2022 01:27:49 +0200

Am Mo., 27. Juni 2022 um 13:23 Uhr schrieb Jean Abou Samra <jean@abou-samra.fr>:
>
>
>
> Le 27/06/2022 à 12:12, Thomas Morley a écrit :
> > Hi,
> >
> > https://lsr.di.unimi.it/LSR/Item?id=467 provides a markup-command to
> > access header-entries for use in arbitrary markup.
> > Alas it's limited to $defaultheader.
> > Although there is a comment to add/access other headers like from
> > \score, \bookpar explicit \book, I found no way to do so.
> > I tried to look up '$current-book/'$current-bookpart in parser (and
> > apply ly:book-header on the result), but to no avail, the  book(part)
> > is not found.
> >
> > How to do so?
> >
> > Below some code to play with (I reformated, renamed the original
> > snippet, adding some condition etc):
> >
> > \version "2.22.1"
> >
> > %% LSR 467
> > #(define-markup-command (with-header layout props markup) (markup?)
> >    "Interpret the given markup with the header fields added to the props.
> > This way, one can re-use the same functions (using fromproperty
> > #'header:field) in the header block and as top-level markup."
> > ;; TODO: If we are inside a score, add the score's local header block, too!
> > ;; Currently, I only use the global header block, stored in $defaultheader
> >    (let ((scopes (list $defaultheader)))
> >
> > (pretty-print
> >    (list
> >      (cons '$current-bookpart (ly:parser-lookup '$current-bookpart))
> >      (cons '$current-book (ly:parser-lookup '$current-book))
> >    )
> > )
> >      (if (every module? scopes)
> >          (let* ((alists (map ly:module->alist scopes))
> >                 (prefixed-alist
> >                  (map
> >                    (lambda (alist)
> >                       (map
> >                         (lambda (entry)
> >                           (cons
> >                             (symbol-append 'header: (car entry))
> >                             (cdr entry)))
> >                         alist))
> >                    alists))
> >                 (props
> >                   (append
> >                     prefixed-alist
> >                     props
> >                     (layout-extract-page-properties layout))))
> >            (interpret-markup layout props markup))
> >          (begin
> >            (ly:warning "No header-module found, returning point-stencil")
> >            point-stencil))))
> >
> > %{
> > %% (1) \header and \markup at toplevel
> > %% works
> > \header { my-entry = "Whatever" }
> > \markup \with-header \with-color #red \fromproperty #'header:my-entry
> > %}
> >
> > %{
> > %% (2) \header and \markup in explizit book
> > %% How to make it work?
> > \book {
> >    \header { my-entry = "Whatever" }
> >    \markup \with-header \with-color #red \fromproperty #'header:my-entry
> > }
> > %}
> >
> > % {
> > %% (3) \header and \markup in \bookpart
> > %% %% How to make it work?
> > \bookpart {
> >    \header { my-entry = "Whatever" }
> >    \markup \with-header \with-color #red \fromproperty #'header:my-entry
> > }
> > %}
> >
> > %{
> > %% (4) \header and \markup in toplevel \score
> > %% %% How to make it work?
> > \score {
> >    { b1-\markup \with-header \with-color #red \fromproperty 
> > #'header:my-entry }
> >    \header { my-entry = "Whatever" }
> > }
> > %}
>
>
> I don't have the time to investigate much right now, but I
> think it would be possible by changing the toplevel-score-handler
> and such to set a property in the \layout to the \header, and later
> use that property from the layout argument of the markup command.
>
> This is likely to be a bit fragile, though.

I'll probably try tomorrow...

> What is the use case?
> There may be better ways to achieve what is wanted.

I try to code sort of a tablature for Akkordzither.

Instead of longish descriptions best look at the image at the bottom of
https://gitlab.com/Thomas_Morley/zither-ly/-/tree/development

Obviously I need sort of a TabStaff running top to bottom as opposed
to the usual left to right.

If I use a portrait-paper-size, I can use the default header and need
to rotate the TabStaff. Not knowing how to do it different, I did so
putting the TabStaff into \markup.
This is the master-branch of above linked repo.
Alas, I can't ensure consistent line-width of the TabStaff, because
LilyPond does not accepts settings for line-width exceeding
paper-dimensions. Furthermore, LilyPond not only warns, but rejects my
attempts to set such a line-width.
LilyPond accepts the max width of the page, though because of said
rotation I need up to page-height. This is a show-stopper!
Though, keeping default headers keeps multipe bookparts with different
headers possible.

For landscape pages I can't use the default header (found no way to rotate it).
Thus I put all in one markup, faking the \header with above
\with-header and adding a TabStaff in usual direction there.
All works more nicely and no problems with line-width.
Disadvantages:
x- and y-coordinates are always switched, driving me crazy, lol.
One need to rotate the landscape back to portrait with a different program.
Multiple bookparts with different headers are not possible for now.

So far for now,
  Harm



reply via email to

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