lilypond-user
[Top][All Lists]
Advanced

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

Re: bug in magnetic snapping lyrics engraver


From: Jean Abou Samra
Subject: Re: bug in magnetic snapping lyrics engraver
Date: Wed, 6 Apr 2022 20:46:49 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0

Le 06/04/2022 à 20:17, Jean Abou Samra a écrit :
Did I miss something?

Whoops, big problem at line breaks ...

\version "2.23.7"

#(define (Left_hyphen_pointer_engraver context)
   (let ((hyphen #f)
         (text #f))
     (make-engraver
      (acknowledgers
       ((lyric-syllable-interface engraver grob source-engraver)
          (set! text grob)))
      (end-acknowledgers
       ((lyric-hyphen-interface engraver grob source-engraver)
          (when (not (grob::has-interface grob 'lyric-space-interface))
                (set! hyphen grob))))
      ((stop-translation-timestep engraver)
         (when (and text hyphen)
               (ly:grob-set-object! text 'left-hyphen hyphen))
         (set! text #f)
         (set! hyphen #f)))))

#(define (lyric-text::apply-magnetic-offset! grob)
   (let ((hyphen (ly:grob-object grob 'left-hyphen #f)))
     (when hyphen
       (let ((left-text (ly:spanner-bound hyphen LEFT)))
         (when (grob::has-interface left-text 'lyric-syllable-interface)
           (let* ((common (ly:grob-common-refpoint grob left-text X))
                  (my-x-ext (ly:grob-extent grob common X))
                  (left-x-ext (begin
                                ;; Trigger magnetism for left-text
                                (ly:grob-property left-text 'after-line-breaking)
                                (ly:grob-extent left-text common X)))
                  (delta (- (interval-start my-x-ext)
                            (interval-end left-x-ext)))
                  (details (ly:grob-property grob 'details))
                  (threshold (assoc-get 'squash-threshold details 0.2)))
             (when (< delta threshold)
               (ly:grob-translate-axis! grob
                                        (- delta)
                                        X))))))))

#(define (lyric-hyphen::displace-bounds-first grob)
   ;; Make very sure this callback isn't triggered too early.
   (let ((left (ly:spanner-bound grob LEFT))
         (right (ly:spanner-bound grob RIGHT)))
     (ly:grob-property left 'after-line-breaking)
     (ly:grob-property right 'after-line-breaking)
     (ly:lyric-hyphen::print grob)))

\layout {
  \context {
    \Lyrics
    \consists #Left_hyphen_pointer_engraver
    \override LyricText.after-line-breaking = #lyric-text::apply-magnetic-offset!
    \override LyricHyphen.stencil = #lyric-hyphen::displace-bounds-first
    \override LyricText.details.squash-threshold = 10
    \override LyricHyphen.minimum-distance = 0
    \override LyricHyphen.minimum-length = 0.2
    \override LyricSpace.minimum-distance = 1
  }
}




reply via email to

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