Hi Neil, On Wed, Jan 7, 2015 at 4:01 PM, Neil Thornock <neilthorn...@gmail.com> wrote:
> Thanks for the suggestion. While it does avoid the collision, it doesn't > center the separator between staves. I believe the separator is spaced > evenly between the vertical midpoint of each surrounding staff > (line-position 0), and so when the bottom staff is that tall, it encroaches > on the separator. > I believe you are right about the method of calculation. Looking at the file scm/page.scm, at the function called "make-page-stencil," we see that the system-separator stencil is placed using the function "paper-system-staff-extents" which reads a property called 'staff-refpoint-extent (which I would guess is a pair representing the midlines of top/bottom staves.) As an experiment, I replaced calls to paper-system-staff-extents with another function (from paper-system.scm) which looks at the _stencil_, namely paper-system-extent. I'll quote the function with my (tiny) alterations. Sorry, it's a long function! I suppose you could patch the file yourself if you like what you see. (See the attached image.) ;;;; from scm/page.scm: (define (make-page-stencil page) "Construct a stencil representing the page from PAGE." (page-translate-systems page) (let* ((paper-book (page-property page 'paper-book)) (prop (lambda (sym) (page-property page sym))) (layout (ly:paper-book-paper paper-book)) (scopes (ly:paper-book-scopes paper-book)) (lines (page-lines page)) (number (page-page-number page)) ;; TODO: naming paper-height/paper-width not analogous to TeX. (system-xoffset (ly:output-def-lookup layout 'horizontal-shift 0.0)) (system-separator-markup (ly:output-def-lookup layout 'system-separator-markup)) (system-separator-stencil (if (markup? system-separator-markup) (interpret-markup layout (layout-extract-page-properties layout) system-separator-markup) #f)) (page-stencil (ly:make-stencil '())) (last-system #f) (last-y 0.0) (add-to-page (lambda (stencil x y) (set! page-stencil (ly:stencil-add page-stencil (ly:stencil-translate stencil (cons (+ system-xoffset x) (- 0 y (prop 'top-margin))) ))))) (add-system (lambda (system) (let* ((stencil (paper-system-stencil system)) (y (ly:prob-property system 'Y-offset 0)) (is-title (paper-system-title? system))) (add-to-page stencil (ly:prob-property system 'X-offset 0.0) y) (if (and (ly:stencil? system-separator-stencil) last-system (not (paper-system-title? system)) (not (paper-system-title? last-system))) (add-to-page system-separator-stencil 0 (average (- last-y (car (paper-system-extent last-system Y))) ;; NB (- y (cdr (paper-system-extent system Y)))))) ;; NB (set! last-system system) (set! last-y y)))) (head (prop 'head-stencil)) (foot (prop 'foot-stencil)) ) (if (and (ly:stencil? head) (not (ly:stencil-empty? head))) (begin ;; Ensure that the top of the header just touches the top margin. (set! head (ly:stencil-translate-axis head (- 0 (cdr (ly:stencil-extent head Y)) (prop 'top-margin)) Y)) (set! page-stencil (ly:stencil-add page-stencil head)))) (if (and (annotate? layout) (pair? lines)) (begin (set! page-stencil (annotate-top-space (car lines) layout head page-stencil)) (for-each (lambda (sys next-sys) (paper-system-annotate sys next-sys layout)) lines (append (cdr lines) (list #f))) (paper-system-annotate-last (car (last-pair lines)) layout))) (for-each add-system lines) (ly:prob-set-property! page 'bottom-system-edge (car (ly:stencil-extent page-stencil Y))) (ly:prob-set-property! page 'space-left (+ (prop 'bottom-edge) (prop 'bottom-system-edge) (if (and (ly:stencil? foot) (not (ly:stencil-empty? foot))) (car (ly:stencil-extent foot Y)) 0.0))) (if (annotate? layout) (set! page-stencil (ly:stencil-add page-stencil (annotate-space-left page)))) (if (and (ly:stencil? foot) (not (ly:stencil-empty? foot))) (set! page-stencil (ly:stencil-add page-stencil (ly:stencil-translate foot (cons 0 (+ (- (prop 'bottom-edge)) (- (car (ly:stencil-extent foot Y))))))))) (if (ly:output-def-lookup layout 'two-sided #f) (set! page-stencil (ly:stencil-translate page-stencil (cons (prop (if (even? number) 'left-margin 'right-margin)) 0))) (set! page-stencil (ly:stencil-translate page-stencil (cons (prop 'left-margin) 0)))) ;; annotation. (if (annotate? layout) (set! page-stencil (annotate-page layout page-stencil))) page-stencil)) ;;;;;; > It would be better if the separator were centered between the bottom line > of the staff above it and the top line of the staff below it, or maybe > calculated from the staves's actual Y-extent. > > > (The above uses stencil extents, which--I suppose--could lead to some visual irregularity depending on what hangs below/sticks above an extremal staff.) --David
separator-test.pdf
Description: Adobe PDF document
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user