;; these props ARE allowed to shrink below default size
(define shrinkable-props
- '(
- ;; TODO: uncomment spacing-increment here once Issue 3987 is fixed
- ;; override at the 'Score level
- ;(SpacingSpanner spacing-increment)
-
- ;; lengths and heights
- (Beam length-fraction)
- (Stem length-fraction)
- (Stem beamlet-default-length)
- (Slur height-limit)
- (Slur minimum-length)
- (PhrasingSlur height-limit)
- (PhrasingSlur minimum-length)
-
- ;; Beam.beam-thickness is dealt with separately below
- ))
+ (let ((baseline-skip-props
+ (find-named-props 'baseline-skip all-grob-descriptions))
+ (word-space-props
+ (find-named-props 'word-space all-grob-descriptions)))
+ (append
+ baseline-skip-props
+ word-space-props
+ '(
+ ;; TODO: uncomment spacing-increment here once Issue 3987 is fixed
+ ;; override at the 'Score level
+ ;(SpacingSpanner spacing-increment)
+
+ ;; lengths and heights
+ (Beam length-fraction)
+ (Stem length-fraction)
+ (Stem beamlet-default-length)
+ (Stem double-stem-separation)
+ (Slur height-limit)
+ (Slur minimum-length)
+ (PhrasingSlur height-limit)
+ (PhrasingSlur minimum-length)
+
+ ;; Beam.beam-thickness is dealt with separately below
+ ))))
#{
\context Bottom {
%% TODO: uncomment \newSpacingSection once Issue 3990 is fixed
;; these props ARE allowed to shrink below default size
(define shrinkable-props
- (let ((space-alist-props
- (find-all-space-alist-props all-grob-descriptions)))
+ (let* ((baseline-skip-props
+ (find-named-props 'baseline-skip all-grob-descriptions))
+ (word-space-props
+ (find-named-props 'word-space all-grob-descriptions))
+ (space-alist-props
+ (find-named-props 'space-alist all-grob-descriptions)))
(append
+ baseline-skip-props
+ word-space-props
space-alist-props
'(
;; override at the 'Score level
(BarLine hair-thickness)
(BarLine thick-thickness)
(Stem beamlet-default-length)
+ (Stem double-stem-separation)
))))
#{
shrinkable-props))
%% scale settings
- %% (but only if staff magnification is changing)
+ %% (but only if staff magnification is changing
+ %% and does not equal 1)
#(scale-fontSize 'magnifyStaff mag)
#(scale-props 'magnifyStaff mag #f unshrinkable-props)
#(scale-props 'magnifyStaff mag #t shrinkable-props)
;; defined as a function instead of a list because the
;; all-grob-descriptions alist is not available yet
-(define-public (find-all-space-alist-props grob-descriptions)
- "Used by @code{\\magnifyStaff}. When @var{grob-descriptions} is equal
-to the @code{all-grob-descriptions} alist (defined in
-@file{scm/define-grobs.scm}), this will find all grobs that have an
-initialized value for the @code{space-alist} property, and return them
+(define-public (find-named-props prop-name grob-descriptions)
+ "Used by @code{\\magnifyMusic} and @code{\\magnifyStaff}. When
+@var{grob-descriptions} is equal to the @code{all-grob-descriptions}
+alist (defined in @file{scm/define-grobs.scm}), this will find all grobs
+that can have a value for the @var{prop-name} property, and return them
as a list in the following format:
@example
-'((Ambitus space-alist)
- (BarLine space-alist)
+'((grob prop-name)
+ (grob prop-name)
...)
@end example"
- (define (has-space-alist? grob-desc)
- (ly:assoc-get 'space-alist (cdr grob-desc)))
- (let* ((grob-descriptions-with-space-alist
- (filter has-space-alist? grob-descriptions))
- (grob-names-with-space-alist
- (map car grob-descriptions-with-space-alist)))
- (map (lambda (grob-name) (list grob-name 'space-alist))
- grob-names-with-space-alist)))
+ (define (find-grobs-with-interface interface grob-descriptions)
+ (define (has-this-interface? grob-desc)
+ (let* ((meta (ly:assoc-get 'meta (cdr grob-desc)))
+ (interfaces (ly:assoc-get 'interfaces meta '())))
+ (memq interface interfaces)))
+ (let* ((grob-descriptions-with-this-interface
+ (filter has-this-interface? grob-descriptions))
+ (grob-names-with-this-interface
+ (map car grob-descriptions-with-this-interface)))
+ grob-names-with-this-interface))
+ (let* ((interface
+ (case prop-name
+ ((baseline-skip word-space) 'text-interface)
+ ((space-alist) 'break-aligned-interface)
+ (else (ly:programming-error
+ "find-named-props: no interface associated with ~s"
+ prop-name))))
+ (grobs-with-this-prop
+ (find-grobs-with-interface interface grob-descriptions)))
+ (map (lambda (x) (list x prop-name))
+ grobs-with-this-prop)))
+
(define (magnifyStaff-is-set? context mag)
(let* ((Staff (ly:context-find context 'Staff))
(if (or (eq? func-name 'magnifyMusic)
;; for \magnifyStaff, only scale the fontSize
;; if staff magnification is changing
- (staff-magnification-is-changing? context mag))
+ ;; and does not equal 1
+ (and (staff-magnification-is-changing? context mag)
+ (not (= mag 1))))
(let* ((where (case func-name
((magnifyMusic) context)
((magnifyStaff) (ly:context-find context 'Staff))))
(cons (car x)
(cons (cadr x)
(* mag (cddr x))))))
- (scaled-tuples (map scale-spacing-tuple space-alist))
+ (scaled-tuples (if space-alist
+ (map scale-spacing-tuple space-alist)
+ '()))
(new-alist (append scaled-tuples space-alist)))
(ly:context-pushpop-property where grob prop new-alist))
- (let* ((val (ly:assoc-get prop grob-def 1))
+ (let* ((val (ly:assoc-get prop grob-def (case prop
+ ((baseline-skip) 3)
+ ((word-space) 0.6)
+ (else 1))))
(proc (lambda (x)
(if allowed-to-shrink?
(* x mag)
(if (or (eq? func-name 'magnifyMusic)
;; for \magnifyStaff, only scale the properties
;; if staff magnification is changing
- (staff-magnification-is-changing? context mag))
+ ;; and does not equal 1
+ (and (staff-magnification-is-changing? context mag)
+ (not (= mag 1))))
(for-each scale-prop props)))))
(define-public (revert-props func-name mag props)