]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/define-markup-commands.scm
Merge branch 'master' of ssh://jomand@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / scm / define-markup-commands.scm
index a6773286c6aa7673ca4241dcc0a6b9a3719df222..0b9e7c954026a84d0b47715460df97e53f2a53f2 100644 (file)
@@ -2,7 +2,7 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2000--2006  Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2000--2007  Han-Wen Nienhuys <hanwen@xs4all.nl>
 ;;;;                  Jan Nieuwenhuizen <janneke@gnu.org>
 
 
   (number-pair?)
   "A simple line.  Uses the @code{thickness} property."
   (let*
-      ((th (chain-assoc-get 'thickness props  0.1))
+      ((th (*
+           (ly:output-def-lookup layout 'line-thickness)
+           (chain-assoc-get 'thickness props 1)))
        (x (car dest))
-       (y (cdr dest)))
+       (y (cdr dest))
+       (s (ly:make-stencil
+          `(draw-line
+            ,th
+            0 0
+            ,x ,y)
 
-    (ly:make-stencil
-     `(draw-line
-       ,th
-       0 0
-       ,x ,y)
+          (cons (min x 0) (max x 0))
+          (cons (min y 0) (max y 0)))))
 
-     (cons (min x 0) (min y 0))
-     (cons (max x 0) (max y 0)))))
+    s))
 
 (define-builtin-markup-command (draw-circle layout props radius thickness fill)
   (number? number? boolean?)
@@ -73,7 +76,9 @@ optionally filled."
 @code{circle-padding} and @code{font-size} properties to determine line
 thickness and padding around the markup."
   
-  (let* ((th (chain-assoc-get 'thickness props  0.1))
+  (let* ((th
+         (* (ly:output-def-lookup layout 'line-thickness)
+            (chain-assoc-get 'thickness props  1)))
         (size (chain-assoc-get 'font-size props 0))
         (pad
          (* (magstep size)
@@ -112,12 +117,30 @@ the PDF backend."
      (cons (+ (- half) (car yext))
           (+ half (cdr yext))))))
 
+(define-builtin-markup-command (underline layout props arg) (markup?)
+  "Underline @var{arg}.  Looks at @code{thickness} to determine line
+thickness and y offset."
+  (let* ((thick (*
+             (ly:output-def-lookup layout 'line-thickness)
+             (chain-assoc-get 'thickness props 1)))
+        (markup (interpret-markup layout props arg))
+        (x1 (car (ly:stencil-extent markup X)))
+        (x2 (cdr (ly:stencil-extent markup X)))
+        (y (* thick -2))
+        (line (ly:make-stencil
+               `(draw-line ,thick ,x1 ,y ,x2 ,y)
+               (cons (min x1 0) (max x2 0))
+               (cons thick thick))))
+        (ly:stencil-add markup line)))
+
 (define-builtin-markup-command (box layout props arg) (markup?)
   "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))
+  (let* ((th (*
+             (ly:output-def-lookup layout 'line-thickness)
+             (chain-assoc-get 'thickness props 1)))
         (size (chain-assoc-get 'font-size props 0))
         (pad (* (magstep size)
                 (chain-assoc-get 'box-padding props 0.2)))
@@ -917,65 +940,40 @@ some punctuation.  It doesn't have any letters."
   "Turn @code{text}, which should be a string, to small caps.
 @example
 \\markup \\smallCaps \"Text between double quotes\"
-@end example"
-  (define (make-small-caps-markup chars)
-    (cond ((null? chars)
-          (markup))
-         ((char-whitespace? (car chars))
-          (markup #:fontsize -2 #:simple (string-upcase (list->string (cdr chars)))))
-         (else
-          (markup #:hspace -1
-                  #:fontsize -2 #:simple (string-upcase (list->string chars))))))
-  (define (make-not-small-caps-markup chars)
-    (cond ((null? chars)
-          (markup))
-         ((char-whitespace? (car chars))
-          (markup #:simple (list->string (cdr chars))))
-         (else
-          (markup #:hspace -1
-                  #:simple (list->string chars)))))
-  (define (small-caps-aux done-markups current-chars rest-chars small? after-space?)
-    (cond ((null? rest-chars)
-          ;; the end of the string: build the markup
-          (make-line-markup (reverse! (cons ((if small?
-                                                 make-small-caps-markup
-                                                 make-not-small-caps-markup)
-                                             (reverse! current-chars))
-                                            done-markups))))
-         ((char-whitespace? (car rest-chars))
-          ;; a space char.
-          (small-caps-aux done-markups current-chars (cdr rest-chars) small? #t))
-         ((or (and small? (char-lower-case? (car rest-chars)))
-              (and (not small?) (not (char-lower-case? (car rest-chars)))))
-          ;; same case
-          ;; add the char to the current char list
-          (small-caps-aux done-markups
-                          (cons (car rest-chars)
-                                (if after-space? 
-                                    (cons #\space current-chars)
-                                    current-chars))
-                          (cdr rest-chars) 
-                          small?
-                          #f))
-         (else
-          ;; case change
-          ;; make a markup with current chars, and start a new list with new char
-          (small-caps-aux (cons ((if small?
-                                     make-small-caps-markup
-                                     make-not-small-caps-markup)
-                                 (reverse! current-chars))
-                                done-markups)
-                          (if after-space?
-                              (list (car rest-chars) #\space)
-                              (list (car rest-chars)))
-                          (cdr rest-chars)
-                          (not small?)
-                          #f))))
-  (interpret-markup layout props (small-caps-aux (list) 
-                                                (list) 
-                                                (cons #\space (string->list text))
-                                                #f
-                                                #f)))
+@end example
+
+Note: @code{\\smallCaps} does not support accented characters."
+  (define (char-list->markup chars lower)
+    (let ((final-string (string-upcase (reverse-list->string chars))))
+      (if lower
+         (markup #:fontsize -2 final-string)
+         final-string)))
+  (define (make-small-caps rest-chars currents current-is-lower prev-result)
+    (if (null? rest-chars)
+       (make-concat-markup
+         (reverse! (cons (char-list->markup currents current-is-lower)
+                         prev-result)))
+       (let* ((ch (car rest-chars))
+              (is-lower (char-lower-case? ch)))
+         (if (or (and current-is-lower is-lower)
+                 (and (not current-is-lower) (not is-lower)))
+             (make-small-caps (cdr rest-chars)
+                              (cons ch currents)
+                              is-lower
+                              prev-result)
+             (make-small-caps (cdr rest-chars)
+                              (list ch)
+                              is-lower
+                              (if (null? currents)
+                                  prev-result
+                                  (cons (char-list->markup
+                                           currents current-is-lower)
+                                        prev-result)))))))
+  (interpret-markup layout props
+    (if (string? text)
+       (make-small-caps (string->list text) (list) #f (list))
+       text)))
+
 
 (define-builtin-markup-command (caps layout props arg) (markup?)
   "Emit @var{arg} as small caps."
@@ -1100,9 +1098,9 @@ Use the filled head if @var{filled} is specified."
      name)))
 
 (define-builtin-markup-command (musicglyph layout props glyph-name) (string?)
-  "@var{glyph0name} is converted to a musical symbol; for example,
+  "@var{glyph-name} is converted to a musical symbol; for example,
 @code{\\musicglyph #\"accidentals.natural\"} selects the natural sign from
-the music font.  See @usermanref{The Feta font} for a complete listing of
+the music font.  See @ruser{The Feta font} for a complete listing of
 the possible glyphs."
   (ly:font-get-glyph
    (ly:paper-get-font layout (cons '((font-encoding . fetaMusic))
@@ -1163,7 +1161,8 @@ figured bass notation."
       ((mag (magstep (chain-assoc-get 'font-size props 0)))
        (thickness
        (* mag
-          (chain-assoc-get 'thickness props 0.16)))
+          (ly:output-def-lookup layout 'line-thickness)
+          (chain-assoc-get 'thickness props 1.6)))
        (dy (* mag 0.15))
        (number-stencil (interpret-markup layout
                                         (prepend-alist-chain 'font-encoding 'fetaNumber props)
@@ -1492,7 +1491,7 @@ when @var{label} is not found."
 ;; Markup list commands
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define (space-lines baseline-skip lines)
+(define-public (space-lines baseline-skip lines)
   (map (lambda (line)
         (stack-lines DOWN 0.0 (/ baseline-skip 2.0)
                      (list (ly:make-stencil "" (cons 0 0) (cons 0 0))
@@ -1502,14 +1501,14 @@ when @var{label} is not found."
 
 (define-builtin-markup-list-command (justified-lines layout props args) (markup-list?)
   "Like @code{\\justify}, but return a list of lines instead of a single markup.
-Use @code{\\override #'(line-width . @var{X})} to set the line width;
+Use @code{\\override-lines #'(line-width . @var{X})} to set the line width;
 @var{X}@tie{}is the number of staff spaces."
   (space-lines (chain-assoc-get 'baseline-skip props)
               (wordwrap-markups layout props args #t)))
 
 (define-builtin-markup-list-command (wordwrap-lines layout props args) (markup-list?)
   "Like @code{\\wordwrap}, but return a list of lines instead of a single markup.
-Use @code{\\override #'(line-width . @var{X})} to set the line width,
+Use @code{\\override-lines #'(line-width . @var{X})} to set the line width,
 where @var{X} is the number of staff spaces."
   (space-lines (chain-assoc-get 'baseline-skip props)
               (wordwrap-markups layout props args #f)))