Aaron Hill <[email protected]> writes:
> On 2021-06-29 9:43 am, Jean Abou Samra wrote:
>> However, this problem can be solved by writing
>> an engraver (those are the powerful tools that
>> \applyOutput uses under the hood).
>> \version "2.22.0"
>> \layout {
>> \context {
>> \Score
>> \consists
>> #(lambda (context)
>> (make-engraver
>> (acknowledgers
>> ((grob-interface engraver grob source-engraver)
>> (set! (ly:grob-property grob 'output-attributes)
>> `((class . ,(grob::name grob))))))))
>> }
>> }
>> <<
>> { c d e f }
>> \\
>> { g a b c' }
>>>>
>
> NOTE: You might want this engraver to *append* to the class attribute,
> so you can still specify classes on an individual basis:
>
> %%%%
> \version "2.22.0"
>
> SvgAddClassName =
> #(lambda (ctxt)
> (define (add-class-name grob)
> (let* ((attribs (ly:grob-property grob 'output-attributes '()))
> (class (ly:assoc-get 'class attribs '()))
> (name (grob::name grob)))
> (set! class (if (null? class) name (format #f "~a ~a" class name)))
> (set! attribs (assoc-set! attribs 'class class))
> (ly:grob-set-property! grob 'output-attributes attribs)))
> (make-engraver
> (acknowledgers
> ((grob-interface engraver grob source)
> (add-class-name grob)))))
That assoc-set! looks like a stinker. Doesn't it mess with shared data
structures?
>
> \layout { \context { \Score \consists \SvgAddClassName } }
>
> { \tweak output-attributes #'((class . foo)) b'4 }
> %%%%
>
>
> -- Aaron Hill
>
>
--
David Kastrup