Thanks, that does seem to work at least in a small test case.  I saved the function off to an include file and will try it on a larger set of lyrics later.  It does seem like a bit of work to do something that could a base lilypond feature since it would seem like background highlighting of some words in lyrics wouldn't be that uncommon.  That type of feature is currently available for staff notes.

Thanks for the help.

Walt

On 4/24/2024 8:21 PM, Aaron Hill wrote:
On 2024-04-24 4:05 pm, Walt North wrote:
Thanks, that's close enough to what I wanted.  I was originally for yellow background with back letters... but red (or other bright) font will suffice.


Here is an (over-engineered and probably bug-ridden) approach:

%%%%
\version "2.25.13"

#(define-markup-command
  (highlight layout props arg) (markup?)
  #:category other
  #:properties ((blot 0.2)
                (color yellow)
                (padding 0.2))
  (let* ((stencil (interpret-markup layout props arg))
         (strut (interpret-markup layout props
                  #{ \markup qxb #}))
         (x-extent (ly:stencil-extent stencil X))
         (y-extent (interval-union
                     (ly:stencil-extent stencil Y)
                     (ly:stencil-extent strut Y)))
         (x-extent-wide (interval-widen x-extent padding))
         (y-extent-wide (interval-widen y-extent padding)))
    (interpret-markup layout props #{
      \markup \combine
        \with-color #color
          \with-dimensions #x-extent #y-extent
          \filled-box #x-extent-wide #y-extent-wide #blot
        \stencil #stencil
    #})))

#(define (highlighter blot color padding)
  (grob-transformer 'stencil
    (lambda (grob orig)
      (grob-interpret-markup grob #{
        \markup
          \override #`(blot . ,blot)
          \override #`(color . ,color)
          \override #`(padding . ,padding)
          \highlight \stencil #orig
      #}))))

\markup {
  \pad-around #1
  \override #'(blot . 1.5)
  \override #`(color . ,(x11-color 'orange))
  \override #'(padding . 0.5)
  \highlight \line { \bold lorem \italic ipsum }
}

myHighlight = \override LyricText.stencil =
  #(highlighter 0.6 (x11-color 'cornflowerblue) 0.1)

\paper { indent = 0 }
{ \repeat unfold 3 { b'4 4 2 } }
\addlyrics {
  no high -- light
  \myHighlight high --
  \tweak font-family #'sans
  \tweak font-series #'bold
  light -- er
  \undo \myHighlight none
  \once \myHighlight once
  done
}
%%%%


-- Aaron Hill

Reply via email to