]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/define-markup-commands.scm
*** empty log message ***
[lilypond.git] / scm / define-markup-commands.scm
index 0b44e689a6912ad3057a4a64c51dc80046029255..8d19cf8efbe019664ea14a4a9ad07d49fd58ae00 100644 (file)
 ;;     syntax, description and example. 
 
 (define-public empty-stencil (ly:make-stencil '() '(1 . -1) '(1 . -1)))
+(define-public point-stencil (ly:make-stencil "" '(0 . 0) '(0 . 0)))
 
 (def-markup-command (stencil layout props stil) (ly:stencil?)
   "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.
@@ -79,14 +77,14 @@ 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,32 +96,38 @@ gsave /ecrm10 findfont
    If there are no arguments, return an empty stencil.
 "
 
-  (let* ((stencils (filter
-                   (lambda (stc) (not (ly:stencil-empty? stc)))
-                   (map (lambda (x) (interpret-markup layout props x))
-                       markups)))
-        (text-width (apply + (map interval-length
-                                  (map (lambda (x)
-                                         (ly:stencil-extent x X))
-                                       stencils))))
-       (word-count (length stencils))
-       (word-space (chain-assoc-get 'word-space props))
-       (line-width (chain-assoc-get 'linewidth props))
-       (fill-space (if (< line-width text-width)
-                       word-space
-                       (/ (- line-width text-width)
-                          (if (= word-count 1) 2 (- word-count 1)))))
-       (line-stencils (if (= word-count 1)
-                          (list
-                           (ly:make-stencil '() '(0 . 0) '(0 . 0))  
-                           (car stencils)
-                           (ly:make-stencil '() '(0 . 0) '(0 . 0))  )
-                          stencils)))
-
-    (if (null? stencils)
+  (let* ((orig-stencils
+         (map (lambda (x) (interpret-markup layout props x))
+              markups))
+        (stencils
+         (map (lambda (stc)
+                (if (ly:stencil-empty? stc)
+                    point-stencil
+                    stc)) orig-stencils))
+        (text-width (apply +
+                           (map (lambda (stc)
+                                  (if (ly:stencil-empty? stc)
+                                      0.0
+                                      (interval-length (ly:stencil-extent stc X))))
+                                stencils)))
+        (word-count (length stencils))
+        (word-space (chain-assoc-get 'word-space props))
+        (line-width (chain-assoc-get 'linewidth props))
+        (fill-space (if (< line-width text-width)
+                        word-space
+                        (/ (- line-width text-width)
+                           (if (= word-count 1) 2 (- word-count 1)))))
+        (line-stencils (if (= word-count 1)
+                           (list
+                            point-stencil
+                            (car stencils)
+                            point-stencil)
+                           stencils)))
+
+    (if (null? (remove ly:stencil-empty? orig-stencils))
        empty-stencil
        (stack-stencils X RIGHT fill-space line-stencils))))
-  
+
 (define (font-markup qualifier value)
   (lambda (layout props arg)
     (interpret-markup layout
@@ -140,34 +144,30 @@ determines the space between each markup in @var{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)))
+  (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?))
+                         'markup-signature
+                         (list markup?))
     
-    (interpret-markup layout props (list anonymous-with-signature arg))
-  ))
+    (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?)
@@ -251,9 +251,9 @@ some punctuation. It doesn't have any letters.  "
   "Set @code{font-shape} to @code{caps}."
   (interpret-markup layout (prepend-alist-chain 'font-shape 'caps props) arg))
 
-;(def-markup-command (latin-i layout props arg) (markup?)
-;  "TEST latin1 encoding."
-;  (interpret-markup layout (prepend-alist-chain 'font-shape 'latin1 props) arg))
+                                       ;(def-markup-command (latin-i layout props arg) (markup?)
+                                       ;  "TEST latin1 encoding."
+                                       ;  (interpret-markup layout (prepend-alist-chain 'font-shape 'latin1 props) arg))
 
 (def-markup-command (dynamic layout props arg) (markup?)
   "Use the dynamic font.  This font only contains @b{s}, @b{f}, @b{m},
@@ -280,40 +280,41 @@ 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?
@@ -326,7 +327,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?)
@@ -358,8 +359,7 @@ of the @code{#'direction} layout property."
   (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
@@ -376,16 +376,16 @@ alignment accordingly."
 #\"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
+  (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 
@@ -412,7 +412,7 @@ 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."
@@ -442,9 +442,9 @@ and/or @code{extra-offset} properties. "
   (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)
@@ -452,25 +452,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)))
@@ -481,13 +481,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))
 
@@ -523,10 +523,10 @@ a shortened down stem."
   "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?)
   "
@@ -568,7 +568,7 @@ that.
 "
   
   (ly:stencil-translate (interpret-markup  layout props arg)
-                         offset))
+                       offset))
 
 (def-markup-command (sub layout props arg) (markup?)
   "Set @var{arg} in subscript."
@@ -611,7 +611,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?)
@@ -642,7 +642,6 @@ any sort of property supported by @internalsref{font-interface} and
 (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
@@ -652,7 +651,7 @@ around the markup."
         (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."
@@ -671,39 +670,44 @@ 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) '())
@@ -711,65 +715,49 @@ the elements marked in @var{indices}, which is a list of numbers."
       (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))
-          )
+      (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))))
-    ))
+       (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 stencils 1.25 #f))
+        (brackets (make-brackets stacked indices '())))
 
     (apply ly:stencil-add
-          (append stacked brackets)
-          )))
-
-
-            
-
-  
-  
-
-     
+          (append stacked brackets))))