]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/define-markup-commands.scm
*** empty log message ***
[lilypond.git] / scm / define-markup-commands.scm
index 36886996d68057d12cff771f615ac4bf208386bf..8d4fc21eca762e32a5b8cb26356423be23fadf98 100644 (file)
@@ -2,11 +2,10 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c)  2000--2004  Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;;; (c) 2000--2005  Han-Wen Nienhuys <hanwen@cs.uu.nl>
 ;;;;                  Jan Nieuwenhuizen <janneke@gnu.org>
 
 ;;; markup commands
-;;; TODO:
 ;;;  * each markup function should have a doc string with
 ;;     syntax, description and example. 
 
   "Stencil as markup"
   stil)
 
-
 (def-markup-command (score layout props score) (ly:score?)
   "Inline an image of music."
-  (let*
-      ((systems (ly:score-embedded-format score layout)))
+  (let* ((systems (ly:score-embedded-format score layout)))
 
     (if (= 0 (vector-length systems))
        (begin
          (ly:warn "No systems found in \\score markup. Did you forget \\layout?")
          empty-markup)
        (begin
-         (let*
-             ((stencil (ly:paper-system-stencil  (vector-ref systems 0)))) 
+         (let* ((stencil (ly:paper-system-stencil (vector-ref systems 0)))) 
 
            (ly:stencil-align-to! stencil Y CENTER)
            stencil)))))
 (def-markup-command (simple layout props str) (string?)
   "A simple text string; @code{\\markup @{ foo @}} is equivalent with
 @code{\\markup @{ \\simple #\"foo\" @}}."
-    (interpret-markup layout props str))
+  (interpret-markup layout props str))
 
 (def-markup-command (encoded-simple layout props sym str) (symbol? string?)
   "A text string, encoded with encoding @var{sym}. See
 @usermanref{Text encoding} for more information."
   (Text_interface::interpret_string layout
-                              props sym str))
+                                   props sym str))
 
 
 ;; TODO: use font recoding.
@@ -55,7 +51,6 @@
 
 
 (def-markup-command (postscript layout props str) (string?)
-
   "This inserts @var{str} directly into the output as a PostScript
 command string.  Due to technicalities of the output backends,
 different scales should be used for the @TeX{} and PostScript backend,
@@ -80,14 +75,13 @@ For the postscript backend, use the following
 @verbatim
 gsave /ecrm10 findfont 
  10.0 output-scale div 
- scalefont setfont  90 rotate (hello) show grestore 
+ scalefont setfont 90 rotate (hello) show grestore 
 @end verbatim
 "
   ;; FIXME
-  
   (ly:make-stencil
    (list 'embedded-ps str)
-   '(0 . 0) '(0 . 0)  ))
+   '(0 . 0) '(0 . 0)))
 
 ;;(def-markup-command (fill-line layout props line-width markups)
 ;;  (number? markup-list?)
@@ -98,15 +92,14 @@ gsave /ecrm10 findfont
    The markups are spaced/flushed to fill the entire line.
    If there are no arguments, return an empty stencil.
 "
-
   (let* ((orig-stencils
-                   (map (lambda (x) (interpret-markup layout props x))
-                       markups))
+         (map (lambda (x) (interpret-markup layout props x))
+              markups))
         (stencils
          (map (lambda (stc)
                 (if (ly:stencil-empty? stc)
                     point-stencil
-                    stc))  orig-stencils))
+                    stc)) orig-stencils))
         (text-width (apply +
                            (map (lambda (stc)
                                   (if (ly:stencil-empty? stc)
@@ -143,38 +136,33 @@ gsave /ecrm10 findfont
 determines the space between each markup in @var{args}."
   (stack-stencil-line
    (chain-assoc-get 'word-space props)
-   (map (lambda (m) (interpret-markup layout props m)) args)))
+   (remove ly:stencil-empty?
+          (map (lambda (m) (interpret-markup layout props m)) args))))
 
 (def-markup-command (fromproperty layout props symbol) (symbol?)
-  "Read the @var{symbol} from property settings, and produce a stencil from the markup contained within. If @var{symbol} is not defined, it returns an empty markup"
-  (let*
-      ((m (chain-assoc-get symbol props)))
-
+  "Read the @var{symbol} from property settings, and produce a stencil
+  from the markup contained within. If @var{symbol} is not defined, it
+  returns an empty markup"
+  (let* ((m (chain-assoc-get symbol props)))
     (if (markup? m)
        (interpret-markup layout props m)
-       (ly:make-stencil '()  '(1 . -1) '(1 . -1) ))))
+       (ly:make-stencil '()  '(1 . -1) '(1 . -1)))))
 
 
 (def-markup-command (on-the-fly layout props procedure arg) (symbol? markup?)
   "Apply the @var{procedure} markup command to
 @var{arg}. @var{procedure} should take a single argument."
-  (let*
-      ((anonymous-with-signature (lambda (layout props arg) (procedure layout props arg))))
-
+  (let* ((anonymous-with-signature (lambda (layout props arg) (procedure layout props arg))))
     (set-object-property! anonymous-with-signature
-                        'markup-signature
-                        (list markup?))
-    
-    (interpret-markup layout props (list anonymous-with-signature arg))
-  ))
+                         'markup-signature
+                         (list markup?))
+    (interpret-markup layout props (list anonymous-with-signature arg))))
 
 
 (def-markup-command (combine layout props m1 m2) (markup? markup?)
   "Print two markups on top of each other."
-  (let*
-      ((s1 (interpret-markup layout props m1))
-       (s2 (interpret-markup layout props m2)))
-            
+  (let* ((s1 (interpret-markup layout props m1))
+        (s2 (interpret-markup layout props m2)))
     (ly:stencil-add s1 s2)))
 
 (def-markup-command (finger layout props arg) (markup?)
@@ -206,7 +194,6 @@ A \\magnify #1.1 @{ A @} A
 
 Note: magnification only works if a font-name is explicitly selected.
 Use @code{\\fontsize} otherwise."
-
   (interpret-markup
    layout 
    (prepend-alist-chain 'font-magnification sz props)
@@ -287,40 +274,42 @@ recommend font for this is bold and italic"
 (def-markup-command (doublesharp layout props) ()
   "Draw a double sharp symbol."
 
-  (interpret-markup layout props (markup #:musicglyph "accidentals-4")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.4")))
 (def-markup-command (sesquisharp layout props) ()
   "Draw a 3/2 sharp symbol."
-  (interpret-markup layout props (markup #:musicglyph "accidentals-3")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.3")))
 
 (def-markup-command (sharp layout props) ()
   "Draw a sharp symbol."
-  (interpret-markup layout props (markup #:musicglyph "accidentals-2")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.2")))
+
 (def-markup-command (semisharp layout props) ()
   "Draw a semi sharp symbol."
-  (interpret-markup layout props (markup #:musicglyph "accidentals-1")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.1")))
+
 (def-markup-command (natural layout props) ()
   "Draw a natural symbol."
+  (interpret-markup layout props (markup #:musicglyph "accidentals.0")))
 
-  (interpret-markup layout props (markup #:musicglyph "accidentals-0")))
 (def-markup-command (semiflat layout props) ()
   "Draw a semiflat."
-  (interpret-markup layout props (markup #:musicglyph "accidentals--1")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M1")))
+
 (def-markup-command (flat layout props) ()
   "Draw a flat symbol."
-  
-  (interpret-markup layout props (markup #:musicglyph "accidentals--2")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M2")))
+
 (def-markup-command (sesquiflat layout props) ()
   "Draw a 3/2 flat symbol."
-  
-  (interpret-markup layout props (markup #:musicglyph "accidentals--3")))
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M3")))
+
 (def-markup-command (doubleflat layout props) ()
   "Draw a double flat symbol."
-
-  (interpret-markup layout props (markup #:musicglyph "accidentals--4")))
-
+  (interpret-markup layout props (markup #:musicglyph "accidentals.M4")))
 
 (def-markup-command (column layout props args) (markup-list?)
-  "Stack the markups in @var{args} vertically."
+  "Stack the markups in @var{args} vertically.  The property
+@code{baseline-skip} determines the space between each markup in @var{args}."
   (stack-lines
    -1 0.0 (chain-assoc-get 'baseline-skip props)
    (remove ly:stencil-empty?
@@ -333,7 +322,7 @@ of the @code{#'direction} layout property."
     (stack-lines
      (if (number? dir) dir -1)
      0.0
-      (chain-assoc-get 'baseline-skip props)
+     (chain-assoc-get 'baseline-skip props)
      (map (lambda (x) (interpret-markup layout props x)) args))))
 
 (def-markup-command (center-align layout props args) (markup-list?)
@@ -343,19 +332,25 @@ of the @code{#'direction} layout property."
     (stack-lines -1 0.0 (chain-assoc-get 'baseline-skip props) cmols)))
 
 (def-markup-command (vcenter layout props arg) (markup?)
-  "Align @code{arg} to its center. "
+  "Align @code{arg} to its center. "
   (let* ((mol (interpret-markup layout props arg)))
     (ly:stencil-align-to! mol Y CENTER)
     mol))
 
+(def-markup-command (hcenter layout props arg) (markup?)
+  "Align @code{arg} to its X center. "
+  (let* ((mol (interpret-markup layout props arg)))
+    (ly:stencil-align-to! mol X CENTER)
+    mol))
+
 (def-markup-command (right-align layout props arg) (markup?)
+  "Align @var{arg} on its right edge. "
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-align-to! m X RIGHT)
     m))
 
 (def-markup-command (left-align layout props arg) (markup?)
   "Align @var{arg} on its left edge. "
-  
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-align-to! m X LEFT)
     m))
@@ -363,36 +358,30 @@ of the @code{#'direction} layout property."
 (def-markup-command (general-align layout props axis dir arg)  (integer? number? markup?)
   "Align @var{arg} in @var{axis} direction to the @var{dir} side."
   (let* ((m (interpret-markup layout props arg)))
-
     (ly:stencil-align-to! m axis dir)
-    m
-  ))
+    m))
 
 (def-markup-command (halign layout props dir arg) (number? markup?)
   "Set horizontal alignment. If @var{dir} is @code{-1}, then it is
 left-aligned, while @code{+1} is right. Values in between interpolate
 alignment accordingly."
-
-  
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-align-to! m X dir)
     m))
 
 (def-markup-command (musicglyph layout props glyph-name) (string?)
   "This is converted to a musical symbol, e.g. @code{\\musicglyph
-#\"accidentals-0\"} will select the natural sign from the music font.
-See @usermanref{The Feta font} for  a complete listing of the possible glyphs.
-"
-  (ly:find-glyph-by-name
+#\"accidentals.0\"} will select the natural sign from the music font.
+See @usermanref{The Feta font} for  a complete listing of the possible glyphs."
+  (ly:font-get-glyph
    (ly:paper-get-font layout (cons '((font-encoding . fetaMusic))
-                                  props))
+                                  props))
    glyph-name))
 
-
 (def-markup-command (lookup layout props glyph-name) (string?)
   "Lookup a glyph by name."
-  (ly:find-glyph-by-name (ly:paper-get-font layout props)
-                         glyph-name))
+  (ly:font-get-glyph (ly:paper-get-font layout props)
+                    glyph-name))
 
 (def-markup-command (char layout props num) (integer?)
   "Produce a single character, e.g. @code{\\char #65} produces the 
@@ -416,14 +405,11 @@ If the text object itself is positioned above or below the staff, then
 positions it next to the staff cancels any shift made with
 @code{\\raise}. For vertical positioning, use the @code{padding}
 and/or @code{extra-offset} properties. "
-
-  
   (ly:stencil-translate-axis (interpret-markup layout props arg)
-                              amount Y))
+                            amount Y))
 
 (def-markup-command (fraction layout props arg1 arg2) (markup? markup?)
   "Make a fraction of two markups."
-  
   (let* ((m1 (interpret-markup layout props arg1))
          (m2 (interpret-markup layout props arg2)))
     (ly:stencil-align-to! m1 X CENTER)
@@ -445,13 +431,12 @@ and/or @code{extra-offset} properties. "
 (def-markup-command (note-by-number layout props log dot-count dir) (number? number? number?)
   "Construct a note symbol, with stem.  By using fractional values for
 @var{dir}, you can obtain longer or shorter stems."
-  
   (let* ((font (ly:paper-get-font layout (cons '((font-encoding . fetaMusic)) props)))
         (size (chain-assoc-get 'font-size props 0))
          (stem-length (* (magstep size) (max 3 (- log 1))))
-         (head-glyph (ly:find-glyph-by-name
-                  font
-                  (string-append "noteheads-" (number->string (min log 2)))))
+         (head-glyph (ly:font-get-glyph
+                     font
+                     (string-append "noteheads.s" (number->string (min log 2)))))
          (stem-thickness 0.13)
          (stemy (* dir stem-length))
          (attachx (if (> dir 0)
@@ -459,25 +444,25 @@ and/or @code{extra-offset} properties. "
                       0))
          (attachy (* dir 0.28))
          (stem-glyph (and (> log 0)
-                      (ly:round-filled-box
-                       (cons attachx (+ attachx  stem-thickness))
-                       (cons (min stemy attachy)
-                             (max stemy attachy))
-                       (/ stem-thickness 3))))
-         (dot (ly:find-glyph-by-name font "dots-dot"))
+                         (ly:round-filled-box
+                          (cons attachx (+ attachx  stem-thickness))
+                          (cons (min stemy attachy)
+                                (max stemy attachy))
+                          (/ stem-thickness 3))))
+         (dot (ly:font-get-glyph font "dots-dot"))
          (dotwid (interval-length (ly:stencil-extent dot X)))
          (dots (and (> dot-count 0)
                     (apply ly:stencil-add
                            (map (lambda (x)
                                   (ly:stencil-translate-axis
-                                   dot  (* (+ 1 (* 2 x)) dotwid) X) )
+                                   dot  (* (+ 1 (* 2 x)) dotwid) X))
                                 (iota dot-count 1)))))
          (flaggl (and (> log 2)
                       (ly:stencil-translate
-                       (ly:find-glyph-by-name font
-                                              (string-append "flags-"
-                                                             (if (> dir 0) "u" "d")
-                                                             (number->string log)))
+                       (ly:font-get-glyph font
+                                         (string-append "flags."
+                                                        (if (> dir 0) "u" "d")
+                                                        (number->string log)))
                        (cons (+ attachx (/ stem-thickness 2)) stemy)))))
     (if flaggl
         (set! stem-glyph (ly:stencil-add flaggl stem-glyph)))
@@ -488,13 +473,13 @@ and/or @code{extra-offset} properties. "
         (set! stem-glyph
               (ly:stencil-add
                (ly:stencil-translate-axis dots
-                                           (+ (if (and (> dir 0) (> log 2))
-                                                  (* 1.5 dotwid)
-                                                  0)
-                                              ;; huh ? why not necessary?
-                                              ;;(cdr (ly:stencil-extent head-glyph X))
-                                              dotwid)
-                                           X)
+                                         (+ (if (and (> dir 0) (> log 2))
+                                                (* 1.5 dotwid)
+                                                0)
+                                            ;; huh ? why not necessary?
+                                            ;;(cdr (ly:stencil-extent head-glyph X))
+                                            dotwid)
+                                         X)
                stem-glyph)))
     stem-glyph))
 
@@ -522,18 +507,16 @@ and/or @code{extra-offset} properties. "
 the @var{duration} for the note head type and augmentation dots. For
 example, @code{\\note #\"4.\" #-0.75} creates a dotted quarter note, with
 a shortened down stem."
-  
   (let ((parsed (parse-simple-duration duration)))
     (note-by-number-markup layout props (car parsed) (cadr parsed) dir)))
 
 (def-markup-command (normal-size-super layout props arg) (markup?)
   "Set @var{arg} in superscript with a normal font size."
-  
   (ly:stencil-translate-axis (interpret-markup
-                               layout
-                               props arg)
-                              (* 0.5  (chain-assoc-get 'baseline-skip props))
-                              Y))
+                             layout
+                             props arg)
+                            (* 0.5  (chain-assoc-get 'baseline-skip props))
+                            Y))
 
 (def-markup-command (super layout props arg) (markup?)
   "
@@ -553,7 +536,6 @@ Raising and lowering texts can be done with @code{\\super} and
 @end lilypond
 
 "
-  
   (ly:stencil-translate-axis
    (interpret-markup
     layout
@@ -573,13 +555,11 @@ vertically, for the same reason that @code{\\raise} cannot be used for
 that.
 
 "
-  
   (ly:stencil-translate (interpret-markup  layout props arg)
-                         offset))
+                       offset))
 
 (def-markup-command (sub layout props arg) (markup?)
   "Set @var{arg} in subscript."
-  
   (ly:stencil-translate-axis
    (interpret-markup
     layout
@@ -588,9 +568,28 @@ that.
    (* -0.5 (chain-assoc-get 'baseline-skip props))
    Y))
 
+(def-markup-command (beam layout props width slope thickness) (number? number? number?)
+  "Create a beam with the specified parameters."
+
+  (let*
+      ((y (* slope width))
+       (yext (cons (min 0 y) (max 0 y)))
+       (half (/ thickness 2)))
+       
+    (ly:make-stencil
+     (list 'beam width
+          slope
+          thickness
+          (ly:output-def-lookup layout 'blotdiameter))
+     (cons 0 width)
+     (cons (+ (- half) (car yext))
+          (+ half (cdr yext))))
+
+    ))
+
+
 (def-markup-command (normal-size-sub layout props arg) (markup?)
   "Set @var{arg} in subscript, in a normal font size."
-
   (ly:stencil-translate-axis
    (interpret-markup layout props arg)
    (* -0.5 (chain-assoc-get 'baseline-skip props))
@@ -618,7 +617,7 @@ will put extra space between A and B, on top of the space that is
 normally inserted before elements on a line.
 "
   (if (> amount 0)
-      (ly:make-stencil "" (cons 0 amount) '(-1 . 1) )
+      (ly:make-stencil "" (cons 0 amount) '(-1 . 1))
       (ly:make-stencil "" (cons amount amount) '(-1 . 1))))
 
 (def-markup-command (override layout props new-prop arg) (pair? markup?)
@@ -639,31 +638,29 @@ any sort of property supported by @internalsref{font-interface} and
         (entry (cons 'font-size (- fs 1))))
     (interpret-markup layout (cons (list entry) props) arg)))
 
-
 (def-markup-command (bigger layout props arg) (markup?)
   "Increase the font size relative to current setting"
   (let* ((fs (chain-assoc-get 'font-size props 0))
          (entry (cons 'font-size (+ fs 1))))
     (interpret-markup layout (cons (list entry) props) arg)))
 
-(def-markup-command larger (markup?)
-  bigger-markup)
-
+(def-markup-command larger (markup?) bigger-markup)
 
 (def-markup-command (box layout props arg) (markup?)
-  "Draw a box round @var{arg}.  Looks at @code{thickness} and
-@code{box-padding} properties to determine line thickness and padding
-around the markup."
-  (let ((th (chain-assoc-get 'thickness props  0.1))
-        (pad (chain-assoc-get 'box-padding props 0.2))
-        (m (interpret-markup layout props arg)))
+  "Draw a box round @var{arg}.  Looks at @code{thickness},
+@code{box-padding} and @code{font-size} properties to determine line
+thickness and padding around the markup."
+  (let* ((th (chain-assoc-get 'thickness props  0.1))
+        (size (chain-assoc-get 'font-size props 0))
+        (pad
+         (* (magstep size)
+            (chain-assoc-get 'box-padding props 0.2)))
+        (m (interpret-markup layout props arg)))
     (box-stencil m th pad)))
 
-;FIXME: is this working? 
+;;FIXME: is this working? 
 (def-markup-command (strut layout props) ()
-  
   "Create a box of the same height as the space in the current font."
-  
   (let ((m (Text_interface::interpret_markup layout props " ")))
     (ly:stencil-set-extent! m X '(1000 . -1000))
     m))
@@ -678,105 +675,93 @@ around the markup."
   (vector-set! number->mark-letter-vector j
                (integer->char (+ i (char->integer #\A)))))
 
-(define (number->markletter-string n)
+(define number->mark-alphabet-vector (list->vector
+  (map (lambda (i) (integer->char (+ i (char->integer #\A)))) (iota 26))))
+
+(define (number->markletter-string vec n)
   "Double letters for big marks."
-  (let*
-      ((l (vector-length number->mark-letter-vector)))
+  (let* ((lst (vector-length vec)))
     
-  (if (>= n l)
-      (string-append (number->markletter-string (1- (quotient n l)))
-                     (number->markletter-string (remainder n l)))
-      (make-string 1 (vector-ref number->mark-letter-vector n)))))
-
+    (if (>= n lst)
+       (string-append (number->markletter-string vec (1- (quotient n lst)))
+                      (number->markletter-string vec (remainder n lst)))
+       (make-string 1 (vector-ref vec n)))))
 
 (def-markup-command (markletter layout props num) (integer?)
-   "Make a markup letter for @var{num}.  The letters start with A to Z
+  "Make a markup letter for @var{num}.  The letters start with A to Z
  (skipping I), and continues with double letters."
-   (Text_interface::interpret_markup layout props (number->markletter-string num)))
-
-
+  (Text_interface::interpret_markup layout props
+    (number->markletter-string number->mark-letter-vector num)))
 
+(def-markup-command (markalphabet layout props num) (integer?)
+   "Make a markup letter for @var{num}.  The letters start with A to Z
+ and continues with double letters."
+   (Text_interface::interpret_markup layout props
+     (number->markletter-string number->mark-alphabet-vector num)))
 
 (def-markup-command (bracketed-y-column layout props indices args)
   (list? markup-list?)
   "Make a column of the markups in @var{args}, putting brackets around
 the elements marked in @var{indices}, which is a list of numbers."
-
-    (define (sublist l start stop)
-    (take (drop l start)  (- (1+ stop) start)) )
+  (define (sublist lst start stop)
+    (take (drop lst start) (- (1+ stop) start)))
 
   (define (stencil-list-extent ss axis)
     (cons
      (apply min (map (lambda (x) (car (ly:stencil-extent x axis))) ss))
      (apply max (map (lambda (x) (cdr (ly:stencil-extent x axis))) ss))))
-           
+  
   (define (stack-stencils stencils bskip last-stencil)
     (cond
      ((null? stencils) '())
-     ((not last-stencil)
+     ((not (ly:stencil? last-stencil))
       (cons (car stencils)
            (stack-stencils (cdr stencils) bskip (car stencils))))
      (else
-      (let*
-         ((orig (car stencils))
-          (dir (chain-assoc-get 'direction  props DOWN))
-          (new (ly:stencil-moved-to-edge last-stencil Y dir
-                                         orig
-                                         0.1 bskip))
-          )
-
-       (cons new (stack-stencils (cdr stencils) bskip new))))
-    ))
+      (let* ((orig (car stencils))
+            (dir (chain-assoc-get 'direction  props DOWN))
+            (new (ly:stencil-moved-to-edge last-stencil Y dir
+                                           orig
+                                           0.1 bskip)))
+
+       (cons new (stack-stencils (cdr stencils) bskip new))))))
 
   (define (make-brackets stencils indices acc)
     (if (and stencils
             (pair? indices)
             (pair? (cdr indices)))
-       (let*
-           ((encl (sublist stencils (car indices) (cadr indices)))
-            (x-ext (stencil-list-extent encl X))
-            (y-ext (stencil-list-extent encl Y))
-            (thick 0.10)
-            (pad 0.35)
-            (protusion (* 2.5 thick))
-            (lb
-             (ly:stencil-translate-axis 
-              (ly:bracket Y y-ext thick protusion)
-              (- (car x-ext) pad) X))
-            (rb (ly:stencil-translate-axis
-                 (ly:bracket Y y-ext thick (- protusion))
-                 (+ (cdr x-ext) pad) X))
-            )
+       (let* ((encl (sublist stencils (car indices) (cadr indices)))
+              (x-ext (stencil-list-extent encl X))
+              (y-ext (stencil-list-extent encl Y))
+              (thick 0.10)
+              (pad 0.35)
+              (protusion (* 2.5 thick))
+              (lb
+               (ly:stencil-translate-axis 
+                (ly:bracket Y y-ext thick protusion)
+                (- (car x-ext) pad) X))
+              (rb (ly:stencil-translate-axis
+                   (ly:bracket Y y-ext thick (- protusion))
+                   (+ (cdr x-ext) pad) X)))
 
          (make-brackets
           stencils (cddr indices)
           (append
            (list lb rb)
-            acc)))
+           acc)))
        acc))
 
-  (let*
-      ((stencils
-       (map (lambda (x)
-              (interpret-markup
-               layout
-               props
-               x)) args))
-       (leading
-        (chain-assoc-get 'baseline-skip props))
-       (stacked (stack-stencils stencils 1.25 #f))
-       (brackets (make-brackets stacked indices '()))
-       )
+  (let* ((stencils
+         (map (lambda (x)
+                (interpret-markup
+                 layout
+                 props
+                 x)) args))
+        (leading
+         (chain-assoc-get 'baseline-skip props))
+        (stacked (stack-stencils
+                  (remove ly:stencil-empty? stencils) 1.25 #f))
+        (brackets (make-brackets stacked indices '())))
 
     (apply ly:stencil-add
-          (append stacked brackets)
-          )))
-
-
-            
-
-  
-  
-
-     
+          (append stacked brackets))))