2015-04-20 23:45 GMT+02:00 David Nalesnik <david.nales...@gmail.com>: > Hi Steven, > > On Mon, Apr 20, 2015 at 3:40 PM, Steven Weber <pant...@hotmail.com> wrote: >> >> Since I always highlight clef changes in my music and I have access to a >> color printer, I thought it’d be more efficient to let Lilypond do the >> highlighting for me. I wrote a handy function that places a filled-box >> behind the clef grob, and it works great, as long as I add it manually for >> every clef change. What I really want is to add this to the Staff context >> so I never have to think about it again. So I created an override function >> for the Staff.Clef.stencil which does the same thing as my manual function >> and again, it does highlight the clefs. Unfortunately, it highlights every >> single clef (i.e., all the clefs at the beginning of the staves, not just >> the clef changes), which is overkill and defeats the purpose of highlighting >> things I need to pay attention to. >> >> >> >> Is there a way in scheme to say “is this grob being typeset because of an >> explicit command (\clef bass), or implicitly (because of a line break)”? >> >> > > > I can think of two ways to go about this. Hopefully the first gives you > what you want, because the second will take some doing. > > Breakable items like clefs have directions attached depending on where they > are: -1 means end of line, 0 unbroken, and 1 beginning of line. You can use > the function ly:item-break-dir like so: > > \version "2.19" > > #(define highlight > (lambda (grob) > (let ((ibd (ly:item-break-dir grob))) > (if (= ibd 1) black green)))) > > { > \override Staff.Clef.color = #highlight > > c' d' e' f' > \clef bass > c d e f > \break > c d e f > \clef treble > c' d' e' f' > \break > c' d' e' f' > \clef bass > \break > c d e f > } > > > %%% > > One drawback here would be if you want to highlight both the cautionary clef > and the beginning-of-line clef at the end of the example... To do that and > not catch other beginning-of-line clefs, we would have to use the other > method, which is to insert the override into the music expression. > > I'm going to drop out at this point :) But, as a head start, compare the > results of running the following with the override left in or commented out: > > \displayMusic { > c' > %\override Staff.Clef.color = #highlight > \clef bass > c > } > > The extending manual discusses this sort of manipulation with respect to > music functions. There are other useful commands like map-some-music which > crop up periodically on the lists. > > Hope this is useful-- > > David
Or maybe: \version "2.19.18" clef-color-engraver = #(lambda (context) (let ((clef-props '())) `((acknowledgers (clef-interface . ,(lambda (engraver grob source-engraver) (let* ((clefGlyph (ly:context-property context 'clefGlyph)) (clefPosition (ly:context-property context 'clefPosition)) (clefTransposition (ly:context-property context 'clefTransposition 0)) (new-clef-props (list clefGlyph clefPosition clefTransposition))) ;(display (equal? clef-props new-clef-props)) (if (and (not (equal? clef-props new-clef-props)) ;; to have the first clef colored as well ;; comment next line (not (null? clef-props)) ) (set! (ly:grob-property grob 'color) red)) (set! clef-props new-clef-props)))))))) %%%%%%%%%%%%%%% %% EXAMPLE %%%%%%%%%%%%%% \layout { \context { \Staff \consists #clef-color-engraver } } << { \clef bass R1 \break R1 \clef alto R1 \break \clef "G" R1 \clef "G_8" R1 \break R1 \break R1 } { R1 \break R1 R1 \break \clef "mensural-c3" R1 \clef "alto" R1 \break R1 \break R1 } >> Cheers, Harm _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user