#(define-public (calc-x-offset grob) (ly:grob-property grob 'positioning-done) (let* ((shift (ly:grob-property grob 'toward-stem-shift 0.0)) (note-head-location (ly:self-alignment-interface::centered-on-x-parent grob)) (note-head-grob (ly:grob-parent grob X)) (stem-grob (ly:grob-object note-head-grob 'stem))) (+ note-head-location ;; If the property 'toward-stem-shift is defined and the script ;; has the same direction as the stem, move the script accordingly. ;; Since scripts can also be over skips, we need to check whether ;; the grob has a stem at all. (if (ly:grob? stem-grob) (let ((dir1 (ly:grob-property grob 'direction)) (dir2 (ly:grob-property stem-grob 'direction)) (beams (ly:grob-property stem-grob 'beaming))) (if (and (equal? dir1 dir2) (not (or (and (= dir2 UP) (pair? beams) (not (car beams))) (and (= dir2 DOWN) (pair? beams) (not (cdr beams)))))) (let* ((common-refp (ly:grob-common-refpoint grob stem-grob X)) (stem-location (ly:grob-relative-coordinate stem-grob common-refp X))) (* shift (- stem-location note-head-location))) 0.0)) 0.0)))) \version "2.13.18" \relative c'' { \override Script #'X-offset = #calc-x-offset \voiceOne c8-. d-. e-. f-. \voiceTwo a,8-. b-. c-. d-. }