lilypond-user
[Top][All Lists]
Advanced

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

Re: String Number collision


From: Thomas Morley
Subject: Re: String Number collision
Date: Wed, 5 Jul 2017 23:21:41 +0200

Hi Marc,

2017-07-05 8:13 GMT+02:00 Marc Hohl <address@hidden>:
> Hi list,
>
> I have the following MWE:
[...]
> It causes the string number "5" to appear twice, strangely overlapping.
> I tried to move the New_fingering_engraver to Staff, but then I got
>
> side-axis not set for grob StringNumber.

Not sure what you expected, I didn't explore the programming error, though.

> I assume that I have to create an engraver similar to the
> Merge_rests_engraver that does this job? Or is there another way apart from
>
> \once\hide StringNumber
>
> all the way across the file?



You could do:

#(define (suicide-duplicate-text-grobs grob-lst)
"Walks through the sorted @var{grob-lst}, suiciding grobs with duplicate text"
  (if (null? (cdr grob-lst))
      #f
      (suicide-duplicate-text-grobs
        (if (string=? (ly:grob-property (car grob-lst) 'text)
                      (ly:grob-property (cadr grob-lst) 'text))
            (begin
              (ly:grob-suicide! (car grob-lst))
              (cdr grob-lst))
            (cdr grob-lst)))))

#(define reduce-string-numbers
  (lambda (grob)
"Gets the PaperColumn-grob, filters for StringNumber-grobs, sorts this grobs
with @code{string<?} looking at their 'text-property.
Finally suicides grobs with already present text."
    (let* ((paper-column (ly:item-get-column grob))
           (strgs
             (filter
               (lambda (g)
                 (grob::has-interface g 'string-number-interface))
               (ly:grob-array->list (ly:grob-object paper-column 'elements))))
           (sorted-strgs
             (sort
               strgs
               (lambda (p q)
                 (string<? (ly:grob-property p 'text)
                           (ly:grob-property q 'text))))))
      (suicide-duplicate-text-grobs sorted-strgs))))

deleteDuplicateStrings =
\override StringNumber.after-line-breaking = #reduce-string-numbers


up = { <c'\5 g'\4 e''>8 ~ e''2. }

down = { <c'\5  g'\4> ~ c'2. }

\score {
  <<
  \new Staff
  <<
     \new Voice \with { \deleteDuplicateStrings } { \voiceOne \up }
     \new Voice  { \voiceTwo \down }
  >>
  \new TabStaff
  <<
     \new TabVoice { \voiceOne \up }
     \new TabVoice  { \voiceTwo \down }
  >>
  >>
}


Though, I think an engraver would probably do the job cheaper. (Not tested)

HTH,
  Harm



reply via email to

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