bug-lilypond
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: \parenthesize script on cross-staff-beamed note fails


From: Thomas Morley
Subject: Re: \parenthesize script on cross-staff-beamed note fails
Date: Sat, 15 Aug 2015 15:45:24 +0200

2015-08-15 14:22 GMT+02:00 Malte Meyn <address@hidden>:
> Am 15.08.2015 um 10:43 schrieb Malte Meyn:
>>
>> Hi list,
>>
>> in the following example, the \parenthesize command doesn’t respect the
>> width of the parenthesized script (same problem for other scripts like
>> fermata).
>>
>> %%%%%%%%%%%%%%%%%%%
>> \version "2.19.25"
>>
>> <<
>>    \new Staff = "upper" {
>>      s4
>>    }
>>    \new Staff {
>>      b16-\parenthesize-> b b
>>      \change Staff = upper
>>      b
>>    }
>>  >>
>> %%%%%%%%%%%%%%%%%%%
>>
>> Malte
>>
> Problem: \parenthesize uses ly:relative-group-extent to compute the X-extent
> of the accent (see output-lib.scm). This function looks for the cross-staff
> property and ignores all things that have this set to true
> (axis-group-interface.cc).
>
> According to the internals reference 3.2.45 (grob-interface) the cross-staff
> property is used for things that have a Y-extent that depends on inter-staff
> spacing. So why are cross-staff things ignored in general and not only when
> a == Y_AXIS in Axis_group_interface::relative_maybe_bound_group_extent?


ly:relative-group-extent can't be the single problem.
In the snippet below I redefined it.

All instances of
programming error: Improbable offset for stencil: inf staff space
are fixed then and the visual output is ok, but
programming error: Grob direction requested while calculation in progress.
stil occurs - loads more of same kind, if I add other stuff.

\version "2.19.25"

#(define (ly:relative-group-extent elements common axis)
  "Determine the extent of elements relative to common in the axis direction."
  (let* ((elts
            (cond
              ((ly:grob? elements) (list elements))
              ((ly:grob-array? elements) (ly:grob-array->list elements))
              ((every ly:grob? elements) elements)
              (else '())))
         (exts
        (map
          (lambda (g) (ly:grob-extent g common axis))
          elts))
         (ext
           (reduce
         interval-union
         (car exts)
         (cdr exts))))
    ext))

%% c/p from output-lib.scm to provide
%% a compilable snippet
#(define (parenthesize-elements grob . rest)
  (let* ((refp (if (null? rest)
                   grob
                   (car rest)))
         (elts (ly:grob-array->list (ly:grob-object grob 'elements)))
         (get-friends
           (lambda (g)
             (let ((syms (ly:grob-property g 'parenthesis-friends '()))
                   (get-friend (lambda (s)
                                 (let ((f (ly:grob-object g s)))
                                   (cond
                                     ((ly:grob? f) (list f))
                                     ((ly:grob-array? f)
(ly:grob-array->list f))
                                     (else '()))))))
               (apply append (map get-friend syms)))))
         (friends (apply append elts (map get-friends elts)))
         (x-ext (ly:relative-group-extent friends refp X))
         (stencils (ly:grob-property grob 'stencils))
         (lp (car stencils))
         (rp (cadr stencils))
         (padding (ly:grob-property grob 'padding 0.1)))
    (ly:stencil-add
     (ly:stencil-translate-axis lp (- (car x-ext) padding) X)
     (ly:stencil-translate-axis rp (+ (cdr x-ext) padding) X))))

%% adding a color for indication purpose
%% otherwise c/p from output-lib.scm
#(define-public (parentheses-item::print me)
  (let* ((elts (ly:grob-object me 'elements))
         (y-ref (ly:grob-common-refpoint-of-array me elts Y))
         (x-ref (ly:grob-common-refpoint-of-array me elts X))
         (stencil (parenthesize-elements me x-ref))
         (elt-y-ext (ly:relative-group-extent elts y-ref Y))
         (y-center (interval-center elt-y-ext)))
    (ly:stencil-translate
     (stencil-with-color stencil red)
     (cons
      (- (ly:grob-relative-coordinate me x-ref X))
      (- y-center (ly:grob-relative-coordinate me y-ref Y))))))

<<
  \new Staff = "upper" {
    s4
  }
  \new Staff {
    \override ParenthesesItem.stencil = #parentheses-item::print
    b16-\parenthesize->-3 b b
    \change Staff = upper
    b
  }
>>



Cheers,
  Harm



reply via email to

[Prev in Thread] Current Thread [Next in Thread]