[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Displaying typesetting information at compile time
From: |
Richard Shann |
Subject: |
Re: Displaying typesetting information at compile time |
Date: |
Mon, 21 Mar 2022 16:24:46 +0000 |
User-agent: |
Evolution 3.38.3-1 |
On Sun, 2022-03-20 at 20:09 +0100, Jean Abou Samra wrote:
>
>
> Le 20/03/2022 à 19:09, Richard Shann a écrit :
> > On Sun, 2022-03-20 at 18:43 +0100, Jean Abou Samra wrote:
> > > \version "2.22.2"
> > >
> > > markWithPageInfo =
> > > %% Must not get called before line breaking
> > > \tweak X-extent #'(0 . 0)
> > > \tweak Y-extent #'(0 . 0)
> > > \tweak horizontal-skylines
> > > #(ly:make-unpure-pure-container ly:grob::simple-horizontal-
> > > skylines-from-extents)
> > > \tweak vertical-skylines
> > > #(ly:make-unpure-pure-container ly:grob::simple-vertical-
> > > skylines-from-extents)
> > > \tweak stencil
> > > #(lambda (grob)
> > > (let* ((sys (ly:grob-system grob))
> > > ;; No broken pieces for systems ...
> > > (alignment (ly:grob-object sys 'vertical-
> > > alignment))
> > > (all-alignments (ly:spanner-broken-into (ly:grob-
> > > original alignment)))
> > > (all-systems (map ly:grob-system all-alignments))
> > > (n-systems (length all-systems))
> > > (all-pages (map (lambda (s) (ly:grob-property s
> > > 'page-
> > > number))
> > > all-systems))
> > > (n-pages (1+ (- (apply max all-pages)
> > > (apply min all-pages))))
> > > (layout (ly:grob-layout grob))
> > > (defs (append `((n-systems . ,(number->string n-
> > > systems))
> > > (n-pages . ,(number->string n-
> > > pages)))
> > > (ly:output-def-lookup layout 'text-
> > > font-
> > > defaults)))
> > > (props (ly:grob-alist-chain grob defs))
> > > (text (ly:grob-property grob 'text)))
> > > (interpret-markup layout props text)))
> > > \mark \etc
> > >
> > > {
> > > \markWithPageInfo \markup { Have \fromproperty #'n-systems
> > > systems
> > > on \fromproperty #'n-pages pages }
> > > \repeat unfold 20 { 1 1 \break }
> > > }
> > Wow! That goes beyond what I had in mind - it actually outputs the
> > information within the typeset (I guess the stuff with skylining
> > might
> > be to avoid the typesetting of this information affecting the
> > number of
> > pages/systems??).
>
>
>
> Sort of, yes. Normally, the RehearsalMark is drawn before line
> breaking
> is done, and its width and height are accounted for during page
> breaking
> and page spacing. At that time, there is obviously no number of pages
> or
> systems available. So I'm giving it predetermined extents and
> skylines,
> which are used for page breaking and page spacing purposes, only
> after
> which the RehearsalMark's stencil is computed. The drawback is that
> it
> could collide with something on top of it.
>
> However, there was a flaw in that code. When you have several scores
> in
> a bookpart, page-count and system-count override the total numbers
> for
> the whole bookpart, but I was counting them per score. Here is a
> fixed
> version:
>
> \version "2.22.2"
>
> \paper {
> page-post-process =
> #(lambda (paper pages)
> (let ((n-systems 0)
> (page-min #f)
> (page-max #f))
> (for-each
> (lambda (page)
> (for-each
> (lambda (line)
> (let ((sys (ly:prob-property line 'system-grob)))
> (if (ly:grob? sys)
> (let ((sys-page (ly:grob-property sys 'page-
> number)))
> (set! n-systems (1+ n-systems))
> (set! page-min (if page-min
> (min page-min sys-page)
> sys-page))
> (set! page-max (if page-max
> (max page-max sys-page)
> sys-page))))))
> (ly:prob-property page 'lines)))
> pages)
> (ly:output-def-set-variable! paper 'n-systems n-systems)
> (ly:output-def-set-variable! paper 'n-pages (1+ (- page-max
> page-min)))))
> }
>
> #(define-markup-command (page-info layout props arg) (markup?)
> (ly:make-stencil
> `(delay-stencil-evaluation
> ,(delay
> (let* ((n-systems (ly:output-def-lookup layout 'n-systems))
> (n-pages (ly:output-def-lookup layout 'n-pages)))
> (ly:stencil-expr
> (interpret-markup
> layout
> (cons `((n-systems . ,(number->string n-systems))
> (n-pages . ,(number->string n-pages)))
> props)
> arg)))))
> '(0 . 0)
> '(0 . 0)))
>
> \header {
> subsubtitle = \markup \page-info \line {
> Have \fromproperty #'n-systems systems
> on \fromproperty #'n-pages pages
> }
> }
>
> \book {
> \bookpart {
> \repeat unfold 10 { 1 1 \break }
> \repeat unfold 10 { 1 1 \break }
> }
> \bookpart {
> \repeat unfold 20 { 1 1 \break }
> \repeat unfold 20 { 1 1 \break }
> }
> }
Thanks again - I think I would prefer the information on the terminal
though so I modified your code to do that:
8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><
\version "2.22.1"
\paper {
page-post-process =
#(lambda (paper pages)
(let ((n-systems 0)
(page-min #f)
(page-max #f))
(for-each
(lambda (page)
(for-each
(lambda (line)
(let ((sys (ly:prob-property line 'system-grob)))
(if (ly:grob? sys)
(let ((sys-page (ly:grob-property sys 'page-
number)))
(set! n-systems (1+ n-systems))
(set! page-min (if page-min
(min page-min sys-page)
sys-page))
(set! page-max (if page-max
(max page-max sys-page)
sys-page))))))
(ly:prob-property page 'lines)))
pages)
(ly:output-def-set-variable! paper 'n-systems n-systems)
(ly:output-def-set-variable! paper 'n-pages (1+ (- page-max
page-min)))))
}
#(define-markup-command (page-info layout props) ()
(ly:make-stencil
`(delay-stencil-evaluation
,(delay
(let* ((n-systems (ly:output-def-lookup layout 'n-systems))
(n-pages (ly:output-def-lookup layout 'n-pages)))
(ly:stencil-expr
(interpret-markup
layout
(cons `((n-systems . ,(number->string n-systems))
(n-pages . ,(number->string n-pages)))
props)
""))
(format #t "pages ~s systems ~s" n-pages n-systems))))
'(0 . 0)
'(0 . 0)))
\markup \page-info
\score
{
{ \repeat unfold 10 { 1 1 \break }
\repeat unfold 13 { 1 1 \break }}
}
8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><8><
However this looks like strange calling \markup just to get the side
effect of outputting the pages and systems info during the page-info
call. But define-markup-command gets the layout parameter while define-
scheme-command does not ... perhaps there is something altogether
simpler?
Richard