--- /dev/null
+\version "2.13.11"
+\header {
+ texidoc = "The left text of a @code{DynamicTextSpanner} is
+left-aligned to its anchor note.
+"
+}
+
+\relative c' {
+ \crescTextCresc
+ \dimTextDim
+ c4\< c c c\!
+ c4\> c c c\!
+}
--- /dev/null
+\version "2.13.11"
+\header {
+ texidoc = "The space between an absolute dynamic and a dynamic text
+span can be changed using @code{'right-padding}.
+"
+}
+
+\relative c' {
+ \dimTextDim
+ \once \override DynamicText #'right-padding = #0
+ c4\fff\> c c c\!
+}
if (finished_spanner_)
finished_spanner_->set_bound (RIGHT, script_);
if (current_spanner_)
- {
- current_spanner_->set_bound (LEFT, script_);
-
- if (!Hairpin::has_interface (current_spanner_))
- set_nested_property (current_spanner_,
- scm_list_3 (ly_symbol2scm ("bound-details"),
- ly_symbol2scm ("left"),
- ly_symbol2scm ("attach-dir")),
- scm_from_int (RIGHT));
- }
+ current_spanner_->set_bound (LEFT, script_);
}
}
"Dynamic line spanner."
'(avoid-slur))
+(ly:add-interface
+ 'dynamic-text-interface
+ "An absolute text dynamic."
+ '(right-padding))
+
(ly:add-interface
'dynamic-text-spanner-interface
"Dynamic text spanner."
(font-shape . italic)
(outside-staff-priority . 250)
(positioning-done . ,ly:script-interface::calc-positioning-done)
+ (right-padding . 0.5)
(self-alignment-X . ,CENTER)
(self-alignment-Y . ,CENTER)
(stencil . ,ly:text-interface::print)
(Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
(meta . ((class . Item)
(interfaces . (dynamic-interface
+ dynamic-text-interface
font-interface
script-interface
self-alignment-interface
(DynamicTextSpanner
. (
+ (before-line-breaking . ,dynamic-text-spanner::before-line-breaking)
(bound-details . ((right . ((attach-dir . ,LEFT)
(Y . 0)
(padding . 0.75)
(left . ((attach-dir . ,LEFT)
(Y . 0)
- (stencil-offset . (0 . -0.5))
- (padding . 0.5)
+ (stencil-offset . (-0.75 . -0.5))
+ (padding . 0.75)
))
(left-broken . ((attach-dir . ,RIGHT)
))
START
STOP))
+(define-public (dynamic-text-spanner::before-line-breaking grob)
+ "Monitor left bound of @code{DynamicTextSpanner} for absolute dynamics.
+If found, ensure @code{DynamicText} does not collide with spanner text by
+changing @code{'attach-dir} and @code{'padding}. Reads the
+@code{'right-padding} property of @code{DynamicText} to fine tune space
+between the two text elements."
+ (let ((left-bound (ly:spanner-bound grob LEFT)))
+ (if (grob::has-interface left-bound 'dynamic-text-interface)
+ (let* ((details (ly:grob-property grob 'bound-details))
+ (left-details (ly:assoc-get 'left details))
+ (my-padding (ly:assoc-get 'padding left-details))
+ (script-padding (ly:grob-property left-bound 'right-padding 0)))
+
+ (and (number? my-padding)
+ (ly:grob-set-nested-property! grob
+ '(bound-details left attach-dir)
+ RIGHT)
+ (ly:grob-set-nested-property! grob
+ '(bound-details left padding)
+ (+ my-padding script-padding)))))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; lyrics