\version "2.12.3" alignGrob = #(define-music-function (parser location grob-to-align reference-grob dir corr) (string? symbol? integer? number?) #{ \overrideProperty $grob-to-align #'after-line-breaking #(lambda (grob) (let* ((sys (ly:grob-system grob)) (array (ly:grob-object sys 'all-elements)) (len (ly:grob-array-length array)) (current-grob-in-search (lambda (q) (assq-ref (ly:grob-property (ly:grob-array-ref array q) 'meta) 'name))) (default-coord (ly:grob-relative-coordinate grob sys X)) (lst '())) ;; find all instances in a system of the grob we want to use for alignment (let lp ((x 0)) (if (< x len) (begin (if (eq? $reference-grob (current-grob-in-search x)) (set! lst (cons (ly:grob-array-ref array x) lst))) (lp (1+ x))))) ;; find the grob with the X-coordinate closest to object to be aligned (let ((ref (car lst))) (define closest (lambda (x) (if (< (abs (- default-coord (ly:grob-relative-coordinate (car x) sys X))) (abs (- default-coord (ly:grob-relative-coordinate ref sys X)))) (set! ref (car x))) (if (not (null? (cdr x))) (closest (cdr x))))) (closest lst) ;; calculate offset to X based on choice of alignment (ly:grob-set-property! grob 'extra-offset `(,(cond ((eq? $dir -1) (- (ly:grob-relative-coordinate ref sys X) default-coord)) ((eq? $dir 0) (- (interval-center (ly:grob-extent ref sys X)) (interval-center (ly:grob-extent grob sys X)))) ((eq? $dir 1) (- (cdr (ly:grob-extent ref sys X)) (cdr (ly:grob-extent grob sys X))))) . ,$corr))))) #} ) \relative c'{ c d e f | \once \override Score.RehearsalMark #'extra-offset = #'(0 . -8.5) \once \override Score.RehearsalMark #'baseline-skip = #9 \mark \markup \center-column { \circle 1 \box A } g f e d | \once \override Score.RehearsalMark #'extra-offset = #'(0 . -8.5) \once \override Score.RehearsalMark #'baseline-skip = #9 \mark \markup \center-column { \flat { \bold \small \italic Fine. } } g f e d | \once \override Score.RehearsalMark #'extra-offset = #'(0 . -8.5) \once \override Score.RehearsalMark #'baseline-skip = #9 \override Score.RehearsalMark #'break-visibility = #begin-of-line-invisible \mark \markup \center-column { \musicglyph #"scripts.ufermata" \box z } } \relative c'{ c d e \alignGrob #"TextScript" #'BarLine #0 #-0.75 f_\markup \magnify #1.25 \box A | \mark \markup \circle 1 g f e \alignGrob #"TextScript" #'BarLine #0 #-0.75 d_\markup \bold \small \italic Fine. | \mark \markup \flat g f e \alignGrob #"TextScript" #'BarLine #0 #-0.5 d_\markup \magnify #1.25 \box z | \override Score.RehearsalMark #'break-visibility = #begin-of-line-invisible \mark \markup \musicglyph #"scripts.ufermata" }