On Sat, Dec 10, 2022 at 6:09 AM Jean Abou Samra <j...@abou-samra.fr> wrote:
> Le 09/12/2022 à 23:04, Kieren MacMillan a écrit : > > As far as I know: > > 1. a separate bookpart is required to change the properties that the > titling mechanism can read; and > > 2. a bookpart will always force a page break. > > > > Cue Jean providing code to contradict my claim in 3… 2… 1… ;) > > > [Although 2.23 is the unstable release series, the stable > release 2.24 is going to come out of it very soon, so I > will stick with it.] > > > For a start, you can use \if \on-page #2 to print some > text only on page 2, so you could get along manually with > > \if \on-page #1 ... > \if \on-page #2 ... > ... > > > Doing that automatically is ... not exactly straightforward, > but possible too. > > > \version "2.23.82" > > sceneMark = \tweak details.is-scene-mark ##t \textMark \etc > > \layout { > \context { > \Score > \consists > #(lambda (context) > (let ((scene-text "")) > (make-engraver > (acknowledgers > ((text-mark-interface engraver grob source-engraver) > (when (assq-ref (ly:grob-property grob 'details) > 'is-scene-mark) > (set! scene-text (ly:grob-property grob 'text))))) > ((stop-translation-timestep engraver) > (let ((col (ly:context-property context > 'currentCommandColumn))) > (ly:grob-set-nested-property! > col > '(details scene-text) > scene-text)))))) > } > } > > #(define-markup-command (scene-text layout props gauge) (markup?) > (let ((page-number (chain-assoc-get 'page:page-number props)) > (gauge-stil (interpret-markup layout props gauge))) > (ly:make-stencil > `(delay-stencil-evaluation > ,(delay > (ly:stencil-expr > (interpret-markup > layout > props > (hashv-ref (ly:output-def-lookup layout > 'page-number-scene-text-table) > page-number))))) > (ly:stencil-extent gauge-stil X) > (ly:stencil-extent gauge-stil Y)))) > > \paper { > oddHeaderMarkup = \markup > \fill-line { > "" > \unless \on-first-page-of-part \fontsize #2 \concat { > \fromproperty #'header:title > ": " > %% The argument to \scene-text is used to approximate the dimensions > %% of the final text. > \scene-text "Act X, Scene X" > } > \if \should-print-page-number \fromproperty #'page:page-number-string > } > evenHeaderMarkup = \markup > \fill-line { > \if \should-print-page-number \fromproperty #'page:page-number-string > \unless \on-first-page-of-part \fontsize #2 \concat { > \fromproperty #'header:title > ": " > \scene-text "Act X, Scene X" > } > "" > } > #(use-modules (srfi srfi-1)) > page-post-process = > #(lambda (paper pages) > (for-each > (lambda (page) > (let* ((page-number (ly:prob-property page 'page-number)) > (lines (ly:prob-property page 'lines)) > (table (or (ly:output-def-lookup paper > 'page-number-scene-text-table #f) > (let ((table (make-hash-table))) > (ly:output-def-set-variable! paper > 'page-number-scene-text-table table) > table))) > (first-system > (any (lambda (line) > (ly:prob-property line 'system-grob #f)) > lines)) > (scene-text > (if first-system > (let ((first-column (ly:spanner-bound > first-system LEFT))) > (assq-ref (ly:grob-property first-column 'details) > 'scene-text)) > ""))) > (hashv-set! table page-number scene-text))) > pages)) > } > > > %%%%%%% EXAMPLE > > \header { > title = "Silly Opera" > } > > { > \sceneMark "Act I, Scene i" > c'1 1 1 > \pageBreak > c'1 1 1 > \pageBreak > c'1 1 \sceneMark "Act I, Scene ii" 1 > \pageBreak > c'1 1 1 > } > > > > > Cheers, > Jean > > Hi Jean, Wow, this is really phenomenal! Thank you so much for this code! This should work perfectly for what I need. Many many thanks, brin