4 texidoc = "overriding the molecule callback can also be used to draw a
5 box around arbitrary grobs.
7 TODO: check whether the corners are really correct.
9 TODO: circled molecules.
14 #(define (box-molecule xext yext)
16 (list 'filledbox (- (car xext)) (cdr xext)
17 (- (car yext)) (cdr yext))
21 #(define (widen-interval iv amount)
22 (cons (- (car iv) amount)
26 #(define (make-molecule-boxer callback)
27 (define (molecule-boxer grob)
32 (x-ext (widen-interval (ly-get-molecule-extent mol 0) box-padding))
33 (y-ext (widen-interval (ly-get-molecule-extent mol 1) box-padding))
35 (x-rule (box-molecule (widen-interval x-ext rule-thick)
37 (y-rule (box-molecule (cons 0 rule-thick) y-ext))
40 (set! mol (ly-combine-molecule-at-edge mol 0 1 y-rule (* 0.5 box-padding)))
41 (set! mol (ly-combine-molecule-at-edge mol 0 -1 y-rule (* 0.5 box-padding)))
42 (set! mol (ly-combine-molecule-at-edge mol 1 1 x-rule 0.0))
43 (set! mol (ly-combine-molecule-at-edge mol 1 -1 x-rule 0.0))
51 \score { \notes \relative c'' {
53 \property Voice.TextScript \override #'molecule-callback =
54 #(make-molecule-boxer Text_item::brew_molecule)
58 \property Voice.Stem \override #'molecule-callback =
59 #(make-molecule-boxer Stem::brew_molecule)
61 \property Score.RehearsalMark \override #'molecule-callback =
62 #(make-molecule-boxer Text_item::brew_molecule)
65 \property Voice.Stem \revert #'molecule-callback