Hello, I'm almost embarassed to post this as it's the ugly result of "trying to learn scheme and lilypond internals all at the same time" - but at least it seems to work. I've tried to achieve exactly what you described: _If_ the first word is a dynamic expression, then Shevek's adjustment is applied.
Best Lukas %%% SNIPPET BEGINS \version "2.19.44" #(use-modules (ice-9 regex)) dynamic = #(define-event-function (text) (markup?) (if (string? text) (let* ((underscores-replaced (string-map (lambda (x) (if (eq? x #\_) #\space x)) text) ) (split-text (string-split underscores-replaced #\space)) (first-is-dynamic (string-match "^[mrzfps]*$" (car split-text))) (formatted (map (lambda (word) (if (string-match "^[mrzfps]*$" word) (markup #:dynamic word #:hspace 0.25) (markup #:normal-text #:fontsize 0.625 #:italic word))) split-text)) (offset (lambda (grob) (if first-is-dynamic (let* ( (first-as-dynamic (list (markup #:dynamic (car split-text))) ) (layout (ly:grob-layout grob)) (props (ly:grob-alist-chain grob (ly:output-def-lookup layout 'text-font-defaults))) (dyn-X-extent (ly:stencil-extent (ly:text-interface::interpret-markup layout props (make-line-markup first-as-dynamic)) X)) (width (abs (- (cdr dyn-X-extent) (car dyn-X-extent)))) ) (- 1 (/ width 2)) ) 0) ))) #{ -\tweak X-offset #offset #(make-dynamic-script (make-line-markup formatted)) #}) ;; user provided a full-blown markup, so we don't mess with it: #{ #(make-dynamic-script (markup #:normal-text #:fontsize 0.625 text)) #})) << \new Staff { c''\dynamic "fffff dramatically" } \new Staff { c''\dynamic "slightly more pp" } >> %%% SNIPPET ENDS 2017-08-20 22:24 GMT+02:00 Kieren MacMillan <kieren_macmil...@sympatico.ca>: > Hi Shevek, > > > I posted a snippet to do correct custom dynamic alignment a month or so > ago. > > Yes, I know. I like the alignment very much. > > But I prefer Janek's interface, which offers the ability to put an > arbitrary string (e.g., "poco f, but p sub. ma non troppo") and it Does The > Right Thing™… well, the Right Thing modulo alignment when the leading word > is a dynamic. =\ > > > I tried just copy and pasting my offset callback into Janek's snippet, > but > > it doesn't quite work because the callback relies on assuming the > dynamic is > > at the beginning, and any additional text follows it. > > I think a single "if" added to Janek's function would suffice: if the word > in question is a dynamic (which Janek's function already works out) *AND* > it's the first word (Janek's function *doesn't* do this), then apply an > appropriate X-offset adjustment (similar or identical to yours), otherwise > left-align (which Janek's function already does). > > I'm scrambling to get a commission engraving out the door — what else is > new!? — so I don't have time to climb the Scheme-fu learning curve to get > that done right now… If nobody's done it before this score gets sent off > (mid-week?), I'll try to tackle it myself. > > Thanks, > Kieren. > ________________________________ > > Kieren MacMillan, composer > ‣ website: www.kierenmacmillan.info > ‣ email: i...@kierenmacmillan.info > > > _______________________________________________ > lilypond-user mailing list > lilypond-user@gnu.org > https://lists.gnu.org/mailman/listinfo/lilypond-user >
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user