Hello Jean, hello Rip.

instead of imposing this empty stencil I’d extent the original command such 
that it allows for such things. The appended file does implement a way to call 
(box-grob-stencil-with-thickness thickness padding) and a way to use the 
original function but to be able to specify thickness and padding using 
details.box-thickness and details.box-padding.

Cheers,
Valentin


Am Sonntag, 15. Mai 2022, 11:09:29 CEST schrieb Jean Abou Samra:
> Le 15/05/2022 à 10:40, Rip _Mus a écrit :
> > Good morning,
> > I found this interesting snippet:
> > https://lsr.di.unimi.it/LSR/Snippet?id=257
> > 
> > that draws a box around systems.
> > According to you, is it possible to specify box line thickness ?
> > 
> > Thank you!
> > 
> > Rip_mus
> 
> It looks like box-grob-stencil does not support this. make-stencil-boxer, on
> the other hand, does. It expects a callback yielding a stencil, though, so
> you need to define a little function returning a stencil empty of inking
> with the grob's extent.
> 
> \version "2.22.2"
> 
> #(define (empty-stencil-from-grob-extents grob)
>     (ly:make-stencil
>      '()
>      (ly:grob-extent grob grob X)
>      (ly:grob-extent grob grob Y)))
> 
> \layout {
>    \context {
>      \Score
>      \override System.stencil =
>        % adjust thickness and padding
>        #(make-stencil-boxer 0.2 0.3 empty-stencil-from-grob-extents)
>    }
> }
> 
> {
>    \slurDown c4 ( g4  c''4)
> }
> 
> 
> Best,
> Jean

\version "2.22.2"

#(define*-public ((box-grob-stencil-with-thickness #:optional (thick 0.1) (pad 0)) grob)
  (let* ((xext (ly:grob-extent grob grob 0))
         (yext (ly:grob-extent grob grob 1))
         (xext (interval-widen xext pad))
         (yext (interval-widen yext pad)))
    (ly:stencil-add
      (make-filled-box-stencil (interval-widen xext thick) (cons (- (car yext) thick) (car yext)))
      (make-filled-box-stencil (interval-widen xext thick) (cons (cdr yext) (+ (cdr yext) thick)))
      (make-filled-box-stencil (cons (cdr xext) (+ (cdr xext) thick)) yext)
      (make-filled-box-stencil (cons (- (car xext) thick) (car xext)) yext))))

\score {
  \layout {
     \context {
       \Score
       \override System.stencil =
         #(box-grob-stencil-with-thickness 0.4 0.5)
     }
  }
  {
     \slurDown c4 ( g4  c''4)
  }
}

\markup\vspace #1

#(define-public (box-grob-stencil grob)
   (let* ((det (ly:grob-property grob 'details))
          (thick (assoc-get 'box-thickness det 0.1))
          (pad (assoc-get 'box-padding det 0)))
     ((box-grob-stencil-with-thickness thick pad) grob)))

\score {
  \layout {
     \context {
       \Score
       \override System.stencil = #box-grob-stencil
       \override System.details.box-thickness = #1
       \override System.details.box-padding = #1
     }
  }
  {
     \slurDown c4 ( g4  c''4)
  }
}

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to