lilypond-user
[Top][All Lists]
Advanced

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

Snippet for aligning markup inside another markup


From: Michael Käppler
Subject: Snippet for aligning markup inside another markup
Date: Mon, 30 Sep 2019 12:23:56 +0200
User-agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0

Hi folks,
for a project of mine I wanted to center a markup inside another markup.
I searched the built-in markup functions, but to no avail. (Surely it is
possible that I missed something...)
So I came up with the following code. Feel free to test and comment it.
Maybe it is possible in an easier way, though.
Would this kind of stuff fit into the LSR?

Best regards,
Michael

% Align src-markup inside dest-markup and merge stencils
% xdir = -1 aligns left edges, 1 right edges
% ydir = -1 aligns bottom edges, 1 top edges
% Values between -1 and 1 are interpolated

#(define-markup-command (align-inside layout props xdir ydir src-markup
dest-markup)
   (number? number? markup? markup?)
   (let* ((src-stil (interpret-markup layout props src-markup))
          (dest-stil (interpret-markup layout props dest-markup))

          (src-x-extent (ly:stencil-extent src-stil X))
          (src-y-extent (ly:stencil-extent src-stil Y))
          (src-x-center (interval-center src-x-extent))
          (src-y-center (interval-center src-y-extent))
          (src-width (interval-length src-x-extent))
          (src-height (interval-length src-y-extent))

          (dest-x-extent (ly:stencil-extent dest-stil X))
          (dest-y-extent (ly:stencil-extent dest-stil Y))
          (dest-x-center (interval-center dest-x-extent))
          (dest-y-center (interval-center dest-y-extent))
          (dest-width (interval-length dest-x-extent))
          (dest-height (interval-length dest-y-extent))

          (offset-x-centered (- dest-x-center src-x-center))
          (offset-y-centered (- dest-y-center src-y-center))
          (offset-dir (cons (+ offset-x-centered (* xdir 0.5 (-
dest-width src-width)))
                             (+ offset-y-centered (* ydir 0.5 (-
dest-height src-height))))))

     (ly:stencil-add dest-stil (ly:stencil-translate src-stil
offset-dir))))

boxone = \markup \with-color #blue \filled-box #'(0 . 6) #'(0 . 6) #0
boxtwo = \markup \with-color #red \filled-box #'(3 . 5) #'(5 . 7) #0

\markup \align-inside #CENTER #CENTER \boxtwo \boxone
\markup \align-inside #LEFT #0.5 \boxtwo \boxone
\markup \align-inside #RIGHT #DOWN \boxtwo \boxone



reply via email to

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