Hey all, I'm starting to work on a markup overhaul and I've been able to frame the problem with the code below. There are two callbacks each for X and pure-Y:
my-x-callback-one my-x-callback-two my-y-callback-one my-y-callback-two my-*-callback-one gives minimal estimates for the given dimension, whereas my-*-callback-two gives maximal estimates. The only code that doesn't lead to overlap is the use of maximal estimates for everything (my-*-callback-two, which I pasted below). Subbing in my-*-callback-one for either value will lead to overlapping. However, my-*-callback-two being very generous, the vertical spacing becomes too large. So, my question before I start fiddling with the C++ side is: is there a way to use non-pure-heights in LilyPond's vertical layout? If not, my proposed game plan is the following (suggestions welcome!): 1) Create a variable in the Paper_column class called pure_x_offset_ 2) From constrained-breaking.cc, run the spring and rods problem on an infinitely long line. Give all paper columns a pure_x_offset_ that comes from this spring and rods problem (this, I'd argue, is the ideal horizontal spacing, unfettered by the length and width of a page). 3) Create a TextScriptSpanner 4) The pure height function of a text script spanner (Text_script_spanner::pure_height (SCM smob, SCM start, SCM end)) would go like such: ---) if `start' is to the right of the TextScriptSpanner's left bound, return 0. ---) otherwise, find the distance between the pure_x_offset_ of the TextScriptSpanner's left bound and the pure_x_offset_ of the column at `end' ---) use this line-width to justify the text, then find the Y-extent of this stencil. this is the pure-Y value between `start' and `end'. Obviously, pure_x_offset_ will get progressively off as a piece continues, but for small ranges of columns, it will likely provide a good estimation of grobs' spacing. But, again, before I spend the 4ish hours necessary to do this, does anyone see any problems with it? Cheers, MS #(define (define-grob-property symbol type? description) (if (not (equal? (object-property symbol 'backend-doc) #f)) (ly:error (_ "symbol ~S redefined") symbol)) (set-object-property! symbol 'backend-type? type?) (set-object-property! symbol 'backend-doc description) symbol) #(define (has-interface? grob interface) (member interface (assoc-get 'interfaces (ly:grob-property grob 'meta)))) #(define-grob-property 'nuggets list? "List of text for a markup.") #(define (my-max x y) (if (> (interval-length x) (interval-length y)) x y)) #(define (my-add x y) (cons (car x) (+ (cdr x) (interval-length y)))) #(define (my-x-callback-one grob) (reduce my-max -1000 (map (lambda (x) (ly:stencil-extent (grob-interpret-markup grob x) X)) (ly:grob-property grob 'nuggets)))) #(define (my-x-callback-two grob) (ly:stencil-extent (grob-interpret-markup grob (make-line-markup (ly:grob-property grob 'nuggets))) X)) #(define (my-y-callback-one grob start end) (ly:stencil-extent (grob-interpret-markup grob (make-line-markup (ly:grob-property grob 'nuggets))) Y)) #(define (my-y-callback-two grob start end) (reduce my-add '(0 . 0) (map (lambda (x) (ly:stencil-extent (grob-interpret-markup grob x) X)) (ly:grob-property grob 'nuggets)))) #(define (find-system grob) (if (has-interface? grob 'system-interface) grob (find-system (ly:grob-parent grob X)))) #(define (my-stencil grob) (let* ((system (find-system grob)) (mkups (map (lambda (x) (markup x)) (ly:grob-property grob 'nuggets))) (r-bound (ly:spanner-bound system RIGHT)) (l-coord (ly:grob-relative-coordinate grob system X)) (r-coord (ly:grob-relative-coordinate r-bound system X))) (grob-interpret-markup grob (markup #:override `(line-width . ,(- r-coord l-coord)) (make-justify-markup mkups))))) foo = #(define-music-function (parser location s) (string?) #{ \once \override TextScript #'nuggets = #(string-split $s #\space) \once \override TextScript #'Y-extent = #(ly:make-unpure-pure-container ly:grob::stencil-height my-y-callback-two) \once \override TextScript #'X-extent = #my-x-callback-two \once \override TextScript #'stencil = #my-stencil #}) \relative c' { \override Score . PaperColumn #'keep-inside-line = ##f \repeat unfold 40 { \foo #"Hello world this is a test of a Scheme markup splitting system." d^\markup { \null } a b c d e f g } } _______________________________________________ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel