]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/define-markup-commands.scm
Merge branch 'master' into lilypond/translation
[lilypond.git] / scm / define-markup-commands.scm
index 58b446e1cd74be51bf0f18014c13893a1cd123f5..eb96aee8453df5bc8840ee03715b2869f529f5a7 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>
 
 
 (define-public empty-stencil (ly:make-stencil '() '(1 . -1) '(1 . -1)))
 (define-public point-stencil (ly:make-stencil "" '(0 . 0) '(0 . 0)))
 
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; geometric shapes
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (define-builtin-markup-command (draw-line layout props dest)
   (number-pair?)
-  "A simple line.  Uses the @code{thickness} property."
-  (let*
-      ((th (*
-           (ly:output-def-lookup layout 'line-thickness)
-           (chain-assoc-get 'thickness props 1)))
-       (x (car dest))
-       (y (cdr dest))
-       (s (ly:make-stencil
-          `(draw-line
-            ,th
-            0 0
-            ,x ,y)
-
-          (cons (min x 0) (max x 0))
-          (cons (min y 0) (max y 0)))))
-
-    s))
+  graphic
+  ((thickness 1))
+  "
+@cindex drawing lines within text
+
+A simple line.
+@lilypond[verbatim,quote]
+\\markup {
+  \\draw-line #'(4 . 4)
+  \\override #'(thickness . 5)
+  \\draw-line #'(-3 . 0)
+}
+@end lilypond"
+  (let ((th (* (ly:output-def-lookup layout 'line-thickness)
+               thickness))
+        (x (car dest))
+        (y (cdr dest)))
+    (ly:make-stencil
+     `(draw-line
+       ,th
+       0 0
+       ,x ,y)
+     (cons (min x 0) (max x 0))
+     (cons (min y 0) (max y 0)))))
 
 (define-builtin-markup-command (draw-circle layout props radius thickness fill)
   (number? number? boolean?)
-  "A circle of radius @var{radius}, thickness @var{thickness} and
-optionally filled."
+  graphic
+  ()
+  "
+@cindex drawing circles within text
+
+A circle of radius @var{radius}, thickness @var{thickness} and
+optionally filled.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\draw-circle #2 #0.5 ##f
+  \\hspace #2
+  \\draw-circle #2 #0 ##t
+}
+@end lilypond"
   (make-circle-stencil radius thickness fill))
 
-(define-builtin-markup-command (triangle layout props filled) (boolean?)
-  "A triangle, either filled or empty."
-  (let*
-      ((th (chain-assoc-get 'thickness props  0.1))
-       (size (chain-assoc-get 'font-size props 0))
-       (ex (* (magstep size)
-             0.8
-             (chain-assoc-get 'baseline-skip props 2))))
+(define-builtin-markup-command (triangle layout props filled)
+  (boolean?)
+  graphic
+  ((thickness 0.1)
+   (font-size 0)
+   (baseline-skip 2))
+  "
+@cindex drawing triangles within text
+
+A triangle, either filled or empty.
 
+@lilypond[verbatim,quote]
+\\markup {
+  \\triangle ##t
+  \\hspace #2
+  \\triangle ##f
+}
+@end lilypond"
+  (let ((ex (* (magstep font-size) 0.8 baseline-skip)))
     (ly:make-stencil
      `(polygon '(0.0 0.0
-                    ,ex 0.0
-                    ,(* 0.5 ex)
-                    ,(* 0.86 ex))
-          ,th
-          ,filled)
-
+                     ,ex 0.0
+                     ,(* 0.5 ex)
+                     ,(* 0.86 ex))
+           ,thickness
+           ,filled)
      (cons 0 ex)
-     (cons 0 (* .86 ex))
-     )))
+     (cons 0 (* .86 ex)))))
+
+(define-builtin-markup-command (circle layout props arg)
+  (markup?)
+  graphic
+  ((thickness 1)
+   (font-size 0)
+   (circle-padding 0.2))
+  "
+@cindex circling text
 
-(define-builtin-markup-command (circle layout props arg) (markup?)
-  "Draw a circle around @var{arg}.  Use @code{thickness},
+Draw a circle around @var{arg}.  Use @code{thickness},
 @code{circle-padding} and @code{font-size} properties to determine line
-thickness and padding around the markup."
-  
-  (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 'circle-padding props 0.2)))
-        (m (interpret-markup layout props arg)))
+thickness and padding around the markup.
+
+@lilypond[verbatim,quote]
+\\markup \\circle { Hi }
+@end lilypond"
+  (let ((th (* (ly:output-def-lookup layout 'line-thickness)
+               thickness))
+         (pad (* (magstep font-size) circle-padding))
+         (m (interpret-markup layout props arg)))
     (circle-stencil m th pad)))
 
-(define-builtin-markup-command (with-url layout props url arg) (string? markup?)
-  "Add a link to URL @var{url} around @var{arg}.  This only works in
-the PDF backend."
+(define-builtin-markup-command (with-url layout props url arg)
+  (string? markup?)
+  graphic
+  ()
+  "
+@cindex inserting URL links into text
+
+Add a link to URL @var{url} around @var{arg}.  This only works in
+the PDF backend.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\with-url #\"http://lilypond.org/web/\" {
+    LilyPond ... \\italic { music notation for everyone }
+  }
+}
+@end lilypond"
   (let* ((stil (interpret-markup layout props arg))
         (xextent (ly:stencil-extent stil X))
         (yextent (ly:stencil-extent stil Y))
@@ -97,10 +145,17 @@ the PDF backend."
 
     (ly:stencil-add (ly:make-stencil url-expr xextent yextent) stil)))
 
-
 (define-builtin-markup-command (beam layout props width slope thickness)
   (number? number? number?)
-  "Create a beam with the specified parameters."
+  graphic
+  ()
+  "
+@cindex drawing beams within text
+
+Create a beam with the specified parameters.
+@lilypond[verbatim,quote]
+\\markup \\beam #5 #1 #2
+@end lilypond"
   (let* ((y (* slope width))
         (yext (cons (min 0 y) (max 0 y)))
         (half (/ thickness 2)))
@@ -117,46 +172,141 @@ the PDF backend."
      (cons (+ (- half) (car yext))
           (+ half (cdr yext))))))
 
-(define-builtin-markup-command (box layout props arg) (markup?)
-  "Draw a box round @var{arg}.  Looks at @code{thickness},
+(define-builtin-markup-command (underline layout props arg)
+  (markup?)
+  music
+  ((thickness 1))
+  "
+@cindex underlining text
+
+Underline @var{arg}.  Looks at @code{thickness} to determine line
+thickness and y offset.
+
+@lilypond[verbatim,quote]
+\\markup \\underline { CONTENTS }
+@end lilypond"
+  (let* ((thick (* (ly:output-def-lookup layout 'line-thickness)
+                   thickness))
+         (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?)
+  font
+  ((thickness 1)
+   (font-size 0)
+   (box-padding 0.2))
+  "
+@cindex enclosing text within a box
+
+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 (*
-             (ly:output-def-lookup layout 'line-thickness)
-             (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)))
+thickness and padding around the markup.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\override #'(box-padding . 0.5)
+  \\box
+  \\line { V. S. }
+}
+@end lilypond"
+  (let* ((th (* (ly:output-def-lookup layout 'line-thickness)
+                thickness))
+         (pad (* (magstep font-size) box-padding))
+         (m (interpret-markup layout props arg)))
     (box-stencil m th pad)))
 
 (define-builtin-markup-command (filled-box layout props xext yext blot)
   (number-pair? number-pair? number?)
-  "Draw a box with rounded corners of dimensions @var{xext} and
+  graphic
+  ()
+  "
+@cindex drawing solid boxes within text
+@cindex drawing boxes with rounded corners
+
+Draw a box with rounded corners of dimensions @var{xext} and
 @var{yext}.  For example,
 @verbatim
 \\filled-box #'(-.3 . 1.8) #'(-.3 . 1.8) #0
 @end verbatim
 creates a box extending horizontally from -0.3 to 1.8 and
 vertically from -0.3 up to 1.8, with corners formed from a
-circle of diameter@tie{}0 (i.e. sharp corners)."
+circle of diameter@tie{}0 (i.e. sharp corners).
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\filled-box #'(0 . 4) #'(0 . 4) #0
+  \\filled-box #'(0 . 2) #'(-4 . 2) #0.4
+  \\filled-box #'(1 . 8) #'(0 . 7) #0.2
+  \\with-color #white
+  \\filled-box #'(-4.5 . -2.5) #'(3.5 . 5.5) #0.7
+}
+@end lilypond"
   (ly:round-filled-box
    xext yext blot))
 
-(define-builtin-markup-command (rotate layout props ang arg) (number? markup?)
-  "Rotate object with @var{ang} degrees around its center."
+(define-builtin-markup-command (rounded-box layout props arg)
+  (markup?)
+  graphic
+  ((thickness 1)
+   (corner-radius 1)
+   (font-size 0)
+   (box-padding 0.5))
+  "@cindex enclosing text in a bow with rounded corners
+   @cindex drawing boxes with rounded corners around text
+Draw a box with rounded corners around @var{arg}.  Looks at @code{thickness},
+@code{box-padding} and @code{font-size} properties to determine line
+thickness and padding around the markup; the @code{corner-radius} property
+makes possible to define another shape for the corners (default is 1).
+
+@lilypond[quote,verbatim,fragment,relative=2]
+c^\\markup \\rounded-box { Overtura }
+c,8. c16 c4 r
+@end lilypond" 
+  (let ((th (* (ly:output-def-lookup layout 'line-thickness)
+               thickness))
+        (pad (* (magstep font-size) box-padding))
+        (m (interpret-markup layout props arg)))
+    (ly:stencil-add (rounded-box-stencil m th pad corner-radius)
+                    m)))
+
+(define-builtin-markup-command (rotate layout props ang arg)
+  (number? markup?)
+  align
+  ()
+  "
+@cindex rotating text
+
+Rotate object with @var{ang} degrees around its center."
   (let* ((stil (interpret-markup layout props arg)))
     (ly:stencil-rotate stil ang 0 0)))
 
+(define-builtin-markup-command (whiteout layout props arg)
+  (markup?)
+  other
+  ()
+  "
+@cindex adding a white background to text
 
-(define-builtin-markup-command (whiteout layout props arg) (markup?)
-  "Provide a white underground for @var{arg}."
+Provide a white background for @var{arg}."
   (stencil-whiteout (interpret-markup layout props arg)))
 
-(define-builtin-markup-command (pad-markup layout props padding arg) (number? markup?)
-  "Add space around a markup object."
+(define-builtin-markup-command (pad-markup layout props padding arg)
+  (number? markup?)
+  align
+  ()
+  "
+@cindex padding text
+@cindex putting space around text
 
+Add space around a markup object."
   (let*
       ((stil (interpret-markup layout props arg))
        (xext (ly:stencil-extent stil X))
@@ -171,19 +321,29 @@ circle of diameter@tie{}0 (i.e. sharp corners)."
 ;; space
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;;FIXME: is this working? 
-(define-builtin-markup-command (strut layout props) ()
-  "Create a box of the same height as the space in the current font."
+(define-builtin-markup-command (strut layout props)
+  ()
+  other
+  ()
+  "
+@cindex creating vertical spaces in text
+
+Create a box of the same height as the space in the current font."
   (let ((m (ly:text-interface::interpret-markup layout props " ")))
     (ly:make-stencil (ly:stencil-expr m)
-                    '(1000 . -1000)
+                    '(0 . 0)
                     (ly:stencil-extent m X)
                     )))
 
-
 ;; todo: fix negative space
-(define-builtin-markup-command (hspace layout props amount) (number?)
-  "This produces a invisible object taking horizontal space.  For example,
+(define-builtin-markup-command (hspace layout props amount)
+  (number?)
+  align
+  ()
+  "
+@cindex creating horizontal spaces in text
+
+This produces a invisible object taking horizontal space.  For example,
 
 @example 
 \\markup @{ A \\hspace #2.0 B @} 
@@ -201,8 +361,14 @@ normally inserted before elements on a line."
 ;; importing graphics.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define-builtin-markup-command (stencil layout props stil) (ly:stencil?)
-  "Use a stencil as markup."
+(define-builtin-markup-command (stencil layout props stil)
+  (ly:stencil?)
+  other
+  ()
+  "
+@cindex importing stencils into text
+
+Use a stencil as markup."
   stil)
 
 (define bbox-regexp
@@ -220,25 +386,43 @@ normally inserted before elements on a line."
             
        #f)))
 
-(define-builtin-markup-command (epsfile layout props axis size file-name) (number? number? string?)
-  "Inline an EPS image.  The image is scaled along @var{axis} to
-@var{size}."
-
+(define-builtin-markup-command (epsfile layout props axis size file-name)
+  (number? number? string?)
+  graphic
+  ()
+  "
+@cindex inlining an Encapsulated PostScript image
+
+Inline an EPS image.  The image is scaled along @var{axis} to
+@var{size}.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\general-align #Y #DOWN {
+    \\epsfile #X #20 #\"context-example.eps\"
+    \\epsfile #Y #20 #\"context-example.eps\"
+  }
+}
+@end lilypond"
   (if (ly:get-option 'safe)
       (interpret-markup layout props "not allowed in safe")
       (eps-file->stencil axis size file-name)
       ))
 
-(define-builtin-markup-command (postscript layout props str) (string?)
-  "This inserts @var{str} directly into the output as a PostScript
+(define-builtin-markup-command (postscript layout props str)
+  (string?)
+  graphic
+  ()
+  "
+@cindex inserting PostScript directly into text
+
+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,
 selected with @code{-f}. 
 
 For the @TeX{} backend, the following string prints a rotated text
 
-@cindex rotated text
-
 @example
 0 0 moveto /ecrm10 findfont 
 1.75 scalefont setfont 90 rotate (hello) show
@@ -254,8 +438,36 @@ For the postscript backend, use the following
 gsave /ecrm10 findfont 
  10.0 output-scale div 
  scalefont setfont 90 rotate (hello) show grestore 
-@end example"
+@end example
 
+@lilypond[verbatim,quote]
+eyeglassesps = #\"
+  0.15 setlinewidth
+  -0.9 0 translate
+  1.1 1.1 scale
+  1.2 0.7 moveto
+  0.7 0.7 0.5 0 361 arc
+  stroke
+  2.20 0.70 0.50 0 361 arc
+  stroke
+  1.45 0.85 0.30 0 180 arc
+  stroke
+  0.20 0.70 moveto
+  0.80 2.00 lineto
+  0.92 2.26 1.30 2.40 1.15 1.70 curveto
+  stroke
+  2.70 0.70 moveto
+  3.30 2.00 lineto
+  3.42 2.26 3.80 2.40 3.65 1.70 curveto
+  stroke\"
+
+eyeglasses = \\markup {
+  \\with-dimensions #'(0 . 4.4) #'(0 . 2.5)
+  \\postscript #eyeglassesps
+}
+
+\\relative c'' { c2^\\eyeglasses a_\\eyeglasses }
+@end lilypond"
   ;; FIXME
   (ly:make-stencil
    (list 'embedded-ps
@@ -268,9 +480,54 @@ grestore
                 str))
    '(0 . 0) '(0 . 0)))
 
-
-(define-builtin-markup-command (score layout props score) (ly:score?)
-  "Inline an image of music."
+(define-builtin-markup-command (score layout props score)
+  (ly:score?)
+  music
+  ()
+  "
+@cindex inserting music into text
+
+Inline an image of music.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\score {
+    \\new PianoStaff <<
+      \\new Staff \\relative c' {
+        \\key f \\major
+        \\time 3/4
+        \\mark \\markup { Allegro }
+        f2\\p( a4)
+        c2( a4)
+        bes2( g'4)
+        f8( e) e4 r
+      }
+      \\new Staff \\relative c {
+        \\clef bass
+        \\key f \\major
+        \\time 3/4
+        f8( a c a c a
+        f c' es c es c)
+        f,( bes d bes d bes)
+        f( g bes g bes g)
+      }
+    >>
+    \\layout {
+      indent = 0.0\\cm
+      \\context {
+        \\Score
+        \\override RehearsalMark #'break-align-symbols =
+          #'(time-signature key-signature)
+        \\override RehearsalMark #'self-alignment-X = #LEFT
+      }
+      \\context {
+        \\Staff
+        \\override TimeSignature #'break-align-anchor-alignment = #LEFT
+      }
+    }
+  }
+}
+@end lilypond"
   (let* ((output (ly:score-embedded-format score layout)))
 
     (if (ly:music-output? output)
@@ -280,24 +537,39 @@ grestore
          (ly:warning (_"no systems found in \\score markup, does it have a \\layout block?"))
          empty-stencil))))
 
-(define-builtin-markup-command (null layout props) ()
-  "An empty markup with extents of a single point."
+(define-builtin-markup-command (null layout props)
+  ()
+  other
+  ()
+  "
+@cindex creating empty text objects
 
+An empty markup with extents of a single point."
   point-stencil)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; basic formatting.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(define-builtin-markup-command (simple layout props str)
+  (string?)
+  font
+  ()
+  "
+@cindex simple text strings
 
-
-(define-builtin-markup-command (simple layout props str) (string?)
-  "A simple text string; @code{\\markup @{ foo @}} is equivalent with
+A simple text string; @code{\\markup @{ foo @}} is equivalent with
 @code{\\markup @{ \\simple #\"foo\" @}}."
   (interpret-markup layout props str))
 
-(define-builtin-markup-command (tied-lyric layout props str) (string?)
-  "Like simple-markup, but use tie characters for @q{~} tilde symbols."
+(define-builtin-markup-command (tied-lyric layout props str)
+  (string?)
+  music
+  ()
+  "
+@cindex simple text strings with tie characters
+
+Like simple-markup, but use tie characters for @q{~} tilde symbols."
   (if (string-contains str "~")
       (let*
          ((parts (string-split str #\~))
@@ -326,8 +598,7 @@ grestore
        padding = line-width/(word-count - 1) - (length(a) + length(b))/2
        The first and last padding have to be calculated specially using the
        whole length of the first or last text.
-       Return a list of paddings.
-"
+       Return a list of paddings."
   (cond
    ((null? text-widths) '())
    
@@ -349,6 +620,10 @@ grestore
 
 (define-builtin-markup-command (fill-line layout props markups)
   (markup-list?)
+  align
+  ((text-direction RIGHT)
+   (word-space 1)
+   (line-width #f))
   "Put @var{markups} in a horizontal line of width @var{line-width}.
 The markups are spaced or flushed to fill the entire line.
 If there are no arguments, return an empty stencil."
@@ -366,12 +641,9 @@ If there are no arguments, return an empty stencil."
                     (interval-length (ly:stencil-extent stc X))))
               stencils))
         (text-width (apply + text-widths))
-        (text-dir (chain-assoc-get 'text-direction props RIGHT))
         (word-count (length stencils))
-        (word-space (chain-assoc-get 'word-space props 1))
         (prop-line-width (chain-assoc-get 'line-width props #f))
-        (line-width (if prop-line-width prop-line-width
-                        (ly:output-def-lookup layout 'line-width)))
+        (line-width (or line-width (ly:output-def-lookup layout 'line-width)))
         (fill-space
                (cond
                        ((= word-count 1) 
@@ -397,7 +669,7 @@ If there are no arguments, return an empty stencil."
                             point-stencil)
                            stencils)))
 
-    (if (= text-dir LEFT)
+    (if (= text-direction LEFT)
        (set! line-stencils (reverse line-stencils)))
 
     (if (null? (remove ly:stencil-empty? orig-stencils))
@@ -405,29 +677,32 @@ If there are no arguments, return an empty stencil."
        (stack-stencils-padding-list X
                                     RIGHT fill-space-normal line-stencils))))
        
-(define-builtin-markup-command (line layout props args) (markup-list?)
+(define-builtin-markup-command (line layout props args)
+  (markup-list?)
+  align
+  ((word-space)
+   (text-direction RIGHT))
   "Put @var{args} in a horizontal line.  The property @code{word-space}
 determines the space between each markup in @var{args}."
-  (let*
-      ((stencils (interpret-markup-list layout props args))
-       (space    (chain-assoc-get 'word-space props))
-       (text-dir (chain-assoc-get 'text-direction props RIGHT)) 
-       )
-
-    (if (= text-dir LEFT)
-       (set! stencils (reverse stencils)))
-    
-
+  (let ((stencils (interpret-markup-list layout props args)))
+    (if (= text-direction LEFT)
+        (set! stencils (reverse stencils)))
     (stack-stencil-line
-     space
+     word-space
      (remove ly:stencil-empty? stencils))))
 
-(define-builtin-markup-command (concat layout props args) (markup-list?)
-  "Concatenate @var{args} in a horizontal line, without spaces inbetween.
+(define-builtin-markup-command (concat layout props args)
+  (markup-list?)
+  align
+  ()
+  "
+@cindex concatenating text
+@cindex ligatures in text
+
+Concatenate @var{args} in a horizontal line, without spaces inbetween.
 Strings and simple markups are concatenated on the input level, allowing
 ligatures.  For example, @code{\\concat @{ \"f\" \\simple #\"i\" @}} is
 equivalent to @code{\"fi\"}."
-
   (define (concat-string-args arg-list)
     (fold-right (lambda (arg result-list)
                   (let ((result (if (pair? result-list)
@@ -449,171 +724,178 @@ equivalent to @code{\"fi\"}."
 
 (define (wordwrap-stencils stencils
                           justify base-space line-width text-dir)
-  
-  "Perform simple wordwrap, return stencil of each line."
-  
+  "Perform simple wordwrap, return stencil of each line."  
   (define space (if justify
-                   
-                   ;; justify only stretches lines.
+                    ;; justify only stretches lines.
                    (* 0.7 base-space)
                    base-space))
-       
   (define (take-list width space stencils
                     accumulator accumulated-width)
     "Return (head-list . tail) pair, with head-list fitting into width"
     (if (null? stencils)
        (cons accumulator stencils)
-       (let*
-           ((first (car stencils))
-            (first-wid (cdr (ly:stencil-extent (car stencils) X)))
-            (newwid (+ space first-wid accumulated-width))
-            )
-
-         (if
-          (or (null? accumulator)
-              (< newwid width))
-
-          (take-list width space
-                     (cdr stencils)
-                     (cons first accumulator)
-                     newwid)
-            (cons accumulator stencils))
-          )))
-
-    (let loop
-       ((lines '())
-        (todo stencils))
-
-      (let*
-         ((line-break (take-list line-width space todo
-                                '() 0.0))
+       (let* ((first (car stencils))
+               (first-wid (cdr (ly:stencil-extent (car stencils) X)))
+               (newwid (+ space first-wid accumulated-width)))
+         (if (or (null? accumulator)
+                  (< newwid width))
+              (take-list width space
+                         (cdr stencils)
+                         (cons first accumulator)
+                         newwid)
+              (cons accumulator stencils)))))
+  (let loop ((lines '())
+             (todo stencils))
+    (let* ((line-break (take-list line-width space todo
+                                  '() 0.0))
           (line-stencils (car line-break))
-          (space-left (- line-width (apply + (map (lambda (x) (cdr (ly:stencil-extent x X)))
-                                             line-stencils))))
-
-          (line-word-space (cond
-                            ((not justify) space)
-
-                            ;; don't stretch last line of paragraph.
-                            ;; hmmm . bug - will overstretch the last line in some case. 
-                            ((null? (cdr line-break))
-                             base-space)
-                            ((null? line-stencils) 0.0)
-                            ((null? (cdr line-stencils)) 0.0)
-                            (else (/ space-left (1- (length line-stencils))))))
-
-          (line (stack-stencil-line
-                 line-word-space
-                 (if (= text-dir RIGHT)
-                     (reverse line-stencils)
-                     line-stencils))))
-
-       (if (pair? (cdr line-break))
-           (loop (cons line lines)
-                 (cdr line-break))
-
-           (begin
-             (if (= text-dir LEFT)
-                 (set! line
-                       (ly:stencil-translate-axis line
-                                                  (- line-width (interval-end (ly:stencil-extent line X)))
-                                                  X)))
-             (reverse (cons line lines))
-             
-           )))
-
-      ))
-
+          (space-left (- line-width
+                          (apply + (map (lambda (x) (cdr (ly:stencil-extent x X)))
+                                        line-stencils))))
+          (line-word-space (cond ((not justify) space)
+                                  ;; don't stretch last line of paragraph.
+                                  ;; hmmm . bug - will overstretch the last line in some case. 
+                                  ((null? (cdr line-break))
+                                   base-space)
+                                  ((null? line-stencils) 0.0)
+                                  ((null? (cdr line-stencils)) 0.0)
+                                  (else (/ space-left (1- (length line-stencils))))))
+          (line (stack-stencil-line line-word-space
+                                     (if (= text-dir RIGHT)
+                                         (reverse line-stencils)
+                                         line-stencils))))
+      (if (pair? (cdr line-break))
+          (loop (cons line lines)
+                (cdr line-break))
+          (begin
+            (if (= text-dir LEFT)
+                (set! line
+                      (ly:stencil-translate-axis
+                       line
+                       (- line-width (interval-end (ly:stencil-extent line X)))
+                       X)))
+            (reverse (cons line lines)))))))
+
+(define-builtin-markup-list-command (wordwrap-internal layout props justify args)
+  (boolean? markup-list?)
+  ((line-width #f)
+   (word-space)
+   (text-direction RIGHT))
+  "Internal markup list command used to define @code{\\justify} and @code{\\wordwrap}."
+  (wordwrap-stencils (remove ly:stencil-empty?
+                             (interpret-markup-list layout props args))
+                     justify
+                     word-space
+                     (or line-width
+                         (ly:output-def-lookup layout 'line-width))
+                     text-direction))
+
+(define-builtin-markup-command (justify layout props args)
+  (markup-list?)
+  align
+  ((baseline-skip)
+   wordwrap-internal-markup-list)
+  "
+@cindex justifying text
 
-(define (wordwrap-markups layout props args justify)
-  (let*
-      ((prop-line-width (chain-assoc-get 'line-width props #f))
-       (line-width (if prop-line-width prop-line-width
-                      (ly:output-def-lookup layout 'line-width)))
-       (word-space (chain-assoc-get 'word-space props))
-       (text-dir (chain-assoc-get 'text-direction props RIGHT)))
-    (wordwrap-stencils (remove ly:stencil-empty?
-                               (interpret-markup-list layout props args))
-                       justify word-space line-width
-                       text-dir)))
-
-(define-builtin-markup-command (justify layout props args) (markup-list?)
-  "Like wordwrap, but with lines stretched to justify the margins.
+Like wordwrap, but with lines stretched to justify the margins.
 Use @code{\\override #'(line-width . @var{X})} to set the line width;
 @var{X}@tie{}is the number of staff spaces."
-  (stack-lines DOWN 0.0 (chain-assoc-get 'baseline-skip props)
-              (wordwrap-markups layout props args #t)))
+  (stack-lines DOWN 0.0 baseline-skip
+               (wordwrap-internal-markup-list layout props #t args)))
 
-(define-builtin-markup-command (wordwrap layout props args) (markup-list?)
+(define-builtin-markup-command (wordwrap layout props args)
+  (markup-list?)
+  align
+  ((baseline-skip)
+   wordwrap-internal-markup-list)
   "Simple wordwrap.  Use @code{\\override #'(line-width . @var{X})} to set
 the line width, where @var{X} is the number of staff spaces."
-  (stack-lines DOWN 0.0 (chain-assoc-get 'baseline-skip props)
-              (wordwrap-markups layout props args #f)))
-
-(define (wordwrap-string layout props justify arg) 
-  (let*
-      ((baseline-skip (chain-assoc-get 'baseline-skip props))
-       (line-width (chain-assoc-get 'line-width props))
-       (word-space (chain-assoc-get 'word-space props))
-       
-       (para-strings (regexp-split
-                     (string-regexp-substitute "\r" "\n"
-                                               (string-regexp-substitute "\r\n" "\n" arg))
-                     "\n[ \t\n]*\n[ \t\n]*"))
-       
-       (text-dir (chain-assoc-get 'text-direction props RIGHT)) 
-       (list-para-words (map (lambda (str)
-                              (regexp-split str "[ \t\n]+"))
-                            para-strings))
-       (para-lines (map (lambda (words)
-                         (let*
-                             ((stencils
-                               (remove
-                                ly:stencil-empty? (map 
-                                     (lambda (x)
-                                       (interpret-markup layout props x))
-                                     words)))
-                              (lines (wordwrap-stencils stencils
-                                                        justify word-space
-                                                        line-width text-dir
-                                                        )))
-
-                           lines))
-                       
-                       list-para-words)))
-
-    (stack-lines DOWN 0.0 baseline-skip (apply append para-lines))))
-
-
-(define-builtin-markup-command (wordwrap-string layout props arg) (string?)
+  (stack-lines DOWN 0.0 baseline-skip
+              (wordwrap-internal-markup-list layout props #f args)))
+
+(define-builtin-markup-list-command (wordwrap-string-internal layout props justify arg)
+  (boolean? string?)
+  ((line-width)
+   (word-space)
+   (text-direction RIGHT))
+  "Internal markup list command used to define @code{\\justify-string} and
+@code{\\wordwrap-string}."
+  (let* ((para-strings (regexp-split
+                        (string-regexp-substitute
+                         "\r" "\n"
+                         (string-regexp-substitute "\r\n" "\n" arg))
+                        "\n[ \t\n]*\n[ \t\n]*"))
+         (list-para-words (map (lambda (str)
+                                 (regexp-split str "[ \t\n]+"))
+                               para-strings))
+         (para-lines (map (lambda (words)
+                            (let* ((stencils
+                                    (remove ly:stencil-empty?
+                                            (map (lambda (x)
+                                                   (interpret-markup layout props x))
+                                                 words))))
+                              (wordwrap-stencils stencils
+                                                 justify word-space
+                                                 line-width text-direction)))
+                          list-para-words)))
+    (apply append para-lines)))
+
+(define-builtin-markup-command (wordwrap-string layout props arg)
+  (string?)
+  align
+  ((baseline-skip)
+   wordwrap-string-internal-markup-list)
   "Wordwrap a string.  Paragraphs may be separated with double newlines."
-  (wordwrap-string layout props  #f arg))
-  
-(define-builtin-markup-command (justify-string layout props arg) (string?)
+  (stack-lines DOWN 0.0 baseline-skip
+               (wordwrap-string-internal-markup-list layout props #f arg)))
+
+(define-builtin-markup-command (justify-string layout props arg)
+  (string?)
+  align
+  ((baseline-skip)
+   wordwrap-string-internal-markup-list)
   "Justify a string.  Paragraphs may be separated with double newlines"
-  (wordwrap-string layout props #t arg))
-
+  (stack-lines DOWN 0.0 baseline-skip
+               (wordwrap-string-internal-markup-list layout props #t arg)))
 
-(define-builtin-markup-command (wordwrap-field layout props symbol) (symbol?)
+(define-builtin-markup-command (wordwrap-field layout props symbol)
+  (symbol?)
+  align
+  ()
   "Wordwrap the data which has been assigned to @var{symbol}."
   (let* ((m (chain-assoc-get symbol props)))
     (if (string? m)
-     (interpret-markup layout props
-      (list wordwrap-string-markup m))
-     (ly:make-stencil '()  '(1 . -1) '(1 . -1)))))
+        (wordwrap-string-markup layout props m)
+        empty-stencil)))
 
-(define-builtin-markup-command (justify-field layout props symbol) (symbol?)
+(define-builtin-markup-command (justify-field layout props symbol)
+  (symbol?)
+  align
+  ()
   "Justify the data which has been assigned to @var{symbol}."
   (let* ((m (chain-assoc-get symbol props)))
     (if (string? m)
-     (interpret-markup layout props
-      (list justify-string-markup m))
-     (ly:make-stencil '()  '(1 . -1) '(1 . -1)))))
-
-
+        (justify-string-markup layout props m)
+        empty-stencil)))
 
-(define-builtin-markup-command (combine layout props m1 m2) (markup? markup?)
-  "Print two markups on top of each other."
+(define-builtin-markup-command (combine layout props m1 m2)
+  (markup? markup?)
+  align
+  ()
+  "
+@cindex merging text
+
+Print two markups on top of each other.
+@lilypond[verbatim,quote]
+\\markup {
+  \\fontsize #5
+  \\override #'(thickness . 2)
+  \\combine
+  \\draw-line #'(0 . 4)
+  \\arrow-head #Y #DOWN ##f
+}
+@end lilypond"
   (let* ((s1 (interpret-markup layout props m1))
         (s2 (interpret-markup layout props m2)))
     (ly:stencil-add s1 s2)))
@@ -621,183 +903,250 @@ the line width, where @var{X} is the number of staff spaces."
 ;;
 ;; TODO: should extract baseline-skip from each argument somehow..
 ;; 
-(define-builtin-markup-command (column layout props args) (markup-list?)
-  "Stack the markups in @var{args} vertically.  The property
-@code{baseline-skip} determines the space between each markup in @var{args}."
+(define-builtin-markup-command (column layout props args)
+  (markup-list?)
+  align
+  ((baseline-skip))
+  "
+@cindex stacking text in a column
 
-  (let*
-      ((arg-stencils (interpret-markup-list layout props args))
-       (skip (chain-assoc-get 'baseline-skip props)))
+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 skip
-     (remove ly:stencil-empty? arg-stencils))))
-
-
-(define-builtin-markup-command (dir-column layout props args) (markup-list?)
-  "Make a column of args, going up or down, depending on the setting
-of the @code{#'direction} layout property."
-  (let* ((dir (chain-assoc-get 'direction props)))
-    (stack-lines
-     (if (number? dir) dir -1)
-     0.0
-     (chain-assoc-get 'baseline-skip props)
-     (interpret-markup-list layout props args))))
-
-(define-builtin-markup-command (center-align layout props args) (markup-list?)
-  "Put @code{args} in a centered column."
+@lilypond[verbatim,quote]
+\\markup \\column { one two three }
+@end lilypond"
+  (let ((arg-stencils (interpret-markup-list layout props args)))
+    (stack-lines -1 0.0 baseline-skip
+                 (remove ly:stencil-empty? arg-stencils))))
+
+(define-builtin-markup-command (dir-column layout props args)
+  (markup-list?)
+  align
+  ((direction)
+   (baseline-skip))
+  "
+@cindex changing direction of text columns
+
+Make a column of args, going up or down, depending on the setting
+of the @code{#'direction} layout property.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\override #'(direction . 1)
+  \\dir-column { going up }
+  \\dir-column { going down }
+}
+@end lilypond"
+  (stack-lines (if (number? direction) direction -1)
+               0.0
+               baseline-skip
+               (interpret-markup-list layout props args)))
+
+(define-builtin-markup-command (center-align layout props args)
+  (markup-list?)
+  align
+  ((baseline-skip))
+  "
+@cindex centering a column of text
+
+Put @code{args} in a centered column.
+
+@lilypond[verbatim,quote]
+\\markup \\center-align { one two three }
+@end lilypond"
   (let* ((mols (interpret-markup-list layout props args))
          (cmols (map (lambda (x) (ly:stencil-aligned-to x X CENTER)) mols)))
-    
-    (stack-lines -1 0.0 (chain-assoc-get 'baseline-skip props) cmols)))
+    (stack-lines -1 0.0 baseline-skip cmols)))
+
+(define-builtin-markup-command (vcenter layout props arg)
+  (markup?)
+  align
+  ()
+  "
+@cindex vertically centering text
 
-(define-builtin-markup-command (vcenter layout props arg) (markup?)
-  "Align @code{arg} to its Y@tie{}center."
+Align @code{arg} to its Y@tie{}center."
   (let* ((mol (interpret-markup layout props arg)))
     (ly:stencil-aligned-to mol Y CENTER)))
 
-(define-builtin-markup-command (hcenter layout props arg) (markup?)
-  "Align @code{arg} to its X@tie{}center."
+(define-builtin-markup-command (hcenter layout props arg)
+  (markup?)
+  align
+  ()
+  "
+@cindex horizontally centering text
+
+Align @code{arg} to its X@tie{}center."
   (let* ((mol (interpret-markup layout props arg)))
     (ly:stencil-aligned-to mol X CENTER)))
 
-(define-builtin-markup-command (right-align layout props arg) (markup?)
-  "Align @var{arg} on its right edge."
+(define-builtin-markup-command (right-align layout props arg)
+  (markup?)
+  align
+  ()
+  "
+@cindex right aligning text
+
+Align @var{arg} on its right edge."
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-aligned-to m X RIGHT)))
 
-(define-builtin-markup-command (left-align layout props arg) (markup?)
-  "Align @var{arg} on its left edge."
+(define-builtin-markup-command (left-align layout props arg)
+  (markup?)
+  align
+  ()
+  "
+@cindex left aligning text
+
+Align @var{arg} on its left edge."
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-aligned-to m X LEFT)))
 
-(define-builtin-markup-command (general-align layout props axis dir arg)  (integer? number? markup?)
-  "Align @var{arg} in @var{axis} direction to the @var{dir} side."
+(define-builtin-markup-command (general-align layout props axis dir arg)
+  (integer? number? markup?)
+  align
+  ()
+  "
+@cindex controlling general text alignment
+
+Align @var{arg} in @var{axis} direction to the @var{dir} side."
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-aligned-to m axis dir)))
 
-(define-builtin-markup-command (halign layout props dir arg) (number? markup?)
-  "Set horizontal alignment.  If @var{dir} is @code{-1}, then it is
+(define-builtin-markup-command (halign layout props dir arg)
+  (number? markup?)
+  align
+  ()
+  "
+@cindex setting horizontal text alignment
+
+Set horizontal alignment.  If @var{dir} is @code{-1}, then it is
 left-aligned, while @code{+1} is right.  Values inbetween interpolate
 alignment accordingly."
   (let* ((m (interpret-markup layout props arg)))
     (ly:stencil-aligned-to m X dir)))
 
+(define-builtin-markup-command (with-dimensions layout props x y arg)
+  (number-pair? number-pair? markup?)
+  other
+  ()
+  "
+@cindex setting extent of text objects
 
-
-(define-builtin-markup-command (with-dimensions layout props x y arg) (number-pair? number-pair? markup?)
-  "Set the dimensions of @var{arg} to @var{x} and@tie{}@var{y}."
-  
+Set the dimensions of @var{arg} to @var{x} and@tie{}@var{y}."  
   (let* ((m (interpret-markup layout props arg)))
     (ly:make-stencil (ly:stencil-expr m) x y)))
 
-
-(define-builtin-markup-command (pad-around layout props amount arg) (number? markup?)
-  "Add padding @var{amount} all around @var{arg}."
-  
-  (let*
-      ((m (interpret-markup layout props arg))
-       (x (ly:stencil-extent m X))
-       (y (ly:stencil-extent m Y)))
-    
-       
+(define-builtin-markup-command (pad-around layout props amount arg)
+  (number? markup?)
+  align
+  ()
+  "Add padding @var{amount} all around @var{arg}."  
+  (let* ((m (interpret-markup layout props arg))
+         (x (ly:stencil-extent m X))
+         (y (ly:stencil-extent m Y)))
     (ly:make-stencil (ly:stencil-expr m)
-                    (interval-widen x amount)
-                    (interval-widen y amount))
-   ))
+                     (interval-widen x amount)
+                     (interval-widen y amount))))
 
+(define-builtin-markup-command (pad-x layout props amount arg)
+  (number? markup?)
+  align
+  ()
+  "
+@cindex padding text horizontally
 
-(define-builtin-markup-command (pad-x layout props amount arg) (number? markup?)
-  "Add padding @var{amount} around @var{arg} in the X@tie{}direction."
-  (let*
-      ((m (interpret-markup layout props arg))
-       (x (ly:stencil-extent m X))
-       (y (ly:stencil-extent m Y)))
-    
-       
+Add padding @var{amount} around @var{arg} in the X@tie{}direction."
+  (let* ((m (interpret-markup layout props arg))
+         (x (ly:stencil-extent m X))
+         (y (ly:stencil-extent m Y)))
     (ly:make-stencil (ly:stencil-expr m)
-                    (interval-widen x amount)
-                    y)
-   ))
-
+                     (interval-widen x amount)
+                     y)))
 
-(define-builtin-markup-command (put-adjacent layout props arg1 axis dir arg2) (markup? integer? ly:dir?  markup?)
+(define-builtin-markup-command (put-adjacent layout props arg1 axis dir arg2)
+  (markup? integer? ly:dir? markup?)
+  align
+  ()
   "Put @var{arg2} next to @var{arg1}, without moving @var{arg1}."
-  (let* ((m1 (interpret-markup layout props arg1))
-        (m2 (interpret-markup layout props arg2)))
-
-    (ly:stencil-combine-at-edge m1 axis dir m2 0.0)
-  ))
-
-(define-builtin-markup-command (transparent layout props arg) (markup?)
+  (let ((m1 (interpret-markup layout props arg1))
+        (m2 (interpret-markup layout props arg2)))
+    (ly:stencil-combine-at-edge m1 axis dir m2 0.0)))
+
+(define-builtin-markup-command (transparent layout props arg)
+  (markup?)
+  other
+  ()
   "Make the argument transparent."
-  (let*
-      ((m (interpret-markup layout props arg))
-       (x (ly:stencil-extent m X))
-       (y (ly:stencil-extent m Y)))
-    
-
-    
-    (ly:make-stencil ""
-                    x y)))
-
+  (let* ((m (interpret-markup layout props arg))
+         (x (ly:stencil-extent m X))
+         (y (ly:stencil-extent m Y)))
+    (ly:make-stencil "" x y)))
 
 (define-builtin-markup-command (pad-to-box layout props x-ext y-ext arg)
   (number-pair? number-pair? markup?)
+  align
+  ()
   "Make @var{arg} take at least @var{x-ext}, @var{y-ext} space."
-
-  (let*
-      ((m (interpret-markup layout props arg))
-       (x (ly:stencil-extent m X))
-       (y (ly:stencil-extent m Y)))
-
+  (let* ((m (interpret-markup layout props arg))
+         (x (ly:stencil-extent m X))
+         (y (ly:stencil-extent m Y)))
     (ly:make-stencil (ly:stencil-expr m)
-                    (interval-union x-ext x)
-                    (interval-union y-ext y))))
-
+                     (interval-union x-ext x)
+                     (interval-union y-ext y))))
 
 (define-builtin-markup-command (hcenter-in layout props length arg)
   (number? markup?)
+  align
+  ()
   "Center @var{arg} horizontally within a box of extending
 @var{length}/2 to the left and right."
-
   (interpret-markup layout props
-                   (make-pad-to-box-markup
-                    (cons (/ length -2) (/ length 2))
-                    '(0 . 0)
-                    (make-hcenter-markup arg))))
-
+                    (make-pad-to-box-markup
+                     (cons (/ length -2) (/ length 2))
+                     '(0 . 0)
+                     (make-hcenter-markup arg))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; property
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define-builtin-markup-command (fromproperty layout props symbol) (symbol?)
+(define-builtin-markup-command (fromproperty layout props symbol)
+  (symbol?)
+  other
+  ()
   "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)))))
-
+        (interpret-markup layout props m)
+        empty-stencil)))
 
-(define-builtin-markup-command (on-the-fly layout props procedure arg) (symbol? markup?)
+(define-builtin-markup-command (on-the-fly layout props procedure arg)
+  (symbol? markup?)
+  other
+  ()
   "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))))
 
+(define-builtin-markup-command (override layout props new-prop arg)
+  (pair? markup?)
+  other
+  ()
+  "
+@cindex overriding properties within text markup
 
-
-(define-builtin-markup-command (override layout props new-prop arg) (pair? markup?)
-  "Add the first argument in to the property list.  Properties may be
-any sort of property supported by @internalsref{font-interface} and
-@internalsref{text-interface}, for example
+Add the first argument in to the property list.  Properties may be
+any sort of property supported by @rinternals{font-interface} and
+@rinternals{text-interface}, for example
 
 @example
 \\override #'(font-family . married) \"bla\"
@@ -808,58 +1157,87 @@ any sort of property supported by @internalsref{font-interface} and
 ;; files
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define-builtin-markup-command (verbatim-file layout props name) (string?)
-  "Read the contents of a file, and include it verbatim."
-
-  (interpret-markup
-   layout props
-   (if  (ly:get-option 'safe)
-       "verbatim-file disabled in safe mode"
-       (let*
-           ((str (ly:gulp-file name))
-            (lines (string-split str #\nl)))
+(define-builtin-markup-command (verbatim-file layout props name)
+  (string?)
+  other
+  ()
+  "Read the contents of a file, and include it verbatim.
 
-         (make-typewriter-markup
-          (make-column-markup lines)))
-       )))
+@lilypond[verbatim,quote]
+\\markup \\verbatim-file #\"simple.ly\"
+@end lilypond"
+  (interpret-markup layout props
+                    (if  (ly:get-option 'safe)
+                         "verbatim-file disabled in safe mode"
+                         (let* ((str (ly:gulp-file name))
+                                (lines (string-split str #\nl)))
+                           (make-typewriter-markup
+                            (make-column-markup lines))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; fonts.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(define-builtin-markup-command (bigger layout props arg)
+  (markup?)
+  font
+  ()
+  "Increase the font size relative to current setting.
 
-(define-builtin-markup-command (bigger layout props arg) (markup?)
-  "Increase the font size relative to current setting."
+@lilypond[verbatim,quote]
+\\markup \\bigger {
+  Voici venir les temps où vibrant sur sa tige
+}
+@end lilypond"
   (interpret-markup layout props
    `(,fontsize-markup 1 ,arg)))
 
-(define-builtin-markup-command (smaller layout props arg) (markup?)
+(define-builtin-markup-command (smaller layout props arg)
+  (markup?)
+  font
+  ()
   "Decrease the font size relative to current setting."
   (interpret-markup layout props
    `(,fontsize-markup -1 ,arg)))
 
-(define-builtin-markup-command larger (markup?) bigger-markup)
-
-(define-builtin-markup-command (finger layout props arg) (markup?)
-  "Set the argument as small numbers."
+(define-builtin-markup-command larger
+  (markup?)
+  font
+  bigger-markup)
+
+(define-builtin-markup-command (finger layout props arg)
+  (markup?)
+  font
+  ()
+  "Set the argument as small numbers.
+@lilypond[verbatim,quote]
+\\markup \\finger { 1 2 3 4 5 }
+@end lilypond"
   (interpret-markup layout
                     (cons '((font-size . -5) (font-encoding . fetaNumber)) props)
                     arg))
 
-
-(define-builtin-markup-command (fontsize layout props increment arg) (number? markup?)
+(define-builtin-markup-command (fontsize layout props increment arg)
+  (number? markup?)
+  font
+  ((font-size 0)
+   (word-space 1)
+   (baseline-skip 2))
   "Add @var{increment} to the font-size.  Adjust baseline skip accordingly."
-
-  (let* ((fs (chain-assoc-get 'font-size props 0))
-        (bs (chain-assoc-get 'baseline-skip props 2)) 
-         (entries (list
-                  (cons 'baseline-skip (* bs (magstep increment)))
-                  (cons 'font-size (+ fs increment )))))
-
+  (let ((entries (list
+                  (cons 'baseline-skip (* baseline-skip (magstep increment)))
+                  (cons 'word-space (* word-space (magstep increment)))
+                  (cons 'font-size (+ font-size increment)))))
     (interpret-markup layout (cons entries props) arg)))
 
-(define-builtin-markup-command (magnify layout props sz arg) (number? markup?)
-  "Set the font magnification for its argument.  In the following
+(define-builtin-markup-command (magnify layout props sz arg)
+  (number? markup?)
+  font
+  ()
+  "
+@cindex magnifying text
+
+Set the font magnification for its argument.  In the following
 example, the middle@tie{}A is 10% larger:
 
 @example
@@ -873,157 +1251,213 @@ Use @code{\\fontsize} otherwise."
    (prepend-alist-chain 'font-size (magnification->font-size sz) props)
    arg))
 
-(define-builtin-markup-command (bold layout props arg) (markup?)
-  "Switch to bold font-series."
+(define-builtin-markup-command (bold layout props arg)
+  (markup?)
+  font
+  ()
+  "Switch to bold font-series.
+  
+@lilypond[verbatim,quote]
+\\markup \\bold {
+  Chaque fleur s'évapore ainsi qu'un encensoir
+}
+@end lilypond"
   (interpret-markup layout (prepend-alist-chain 'font-series 'bold props) arg))
 
-(define-builtin-markup-command (sans layout props arg) (markup?)
+(define-builtin-markup-command (sans layout props arg)
+  (markup?)
+  font
+  ()
   "Switch to the sans serif family."
   (interpret-markup layout (prepend-alist-chain 'font-family 'sans props) arg))
 
-(define-builtin-markup-command (number layout props arg) (markup?)
+(define-builtin-markup-command (number layout props arg)
+  (markup?)
+  font
+  ()
   "Set font family to @code{number}, which yields the font used for
 time signatures and fingerings.  This font only contains numbers and
-some punctuation.  It doesn't have any letters."
+some punctuation.  It doesn't have any letters.
+
+@lilypond[verbatim,quote]
+\\markup \\number { 0 1 2 3 4 5 6 7 8 9 . , + - }
+@end lilypond"
   (interpret-markup layout (prepend-alist-chain 'font-encoding 'fetaNumber props) arg))
 
-(define-builtin-markup-command (roman layout props arg) (markup?)
+(define-builtin-markup-command (roman layout props arg)
+  (markup?)
+  font
+  ()
   "Set font family to @code{roman}."
   (interpret-markup layout (prepend-alist-chain 'font-family 'roman props) arg))
 
-(define-builtin-markup-command (huge layout props arg) (markup?)
+(define-builtin-markup-command (huge layout props arg)
+  (markup?)
+  font
+  ()
   "Set font size to +2."
   (interpret-markup layout (prepend-alist-chain 'font-size 2 props) arg))
 
-(define-builtin-markup-command (large layout props arg) (markup?)
+(define-builtin-markup-command (large layout props arg)
+  (markup?)
+  font
+  ()
   "Set font size to +1."
   (interpret-markup layout (prepend-alist-chain 'font-size 1 props) arg))
 
-(define-builtin-markup-command (normalsize layout props arg) (markup?)
+(define-builtin-markup-command (normalsize layout props arg)
+  (markup?)
+  font
+  ()
   "Set font size to default."
   (interpret-markup layout (prepend-alist-chain 'font-size 0 props) arg))
 
-(define-builtin-markup-command (small layout props arg) (markup?)
+(define-builtin-markup-command (small layout props arg)
+  (markup?)
+  font
+  ()
   "Set font size to -1."
   (interpret-markup layout (prepend-alist-chain 'font-size -1 props) arg))
 
-(define-builtin-markup-command (tiny layout props arg) (markup?)
+(define-builtin-markup-command (tiny layout props arg)
+  (markup?)
+  font
+  ()
   "Set font size to -2."
   (interpret-markup layout (prepend-alist-chain 'font-size -2 props) arg))
 
-(define-builtin-markup-command (teeny layout props arg) (markup?)
+(define-builtin-markup-command (teeny layout props arg)
+  (markup?)
+  font
+  ()
   "Set font size to -3."
   (interpret-markup layout (prepend-alist-chain 'font-size -3 props) arg))
 
-(define-builtin-markup-command (fontCaps layout props arg) (markup?)
-  "Set @code{font-shape} to @code{caps}."
+(define-builtin-markup-command (fontCaps layout props arg)
+  (markup?)
+  font
+  ()
+  "Set @code{font-shape} to @code{caps}"
   (interpret-markup layout (prepend-alist-chain 'font-shape 'caps props) arg))
 
 ;; Poor man's caps
-(define-builtin-markup-command (smallCaps layout props text) (markup?)
+(define-builtin-markup-command (smallCaps layout props text)
+  (markup?)
+  font
+  ()
   "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)))
-
-(define-builtin-markup-command (caps layout props arg) (markup?)
-  "Emit @var{arg} as small caps."
+@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?)
+  font
+  ()
+  "Emit @var{arg} as small caps.
+
+@lilypond[verbatim,quote]
+\\markup \\caps {
+  Les sons et les parfums tournent dans l'air du soir
+}
+@end lilypond"
   (interpret-markup layout props (make-smallCaps-markup arg)))
 
-(define-builtin-markup-command (dynamic layout props arg) (markup?)
+(define-builtin-markup-command (dynamic layout props arg)
+  (markup?)
+  font
+  ()
   "Use the dynamic font.  This font only contains @b{s}, @b{f}, @b{m},
 @b{z}, @b{p}, and @b{r}.  When producing phrases, like
 @q{pi@`{u}@tie{}@b{f}}, the normal words (like @q{pi@`{u}}) should be
-done in a different font.  The recommended font for this is bold and italic."
+done in a different font.  The recommended font for this is bold and italic.
+@lilypond[verbatim,quote]
+\\markup { \\dynamic sfzp }
+@end lilypond"
   (interpret-markup
    layout (prepend-alist-chain 'font-encoding 'fetaDynamic props) arg))
 
-(define-builtin-markup-command (text layout props arg) (markup?)
+(define-builtin-markup-command (text layout props arg)
+  (markup?)
+  font
+  ()
   "Use a text font instead of music symbol or music alphabet font."  
 
   ;; ugh - latin1
   (interpret-markup layout (prepend-alist-chain 'font-encoding 'latin1 props)
                    arg))
 
+(define-builtin-markup-command (italic layout props arg)
+  (markup?)
+  font
+  ()
+  "Use italic @code{font-shape} for @var{arg}.
 
-(define-builtin-markup-command (italic layout props arg) (markup?)
-  "Use italic @code{font-shape} for @var{arg}."
+@lilypond[verbatim,quote]
+\\markup \\italic { scherzando e leggiero }
+@end lilypond"
   (interpret-markup layout (prepend-alist-chain 'font-shape 'italic props) arg))
 
-(define-builtin-markup-command (typewriter layout props arg) (markup?)
+(define-builtin-markup-command (typewriter layout props arg)
+  (markup?)
+  font
+  ()
   "Use @code{font-family} typewriter for @var{arg}."
   (interpret-markup
    layout (prepend-alist-chain 'font-family 'typewriter props) arg))
 
-(define-builtin-markup-command (upright layout props arg) (markup?)
+(define-builtin-markup-command (upright layout props arg)
+  (markup?)
+  font
+  ()
   "Set font shape to @code{upright}.  This is the opposite of @code{italic}."
   (interpret-markup
    layout (prepend-alist-chain 'font-shape 'upright props) arg))
 
-(define-builtin-markup-command (medium layout props arg) (markup?)
+(define-builtin-markup-command (medium layout props arg)
+  (markup?)
+  font
+  ()
   "Switch to medium font series (in contrast to bold)."
   (interpret-markup layout (prepend-alist-chain 'font-series 'medium props)
                    arg))
 
-(define-builtin-markup-command (normal-text layout props arg) (markup?)
+(define-builtin-markup-command (normal-text layout props arg)
+  (markup?)
+  font
+  ()
   "Set all font related properties (except the size) to get the default
 normal text font, no matter what font was used earlier."
   ;; ugh - latin1
@@ -1037,63 +1471,140 @@ normal text font, no matter what font was used earlier."
 ;; symbols.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define-builtin-markup-command (doublesharp layout props) ()
-  "Draw a double sharp symbol."
+(define-builtin-markup-command (doublesharp layout props)
+  ()
+  music
+  ()
+  "Draw a double sharp symbol.
 
+@lilypond[verbatim,quote]
+\\markup { \\doublesharp }
+@end lilypond"
   (interpret-markup layout props (markup #:musicglyph (assoc-get 1 standard-alteration-glyph-name-alist ""))))
 
-(define-builtin-markup-command (sesquisharp layout props) ()
-  "Draw a 3/2 sharp symbol."
-  (interpret-markup layout props (markup #:musicglyph (assoc-get 3/4 standard-alteration-glyph-name-alist ""))))
-                                        
+(define-builtin-markup-command (sesquisharp layout props)
+  ()
+  music
+  ()
+  "Draw a 3/2 sharp symbol.
+
+@lilypond[verbatim,quote]
+\\markup { \\sesquisharp }
+@end lilypond"
+  (interpret-markup layout props (markup #:musicglyph (assoc-get 3/4 standard-alteration-glyph-name-alist ""))))                                        
 
-(define-builtin-markup-command (sharp layout props) ()
-  "Draw a sharp symbol."
+(define-builtin-markup-command (sharp layout props)
+  ()
+  music
+  ()
+  "Draw a sharp symbol.
+
+@lilypond[verbatim,quote]
+\\markup { \\sharp }
+@end lilypond"
   (interpret-markup layout props (markup #:musicglyph (assoc-get 1/2 standard-alteration-glyph-name-alist ""))))
 
-(define-builtin-markup-command (semisharp layout props) ()
-  "Draw a semi sharp symbol."
+(define-builtin-markup-command (semisharp layout props)
+  ()
+  music
+  ()
+  "Draw a semi sharp symbol.
+
+@lilypond[verbatim,quote]
+\\markup { \\semisharp }
+@end lilypond"
   (interpret-markup layout props (markup #:musicglyph (assoc-get 1/4 standard-alteration-glyph-name-alist ""))))
 
-(define-builtin-markup-command (natural layout props) ()
-  "Draw a natural symbol."
+(define-builtin-markup-command (natural layout props)
+  ()
+  music
+  ()
+  "Draw a natural symbol.
+
+@lilypond[verbatim,quote]
+\\markup { \\natural }
+@end lilypond"
   (interpret-markup layout props (markup #:musicglyph (assoc-get 0 standard-alteration-glyph-name-alist ""))))
 
-(define-builtin-markup-command (semiflat layout props) ()
-  "Draw a semiflat."
+(define-builtin-markup-command (semiflat layout props)
+  ()
+  music
+  ()
+  "Draw a semiflat symbol.
+
+@lilypond[verbatim,quote]
+\\markup { \\semiflat }
+@end lilypond"
   (interpret-markup layout props (markup #:musicglyph (assoc-get -1/4 standard-alteration-glyph-name-alist ""))))
 
-(define-builtin-markup-command (flat layout props) ()
-  "Draw a flat symbol."
+(define-builtin-markup-command (flat layout props)
+  ()
+  music
+  ()
+  "Draw a flat symbol.
+
+@lilypond[verbatim,quote]
+\\markup { \\flat }
+@end lilypond"
   (interpret-markup layout props (markup #:musicglyph (assoc-get -1/2 standard-alteration-glyph-name-alist ""))))
 
-(define-builtin-markup-command (sesquiflat layout props) ()
-  "Draw a 3/2 flat symbol."
+(define-builtin-markup-command (sesquiflat layout props)
+  ()
+  music
+  ()
+  "Draw a 3/2 flat symbol.
+
+@lilypond[verbatim,quote]
+\\markup { \\sesquiflat }
+@end lilypond"
   (interpret-markup layout props (markup #:musicglyph (assoc-get -3/4 standard-alteration-glyph-name-alist ""))))
 
-(define-builtin-markup-command (doubleflat layout props) ()
-  "Draw a double flat symbol."
-  (interpret-markup layout props (markup #:musicglyph (assoc-get -1 standard-alteration-glyph-name-alist ""))))
+(define-builtin-markup-command (doubleflat layout props)
+  ()
+  music
+  ()
+  "Draw a double flat symbol.
 
-(define-builtin-markup-command (with-color layout props color arg) (color? markup?)
-  "Draw @var{arg} in color specified by @var{color}."
+@lilypond[verbatim,quote]
+\\markup { \\doubleflat }
+@end lilypond"
+  (interpret-markup layout props (markup #:musicglyph (assoc-get -1 standard-alteration-glyph-name-alist ""))))
 
-  (let* ((stil (interpret-markup layout props arg)))
+(define-builtin-markup-command (with-color layout props color arg)
+  (color? markup?)
+  other
+  ()
+  "
+@cindex coloring text
 
+Draw @var{arg} in color specified by @var{color}."
+  (let ((stil (interpret-markup layout props arg)))
     (ly:make-stencil (list 'color color (ly:stencil-expr stil))
                     (ly:stencil-extent stil X)
                     (ly:stencil-extent stil Y))))
-
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; glyphs
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-
 (define-builtin-markup-command (arrow-head layout props axis direction filled)
   (integer? ly:dir? boolean?)
+  graphic
+  ()
   "Produce an arrow head in specified direction and axis.
-Use the filled head if @var{filled} is specified."
+Use the filled head if @var{filled} is specified.
+@lilypond[verbatim,quote]
+\\markup {
+  \\fontsize #5
+  \\general-align #Y #DOWN {
+    \\arrow-head #Y #UP ##t
+    \\arrow-head #Y #DOWN ##f
+    \\hspace #2
+    \\arrow-head #X #RIGHT ##f
+    \\arrow-head #X #LEFT ##f
+  }
+}
+@end lilypond"
   (let*
       ((name (format "arrowheads.~a.~a~a"
                     (if filled
@@ -1106,25 +1617,48 @@ Use the filled head if @var{filled} is specified."
                                     props))
      name)))
 
-(define-builtin-markup-command (musicglyph layout props glyph-name) (string?)
-  "@var{glyph0name} is converted to a musical symbol; for example,
+(define-builtin-markup-command (musicglyph layout props glyph-name)
+  (string?)
+  music
+  ()
+  "@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 possible glyphs."
-  (ly:font-get-glyph
-   (ly:paper-get-font layout (cons '((font-encoding . fetaMusic))
-                                  props))
-   glyph-name))
-
-(define-builtin-markup-command (lookup layout props glyph-name) (string?)
+the music font.  See @ruser{The Feta font} for a complete listing of
+the possible glyphs.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\musicglyph #\"f\"
+  \\musicglyph #\"rests.2\"
+  \\musicglyph #\"clefs.G_change\"
+}
+@end lilypond"
+  (let* ((font (ly:paper-get-font layout
+                                 (cons '((font-encoding . fetaMusic)
+                                         (font-name . #f))
+                                       
+                                                props)))
+        (glyph (ly:font-get-glyph font glyph-name)))
+    (if (null? (ly:stencil-expr glyph))
+       (ly:warning (_ "Cannot find glyph ~a") glyph-name))
+
+    glyph))
+
+
+(define-builtin-markup-command (lookup layout props glyph-name)
+  (string?)
+  other
+  ()
   "Lookup a glyph by name."
   (ly:font-get-glyph (ly:paper-get-font layout props)
                     glyph-name))
 
-(define-builtin-markup-command (char layout props num) (integer?)
+(define-builtin-markup-command (char layout props num)
+  (integer?)
+  other
+  ()
   "Produce a single character.  For example, @code{\\char #65} produces the 
 letter @q{A}."
-
   (ly:text-interface::interpret-markup layout props (ly:wide-char->utf-8 num)))
 
 (define number->mark-letter-vector (make-vector 25 #\A))
@@ -1149,84 +1683,110 @@ letter @q{A}."
                       (number->markletter-string vec (remainder n lst)))
        (make-string 1 (vector-ref vec n)))))
 
-(define-builtin-markup-command (markletter layout props num) (integer?)
+(define-builtin-markup-command (markletter layout props num)
+  (integer?)
+  other
+  ()
   "Make a markup letter for @var{num}.  The letters start with A to@tie{}Z
-(skipping letter@tie{}I), and continue with double letters."
+(skipping letter@tie{}I), and continue with double letters.
+
+@lilypond[verbatim,quote]
+\\markup { \\markletter #8 \\hspace #2 \\markletter #26 }
+@end lilypond"
   (ly:text-interface::interpret-markup layout props
     (number->markletter-string number->mark-letter-vector num)))
 
-(define-builtin-markup-command (markalphabet layout props num) (integer?)
+(define-builtin-markup-command (markalphabet layout props num)
+  (integer?)
+  other
+  ()
    "Make a markup letter for @var{num}.  The letters start with A to@tie{}Z
-and continue with double letters."
+and continue with double letters.
+
+@lilypond[verbatim,quote]
+\\markup { \\markalphabet #8 \\hspace #2 \\markalphabet #26 }
+@end lilypond"
    (ly:text-interface::interpret-markup layout props
      (number->markletter-string number->mark-alphabet-vector num)))
 
-
-
-(define-builtin-markup-command (slashed-digit layout props num) (integer?)
-  "A feta number, with slash.  This is for use in the context of
-figured bass notation."
-  (let*
-      ((mag (magstep (chain-assoc-get 'font-size props 0)))
-       (thickness
-       (* mag
-          (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)
-                                        (number->string num)))
-       (num-x (interval-widen (ly:stencil-extent number-stencil X)
-                             (* mag 0.2)))
-       (num-y (ly:stencil-extent number-stencil Y))
-       (is-sane (and (interval-sane? num-x) (interval-sane? num-y)))
-       
-       (slash-stencil
-       (if is-sane
-           (ly:make-stencil
-            `(draw-line
-              ,thickness
-              ,(car num-x) ,(- (interval-center num-y) dy)
-              ,(cdr num-x) ,(+ (interval-center num-y) dy))
-            num-x num-y)
-           #f)))
-
+(define-builtin-markup-command (slashed-digit layout props num)
+  (integer?)
+  other
+  ((font-size 0)
+   (thickness 1.6))
+  "
+@cindex slashed digits
+
+A feta number, with slash.  This is for use in the context of
+figured bass notation.
+@lilypond[verbatim,quote]
+\\markup {
+  \\slashed-digit #5
+  \\hspace #2
+  \\override #'(thickness . 3)
+  \\slashed-digit #7
+}
+@end lilypond"
+  (let* ((mag (magstep font-size))
+         (thickness (* mag
+                       (ly:output-def-lookup layout 'line-thickness)
+                       thickness))
+         (dy (* mag 0.15))
+         (number-stencil (interpret-markup layout
+                                           (prepend-alist-chain 'font-encoding 'fetaNumber props)
+                                           (number->string num)))
+         (num-x (interval-widen (ly:stencil-extent number-stencil X)
+                                (* mag 0.2)))
+         (num-y (ly:stencil-extent number-stencil Y))
+         (is-sane (and (interval-sane? num-x) (interval-sane? num-y)))
+         (slash-stencil (if is-sane
+                            (ly:make-stencil
+                             `(draw-line ,thickness
+                                         ,(car num-x) ,(- (interval-center num-y) dy)
+                                         ,(cdr num-x) ,(+ (interval-center num-y) dy))
+                             num-x num-y)
+                            #f)))
     (set! slash-stencil
-         (cond
-          ((not (ly:stencil? slash-stencil)) #f)
-          ((= num 5) (ly:stencil-translate slash-stencil
-                                           ;;(cons (* mag -0.05) (* mag 0.42))
-                                           (cons (* mag -0.00) (* mag -0.07))
-
-                                           ))
-          ((= num 7) (ly:stencil-translate slash-stencil
-                                           ;;(cons (* mag -0.05) (* mag 0.42))
-                                           (cons (* mag -0.00) (* mag -0.15))
-
-                                           ))
-          
-          (else slash-stencil)))
-
+          (cond ((not (ly:stencil? slash-stencil)) #f)
+                ((= num 5)
+                 (ly:stencil-translate slash-stencil
+                                       ;;(cons (* mag -0.05) (* mag 0.42))
+                                       (cons (* mag -0.00) (* mag -0.07))))
+                ((= num 7)
+                 (ly:stencil-translate slash-stencil
+                                       ;;(cons (* mag -0.05) (* mag 0.42))
+                                       (cons (* mag -0.00) (* mag -0.15))))
+                (else slash-stencil)))
     (if slash-stencil
-       (set! number-stencil
-             (ly:stencil-add number-stencil slash-stencil))
-       
-       (ly:warning "invalid number for slashed digit ~a" num))
-
-
+        (set! number-stencil
+              (ly:stencil-add number-stencil slash-stencil))
+        (ly:warning "invalid number for slashed digit ~a" num))
     number-stencil))
-\f
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; the note command.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-
 ;; TODO: better syntax.
 
-(define-builtin-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."
+(define-builtin-markup-command (note-by-number layout props log dot-count dir)
+  (number? number? number?)
+  music
+  ((font-size 0)
+   (style '()))
+  "
+@cindex notes within text by log and dot-count
+
+Construct a note symbol, with stem.  By using fractional values for
+@var{dir}, you can obtain longer or shorter stems.
 
+@lilypond[verbatim,quote]
+\\markup {
+  \\note-by-number #3 #0 #DOWN
+  \\hspace #1
+  \\note-by-number #1 #2 #0.8
+}
+@end lilypond"
   (define (get-glyph-name-candidates dir log style)
     (map (lambda (dir-name)
      (format "noteheads.~a~a~a" dir-name (min log 2)
@@ -1245,8 +1805,7 @@ figured bass notation."
         (car cands))))
     
   (let* ((font (ly:paper-get-font layout (cons '((font-encoding . fetaMusic)) props)))
-        (size-factor (magstep (chain-assoc-get 'font-size props 0)))
-        (style (chain-assoc-get 'style props '()))
+        (size-factor (magstep font-size))
          (stem-length (*  size-factor (max 3 (- log 1))))
          (head-glyph-name (get-glyph-name font (get-glyph-name-candidates (sign dir) log style)))
          (head-glyph (ly:font-get-glyph font head-glyph-name))
@@ -1282,10 +1841,12 @@ figured bass notation."
                                          (string-append "flags."
                                                         (if (> dir 0) "u" "d")
                                                         (number->string log)))
-                       (cons (+ (car attach-off) (/ stem-thickness 2)) stemy)))))
+                       (cons (+ (car attach-off) (if (< dir 0) stem-thickness 0)) stemy)))))
 
-    (if (and dots flaggl (> dir 0))
-       (set! dots (ly:stencil-translate-axis dots 0.35 X)))
+    ; If there is a flag on an upstem and the stem is short, move the dots to avoid the flag.
+    ; 16th notes get a special case because their flags hang lower than any other flags.
+    (if (and dots (> dir 0) (> log 2) (or (< dir 1.15) (and (= log 4) (< dir 1.3))))
+       (set! dots (ly:stencil-translate-axis dots 0.5 X)))
     (if flaggl
         (set! stem-glyph (ly:stencil-add flaggl stem-glyph)))
     (if (ly:stencil? stem-glyph)
@@ -1318,44 +1879,71 @@ figured bass notation."
                 (if dots (string-length dots) 0)))
         (ly:error (_ "not a valid duration string: ~a") duration-string))))
 
-(define-builtin-markup-command (note layout props duration dir) (string? number?)
-  "This produces a note with a stem pointing in @var{dir} direction, with
+(define-builtin-markup-command (note layout props duration dir)
+  (string? number?)
+  music
+  (note-by-number-markup)
+  "
+@cindex notes within text by string
+
+This produces a note with a stem pointing in @var{dir} direction, with
 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."
+a shortened down stem.
+
+@lilypond[verbatim,quote]
+\\markup {
+  \\override #'(style . cross)
+  \\note #\"4..\" #UP
+  \\hspace #1
+  \\note #\"breve\" #0
+}
+@end lilypond"
   (let ((parsed (parse-simple-duration duration)))
     (note-by-number-markup layout props (car parsed) (cadr parsed) dir)))
-
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; translating.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define-builtin-markup-command (lower layout props amount arg) (number? markup?)
-  "Lower @var{arg} by the distance @var{amount}.
+(define-builtin-markup-command (lower layout props amount arg)
+  (number? markup?)
+  align
+  ()
+  "
+@cindex lowering text
+
+Lower @var{arg} by the distance @var{amount}.
 A negative @var{amount} indicates raising; see also @code{\\raise}."
   (ly:stencil-translate-axis (interpret-markup layout props arg)
                             (- amount) Y))
 
+(define-builtin-markup-command (translate-scaled layout props offset arg)
+  (number-pair? markup?)
+  other
+  ((font-size 0))
+  "
+@cindex translating text
+@cindex scaling text
 
-(define-builtin-markup-command (translate-scaled layout props offset arg) (number-pair? markup?)
-  "Translate @var{arg} by @var{offset}, scaling the offset by the
+Translate @var{arg} by @var{offset}, scaling the offset by the
 @code{font-size}."
-  (let*
-      ((factor (magstep (chain-assoc-get 'font-size props 0)))
-       (scaled (cons (* factor (car offset))
-                    (* factor (cdr offset)))))
-    
-  (ly:stencil-translate (interpret-markup layout props arg)
-                       scaled)))
+  (let* ((factor (magstep font-size))
+         (scaled (cons (* factor (car offset))
+                       (* factor (cdr offset)))))
+    (ly:stencil-translate (interpret-markup layout props arg)
+                          scaled)))
 
-(define-builtin-markup-command (raise layout props amount arg) (number? markup?)
-  "Raise @var{arg} by the distance @var{amount}.
+(define-builtin-markup-command (raise layout props amount arg)
+  (number? markup?)
+  align
+  ()
+  "
+@cindex raising text
+  
+Raise @var{arg} by the distance @var{amount}.
 A negative @var{amount} indicates lowering, see also @code{\\lower}.
-@c
-@lilypond[verbatim,fragment,relative=1]
-c1^\\markup { C \\small \\raise #1.0 \\bold { \"9/7+\" } }
-@end lilypond
+
 The argument to @code{\\raise} is the vertical displacement amount,
 measured in (global) staff spaces.  @code{\\raise} and @code{\\super}
 raise objects in relation to their surrounding markups.
@@ -1364,14 +1952,27 @@ If the text object itself is positioned above or below the staff, then
 @code{\\raise} cannot be used to move it, since the mechanism that
 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."
+and/or @code{extra-offset} properties.
+
+@lilypond[verbatim,quote]
+\\markup { C \\small \\raise #1.0 \\bold 9/7+ }
+@end lilypond"
   (ly:stencil-translate-axis (interpret-markup layout props arg) amount Y))
 
-(define-builtin-markup-command (fraction layout props arg1 arg2) (markup? markup?)
-  "Make a fraction of two markups."
+(define-builtin-markup-command (fraction layout props arg1 arg2)
+  (markup? markup?)
+  other
+  ((font-size 0))
+  "
+@cindex creating text fractions
+
+Make a fraction of two markups.
+@lilypond[verbatim,quote]
+\\markup { π ≈ \\fraction 355 113 }
+@end lilypond"
   (let* ((m1 (interpret-markup layout props arg1))
          (m2 (interpret-markup layout props arg2))
-         (factor (magstep (chain-assoc-get 'font-size props 0)))
+         (factor (magstep font-size))
          (boxdimen (cons (* factor -0.05) (* factor 0.05)))
          (padding (* factor 0.2))
          (baseline (* factor 0.6))
@@ -1391,37 +1992,48 @@ and/or @code{extra-offset} properties."
       ;; empirical anyway
       (ly:stencil-translate-axis stack offset Y))))
 
-(define-builtin-markup-command (normal-size-super layout props arg) (markup?)
-  "Set @var{arg} in superscript with a normal font size."
+(define-builtin-markup-command (normal-size-super layout props arg)
+  (markup?)
+  font
+  ((baseline-skip))
+  "
+@cindex setting superscript in standard font size
+
+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))
+   (* 0.5 baseline-skip) Y))
 
-(define-builtin-markup-command (super layout props arg) (markup?)
-  "
-@cindex raising text
-@cindex lowering text
-@cindex moving text
-@cindex translating text
-
-@cindex @code{\\super}
+(define-builtin-markup-command (super layout props arg)
+  (markup?)
+  font
+  ((font-size 0)
+   (baseline-skip))
+  "  
+@cindex superscript text
 
 Raising and lowering texts can be done with @code{\\super} and
 @code{\\sub}:
-@c
-@lilypond[verbatim,fragment,relative=1]
-c1^\\markup { E \"=\" \\concat { \"mc\" \\super \"2\" } }
+
+@lilypond[verbatim,quote]
+\\markup { E = \\concat { mc \\super 2 } }
 @end lilypond"
   (ly:stencil-translate-axis
    (interpret-markup
     layout
-    (cons `((font-size . ,(- (chain-assoc-get 'font-size props 0) 3))) props)
+    (cons `((font-size . ,(- font-size 3))) props)
     arg)
-   (* 0.5 (chain-assoc-get 'baseline-skip props))
+   (* 0.5 baseline-skip)
    Y))
 
-(define-builtin-markup-command (translate layout props offset arg) (number-pair? markup?)
-  "This translates an object.  Its first argument is a cons of numbers.
+(define-builtin-markup-command (translate layout props offset arg)
+  (number-pair? markup?)
+  align
+  ()
+  "
+@cindex translating text
+  
+This translates an object.  Its first argument is a cons of numbers.
 
 @example
 A \\translate #(cons 2 -3) @{ B C @} D
@@ -1434,35 +2046,64 @@ that."
   (ly:stencil-translate (interpret-markup  layout props arg)
                        offset))
 
-(define-builtin-markup-command (sub layout props arg) (markup?)
-  "Set @var{arg} in subscript."
+(define-builtin-markup-command (sub layout props arg)
+  (markup?)
+  font
+  ((font-size 0)
+   (baseline-skip))
+  "
+@cindex subscript text
+
+Set @var{arg} in subscript."
   (ly:stencil-translate-axis
    (interpret-markup
     layout
-    (cons `((font-size . ,(- (chain-assoc-get 'font-size props 0) 3))) props)
+    (cons `((font-size . ,(- font-size 3))) props)
     arg)
-   (* -0.5 (chain-assoc-get 'baseline-skip props))
+   (* -0.5 baseline-skip)
    Y))
 
-(define-builtin-markup-command (normal-size-sub layout props arg) (markup?)
-  "Set @var{arg} in subscript, in a normal font size."
+(define-builtin-markup-command (normal-size-sub layout props arg)
+  (markup?)
+  font
+  ((baseline-skip))
+  "
+@cindex setting subscript in standard font size
+
+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))
+   (* -0.5 baseline-skip)
    Y))
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; brackets.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(define-builtin-markup-command (hbracket layout props arg) (markup?)
-  "Draw horizontal brackets around @var{arg}."  
+(define-builtin-markup-command (hbracket layout props arg)
+  (markup?)
+  graphic
+  ()
+  "
+@cindex placing horizontal brackets around text
+  
+Draw horizontal brackets around @var{arg}."
   (let ((th 0.1) ;; todo: take from GROB.
         (m (interpret-markup layout props arg)))
     (bracketify-stencil m X th (* 2.5 th) th)))
 
-(define-builtin-markup-command (bracket layout props arg) (markup?)
-  "Draw vertical brackets around @var{arg}."  
+(define-builtin-markup-command (bracket layout props arg)
+  (markup?)
+  graphic
+  ()
+  "
+@cindex placing vertical brackets around text
+  
+Draw vertical brackets around @var{arg}.
+
+@lilypond[verbatim,quote]
+\\markup \\bracket \\note #\"2.\" #UP
+@end lilypond"
   (let ((th 0.1) ;; todo: take from GROB.
         (m (interpret-markup layout props arg)))
     (bracketify-stencil m Y th (* 2.5 th) th)))
@@ -1473,7 +2114,12 @@ that."
 
 (define-builtin-markup-command (page-ref layout props label gauge default)
   (symbol? markup? markup?)
-  "Reference to a page number. @var{label} is the label set on the referenced
+  other
+  ()
+  "
+@cindex referencing page numbers in text
+
+Reference to a page number. @var{label} is the label set on the referenced
 page (using the @code{\\label} command), @var{gauge} a markup used to estimate
 the maximum width of the page number, and @var{default} the value to display
 when @var{label} is not found."
@@ -1494,7 +2140,6 @@ when @var{label} is not found."
                                    (markup #:concat (#:hspace gap page-markup)))))))
      x-ext
      y-ext)))
-
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Markup list commands
@@ -1503,26 +2148,39 @@ when @var{label} is not found."
 (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))
+                     (list point-stencil
                            line
-                           (ly:make-stencil "" (cons 0 0) (cons 0 0)))))
+                           point-stencil)))
        lines))
 
-(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;
+(define-builtin-markup-list-command (justified-lines layout props args)
+  (markup-list?)
+  ((baseline-skip)
+   wordwrap-internal-markup-list)
+  "
+@cindex justifying lines of text
+
+Like @code{\\justify}, but return a list of lines instead of a single markup.
+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)))
+  (space-lines baseline-skip
+               (interpret-markup-list layout props
+                                      (make-wordwrap-internal-markup-list #t args))))
 
-(define-builtin-markup-list-command (wordwrap-lines layout props args) (markup-list?)
+(define-builtin-markup-list-command (wordwrap-lines layout props args)
+  (markup-list?)
+  ((baseline-skip)
+   wordwrap-internal-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)))
+  (space-lines baseline-skip
+               (interpret-markup-list layout props
+                                      (make-wordwrap-internal-markup-list #f args))))
 
-(define-builtin-markup-list-command (column-lines layout props args) (markup-list?)
+(define-builtin-markup-list-command (column-lines layout props args)
+  (markup-list?)
+  ((baseline-skip))
   "Like @code{\\column}, but return a list of lines instead of a single markup.
 @code{baseline-skip} determines the space between each markup in @var{args}."
   (space-lines (chain-assoc-get 'baseline-skip props)
@@ -1530,5 +2188,6 @@ where @var{X} is the number of staff spaces."
 
 (define-builtin-markup-list-command (override-lines layout props new-prop args)
   (pair? markup-list?)
+  ()
   "Like @code{\\override}, for markup lists."
   (interpret-markup-list layout (cons (list new-prop) props) args))