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