+ (let*
+ ((props (page-properties paper))
+ (copyright (ly:modules-lookup scopes 'copyright))
+ (tagline-var (ly:modules-lookup scopes 'tagline))
+ (tagline (if (markup? tagline-var) tagline-var TAGLINE))
+ (stencil #f))
+
+ (if last?
+ (set! stencil
+ (ly:stencil-combine-at-edge
+ stencil Y DOWN (interpret-markup paper props tagline)
+ 0.0
+ )))
+
+ (if (and (= 1 page-number)
+ (markup? copyright))
+
+ (set! stencil
+ (ly:stencil-combine-at-edge
+ stencil Y DOWN (interpret-markup paper props copyright)
+ 0.0
+ )))
+
+ stencil))
+
+(define (page-headfoot paper scopes number sym sepsym dir last?)
+ "Create a stencil including separating space."
+ (let*
+ ((header-proc (ly:output-def-lookup paper sym))
+ (sep (ly:output-def-lookup paper sepsym))
+ (stencil (ly:make-stencil "" '(0 . 0) '(0 . 0)))
+ (head-stencil
+ (if (procedure? header-proc)
+ (header-proc paper scopes number last?)
+ #f)))
+
+ (if (and (number? sep) (ly:stencil? head-stencil))
+ (set! head-stencil
+ (ly:stencil-combine-at-edge
+ stencil Y dir head-stencil
+ sep 0.0)))
+
+ head-stencil))
+
+(define-public (default-page-music-height paper scopes number last?)
+ "Printable area for music and titles; matches default-page-make-stencil."
+ (let*
+ ((h (- (ly:output-def-lookup paper 'vsize)
+ (ly:output-def-lookup paper 'top-margin)
+ (ly:output-def-lookup paper 'bottom-margin)))
+ (head (page-headfoot paper scopes number 'make-header 'head-sep UP last?))
+ (foot (page-headfoot paper scopes number 'make-footer 'foot-sep DOWN last?)))
+ (- h (if (ly:stencil? head)
+ (interval-length (ly:stencil-extent head Y))
+ 0)
+ (if (ly:stencil? foot)
+ (interval-length (ly:stencil-extent foot Y))
+ 0))
+ ))
+
+
+(define-public (default-page-make-stencil lines paper scopes number last? )
+ "Construct a stencil representing the page from LINES. "
+ (let*
+ ((top-margin (ly:output-def-lookup paper 'top-margin))
+
+ ;; TODO: naming vsize/hsize not analogous to TeX.
+
+ (hsize (ly:output-def-lookup paper 'hsize))
+ (left-margin (/ (- hsize
+ (ly:output-def-lookup paper 'linewidth)) 2))
+ (vsize (ly:output-def-lookup paper 'vsize))
+ (bottom-edge (- vsize
+ (ly:output-def-lookup paper 'bottom-margin)))
+
+ (head (page-headfoot paper scopes number 'make-header 'head-sep UP last?))
+ (foot (page-headfoot paper scopes number 'make-footer 'foot-sep DOWN last?))
+ (line-stencils (map ly:paper-system-stencil lines))
+ (height-proc (ly:output-def-lookup paper 'page-music-height))
+ (music-height (height-proc paper scopes number last?))
+ (ragged (ly:output-def-lookup paper 'raggedbottom))
+ (ragged-last (ly:output-def-lookup paper 'raggedlastbottom))
+ (ragged-bottom (or (eq? #t ragged)
+ (and last? (eq? #t ragged-last))))
+
+ (spc-left (- music-height
+ (apply + (map (lambda (x)
+ (interval-length (ly:stencil-extent x Y)))
+ line-stencils))))
+ (stretchable-lines (remove ly:paper-system-title? (cdr lines)))
+ (stretch (if (or (null? stretchable-lines)
+ (> spc-left (/ music-height 2))
+ ragged-bottom)
+ 0.0
+ (/ spc-left (length stretchable-lines))))
+
+ (page-stencil (ly:make-stencil '()
+ (cons left-margin hsize)
+ (cons (- top-margin) 0)))
+ (was-title #t))
+
+ (set! page-stencil (ly:stencil-combine-at-edge
+ page-stencil Y DOWN head 0. 0.))
+
+ (for-each
+ (lambda (l)
+ (set! page-stencil
+ (ly:stencil-combine-at-edge
+ page-stencil Y DOWN (ly:paper-system-stencil l)
+ (if was-title
+ 0.0
+ stretch)
+ ))
+
+ (set! was-title (ly:paper-system-title? l)))
+ lines)
+
+ (if (ly:stencil? foot)
+ (set! page-stencil
+ (ly:stencil-add
+ page-stencil
+ (ly:stencil-translate
+ foot
+ (cons 0
+ (+ (- bottom-edge) (- (car (ly:stencil-extent foot Y)))))
+ ))))
+
+ (ly:stencil-translate page-stencil (cons left-margin 0))
+ ))