]> git.donarmstrong.com Git - lilypond.git/commitdiff
* scm/define-grobs.scm (all-grob-descriptions): remove
authorhanwen <hanwen>
Sun, 25 Jan 2004 14:34:36 +0000 (14:34 +0000)
committerhanwen <hanwen>
Sun, 25 Jan 2004 14:34:36 +0000 (14:34 +0000)
enclose-bounds in OttavaBracket and PianoPedalBracket

* scm/new-markup.scm (def-markup-command) new macro, which takes
care of defining the COMMAND-markup and make-COMMAND-markup
procedures, setting markup-signature and keyword-signature object
properties, and pushing the markup command in
markup-function-list.

* scm/new-markup.scm:Little scheme style clean-up: there should be
no parenthese alone on a line; LET* should not be used where LET
is enough. (Nicolas Sceaux)

ChangeLog
Documentation/user/refman.itely
input/mutopia/F.Schubert/morgenlied.ly
input/regression/markup-user.ly [new file with mode: 0644]
scm/define-grobs.scm
scm/music-functions.scm
scm/new-markup.scm

index ba397ec07a1908b69327a7213c9ce4027c6692d6..78647286fdfe5eae7468746be815fd6bea8dd7a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2004-01-25  Han-Wen Nienhuys   <hanwen@xs4all.nl>
+
+       * scm/define-grobs.scm (all-grob-descriptions): remove
+       enclose-bounds in OttavaBracket and PianoPedalBracket
+
+       * scm/new-markup.scm (def-markup-command) new macro, which takes
+       care of defining the COMMAND-markup and make-COMMAND-markup
+       procedures, setting markup-signature and keyword-signature object
+       properties, and pushing the markup command in
+       markup-function-list.
+
+       All markup commands are defined thanks to it.  Users may also use
+       it to define their own markup commands. (Nicolas Sceaux)
+
+       * scm/new-markup.scm:Little scheme style clean-up: there should be
+       no parenthese alone on a line; LET* should not be used where LET
+       is enough. (Nicolas Sceaux)
+
 2004-01-25  Jan Nieuwenhuizen  <janneke@gnu.org>
 
        * scripts/filter-lilypond-book.py: Add script.
@@ -8,6 +26,9 @@
 
 2004-01-24  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
+       * Documentation/user/refman.itely (Fingering instructions): add
+       single note chords. 
+
        * lily/multi-measure-rest-engraver.cc: use a single
        MultiMeasureEvent for mm rests. This prevents problems with the
        new part combiner.
index 88eeef73cf003baa057a301072b76c95c271b377..66eef429e60c3d2313e79a61c2f604eaa3df8308 100644 (file)
@@ -2153,6 +2153,9 @@ to note heads:
        \property Voice.fingeringOrientations = #'(up right down)
        <c-1 es-2 g-4 bes-5 > 4
 @end lilypond
+
+By using single note chords,  fingering instructions can be put close
+to note heads in monophonic music.
         
 @seealso
 
index 450b515b091bf9dd9b782322cbbf4dd0da7bfde1..0a246875e6b7f8031202047a518d00f34b83581f 100644 (file)
@@ -32,7 +32,7 @@ manuscriptBreak = { \break }
 
 
 \paper  {
-    #(set-global-staff-size(* 6.0 1 ))
+    #(paper-set-staff-size (* 5.8 mm))
     linewidth = #(* mm 160)
     indent = 8\mm
     interscoreline = 2.\mm
diff --git a/input/regression/markup-user.ly b/input/regression/markup-user.ly
new file mode 100644 (file)
index 0000000..d1563e6
--- /dev/null
@@ -0,0 +1,22 @@
+
+\header {
+
+    texidoc = "Users may define their own markup commands using the
+    @code{def-markup-command} scheme macro."
+
+
+      }
+
+\version "2.1.14" % to be updated
+
+#(def-markup-command (upcase paper props str) (string?)
+  "Upcase the string characters. Syntax: \\upcase #\"string\""
+   (interpret-markup paper props (make-simple-markup (string-upcase str))))
+
+\score { 
+    \notes { 
+        c''-\markup \upcase #"hello world"
+        % produces a "HELLO WORLD" markup
+    }
+    \paper { raggedright = ##t }
+}
index 8e04506c20f4453b7c26a94401fb907d71d22a0f..f2f3487513149642ffbfcc9119a891266159027f 100644 (file)
        (font-family . roman)
        (style . line)
        (if-text-padding . 1.0)
-       (enclose-bounds . -1.0)
        (direction . -1)
        (bracket-flare . (0.5 . 0.5))
        (edge-height . (1.0 . 1.0))
        (shorten-pair . (0.0 . -0.6))
        (staff-padding . 1.0)
        (padding  . 0.5)
-       (enclose-bounds . 1)
        (minimum-length . 1.0)
        (dash-fraction . 0.3)
        (edge-height . (0 . 1.2))
index ce99ba7585434b597fd594a61bf9b1e181f762c3..d0ca581467e308a4a6d7fdf79e5b2e34a23ff2bf 100644 (file)
@@ -975,7 +975,7 @@ Rest can contain a list of beat groupings
                 ((> (length notes2) 1) (put 'apart))
                 (else
                  (if
-                  (and (= (length pitches1) (length pitches2))
+                  (and (= (length pitches1) 1) (= (length pitches2) 1) 
                    (< chord-threshold (ly:pitch-steps
                                        (ly:pitch-diff (car pitches1) (car pitches2)))))
                        (put 'apart)
@@ -1000,6 +1000,9 @@ Rest can contain a list of beat groupings
          (analyse-time-step (1+ i1) (1+ i2) (1+ ri) new-active1 new-active2))
         )))))
 
+;; 
+  
+  
 
    (analyse-time-step 0 0  0 '() '())
 ;   (display result)
index 87432cf35466878f1af0d74f7c9e3590f7d1f661..06356aa9854cc4c0999fc9d87926b68ff44f63b7 100644 (file)
@@ -14,251 +14,471 @@ The function should return a molecule (i.e. a formatted, ready to
 print object).
 
 
+To add a function, use the def-markup-command utility.
 
-To add a function,
+  (def-markup-command (mycommand paper prop arg1 ...) (arg1-type? ...)
+    \"my command usage and description\"
+    ...function body...)
 
-1. It should be named  COMMAND-markup
+The command is now available in markup mode, e.g.
 
-2. It should have an object property set that describes it's
-signature. This is to allow the parser to figure out how many
-arguments to expect:
 
-  (set-object-property! COMMAND-markup  scm0-markup1)
+  \\markup { .... \\MYCOMMAND #1 argument ... }
 
-(insert in the list below).
+" ; "
 
-3. The command is now available in markup mode, e.g.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; markup definer utilities
+;;; `def-markup-command' can be used both for built-in markup
+;;; definitions and user defined markups.
 
+(defmacro-public def-markup-command (command-and-args signature . body)
+  "Define a COMMAND-markup function after command-and-args and body,
+register COMMAND-markup and its signature,
+add COMMAND-markup to markup-function-list,
+sets COMMAND-markup markup-signature and markup-keyword object properties,
+define a make-COMMAND-markup function.
+Syntax:
+  (def-markup-command (COMMAND paper props arg1 arg2 ...) (arg1-type? arg2-type? ...)
+    \"documentation string\"
+    ...command body...)
+ or:
+  (def-markup-command COMMAND (arg1-type? arg2-type? ...)
+    function)
+"
+  (let* ((command (if (pair? command-and-args) (car command-and-args) command-and-args))
+         (args (if (pair? command-and-args) (cdr command-and-args) '()))
+         (command-name (string->symbol (string-append (symbol->string command) "-markup")))
+         (make-markup-name (string->symbol (string-append "make-" (symbol->string command-name)))))
+    `(begin
+       (define-public ,(if (pair? args)
+                           (cons command-name args)
+                           command-name)
+         ,@body)
+       (set! (markup-command-signature ,command-name) (list ,@signature))
+       (if (not (member ,command-name markup-function-list))
+           (set! markup-function-list (cons ,command-name markup-function-list)))
+       (define-public (,make-markup-name . args)
+         (let ((sig (list ,@signature)))
+           (make-markup ,command-name ,(symbol->string make-markup-name) sig args))))))
+
+(define-public (make-markup markup-function make-name signature args)
+  " Construct a markup object from MARKUP-FUNCTION and ARGS. Typecheck
+against SIGNATURE, reporting MAKE-NAME as the user-invoked function.
+"
+  (let* ((arglen (length args))
+         (siglen (length signature))
+         (error-msg (if (and (> siglen 0) (> arglen 0))
+                        (markup-argument-list-error signature args 1)
+                        #f)))
+    (if (or (not (= arglen siglen)) (< siglen 0) (< arglen 0))
+        (scm-error 'markup-format make-name
+                   "Expect ~A arguments for ~A. Found ~A: ~S"
+                   (list siglen make-name arglen args)
+                   #f))
+    (if error-msg
+        (scm-error 'markup-format make-name
+                   "Invalid argument in position ~A\nExpect: ~A\nFound: ~S."
+                   error-msg #f)
+        (cons markup-function args))))
+
+;;;;;;;;;;;;;;;
+;;; Utilities for storing and accessing markup commands signature
+;;; and keyword.
+;;; Examples:
+;;;
+;;; (set! (markup-command-signature raise-markup) (list number? markup?))
+;;; ==> ((#<primitive-procedure number?> #<procedure markup? (obj)>) . scheme0-markup1)
+;;;
+;;; (markup-command-signature raise-markup)
+;;; ==> (#<primitive-procedure number?> #<procedure markup? (obj)>)
+;;;
+;;; (markup-command-keyword raise-markup) ==> "scheme0-markup1"
+;;; 
+
+(define markup-command-signatures (make-hash-table 50))
+
+(define (markup-command-signature-ref markup-command)
+  "Return markup-command's signature, e.g. (number? markup?).
+markup-command may be a procedure."
+  (let ((sig-key (hashq-ref markup-command-signatures
+                            markup-command)))
+    (if sig-key (car sig-key) #f)))
+
+(define-public (markup-command-keyword markup-command)
+  "Return markup-command's keyword, e.g. \"scheme0markup1\".
+markup-command may be a procedure."
+  (let ((sig-key (hashq-ref markup-command-signatures
+                            markup-command)))
+    (if sig-key (cdr sig-key) #f)))
+
+(define (markup-command-signatureset! markup-command signature)
+  "Set markup-command's signature. markup-command must be a named procedure.
+Also set markup-signature and markup-keyword object properties."
+  (hashq-set! markup-command-signatures
+              markup-command
+              (cons signature (markup-signature-to-keyword signature)))
+  ;; these object properties are still in use somewhere
+  (set-object-property! markup-command 'markup-signature signature)
+  (set-object-property! markup-command 'markup-keyword (markup-signature-to-keyword signature)))
+  
+(define-public markup-command-signature
+  (make-procedure-with-setter markup-command-signature-ref markup-command-signatureset!))
 
-  \\markup { .... \\COMMAND #1 argument ... }
+(define (markup-symbol-to-proc markup-sym)
+  "Return the markup command procedure which name is `markup-sym', if any."
+  (hash-fold (lambda (key val prev)
+                            (or prev
+                                (if (eqv? (procedure-name key) markup-sym) key #f)))
+             #f
+             markup-command-signatures))
 
+(define-public markup-function-list '())
 
-BUGS:
+(define-public (markup-signature-to-keyword sig)
+  " (A B C) -> a0-b1-c2 "
+  (if (null? sig)
+      'empty
+      (string->symbol (string-join (map
+                                    (let* ((count 0))
+                                      (lambda (func)
+                                        (set! count (+ count 1))
+                                        (string-append
+                                         ;; for reasons I don't get,
+                                         ;; (case func ((markup?) .. )
+                                         ;; doesn't work.
+                                         (cond 
+                                          ((eq? func markup?) "markup")
+                                          ((eq? func markup-list?) "markup-list")
+                                          (else "scheme"))
+                                         (number->string (- count 1)))))
+                                    sig)
+                         "-"))))
 
-At present, markup functions must be defined in this
-file. Implementing user-access for markup functions is an excercise
-for the reader.
+(define-public (lookup-markup-command code)
+  (let ((proc (markup-symbol-to-proc (string->symbol (string-append code "-markup")))))
+    (and proc (cons proc (markup-command-keyword proc)))))
 
+;;;;;;;;;;;;;;;;;;;;;;
+;;; markup type predicates
 
+(define (markup-function? x)
+  (not (not (markup-command-signature x))))
 
-" ; " 
+(define (markup-list? arg)
+  (define (markup-list-inner? l)
+    (or (null? l)
+        (and (markup? (car l)) (markup-list-inner? (cdr l)))))
+  (and (list? arg) (markup-list-inner? arg)))
 
+(define (markup-argument-list? signature arguments)
+  "Typecheck argument list."
+  (if (and (pair? signature) (pair? arguments))
+      (and ((car signature) (car arguments))
+           (markup-argument-list? (cdr signature) (cdr arguments)))
+      (and (null? signature) (null? arguments))))
 
-;;;;;;;;;;;;;;;;;
+
+(define (markup-argument-list-error signature arguments number)
+  "return (ARG-NR TYPE-EXPECTED ARG-FOUND) if an error is detected, or
+#f is no error found.
+"
+  (if (and (pair? signature) (pair? arguments))
+      (if (not ((car signature) (car arguments)))
+          (list number (type-name (car signature)) (car arguments))
+          (markup-argument-list-error (cdr signature) (cdr arguments) (+ 1 number)))
+      #f))
+
+;;
+;; full recursive typecheck.
+;;
+(define (markup-typecheck? arg)
+  (or (string? arg)
+      (and (pair? arg)
+           (markup-function? (car arg))
+           (markup-argument-list? (markup-command-signature (car arg))
+                                  (cdr arg)))))
+
+;; 
+;; typecheck, and throw an error when something amiss.
+;; 
+(define (markup-thrower-typecheck arg)
+  (cond ((string? arg) #t)
+        ((not (pair? arg))
+         (throw 'markup-format "Not a pair" arg))
+        ((not (markup-function? (car arg)))
+         (throw 'markup-format "Not a markup function " (car arg)))
+        ((not (markup-argument-list? (markup-command-signature (car arg))
+                                     (cdr arg)))
+         (throw 'markup-format "Arguments failed  typecheck for " arg)))
+  #t)
+
+;;
+;; good enough if you only  use make-XXX-markup functions.
+;; 
+(define (cheap-markup? x)
+  (or (string? x)
+      (and (pair? x)
+           (markup-function? (car x)))))
+
+;;
+;; replace by markup-thrower-typecheck for more detailed diagnostics.
+;; 
+(define-public markup? cheap-markup?)
+
+;; utility
+
+(define (markup-join markups sep)
+  "Return line-markup of MARKUPS, joining them with markup SEP"
+  (if (pair? markups)
+      (make-line-markup (list-insert-separator markups sep))
+      empty-markup))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; markup commands
 ;; TODO:
 ;; each markup function should have a doc string with
 ;; syntax, description and example. 
 ;;
 
-(define-public (simple-markup paper props . rest)
+(define-public brew-new-markup-molecule Text_item::brew_molecule)
+
+(define-public interpret-markup Text_item::interpret_markup)
+
+(def-markup-command (simple paper props str) (string?)
   "A simple text-string; @code{\\markup @{ foo @}} is equivalent with
 @code{\\markup @{ \\simple #\"foo\" @}}.
 "
-  
-  (Text_item::interpret_markup paper props (car rest)))
+  (interpret-markup paper props str))
+
+(define-public empty-markup (make-simple-markup ""))
 
 (define-public (stack-molecule-line space molecules)
   (if (pair? molecules)
       (if (pair? (cdr molecules))
-         (let* (
-                (tail (stack-molecule-line  space (cdr molecules)))
-                (head (car molecules))
-                (xoff (+ space (cdr (ly:molecule-get-extent head X))))
-                )
-           
-           (ly:molecule-add
-            head
-            (ly:molecule-translate-axis tail xoff X))
-         )
-         (car molecules))
-      '())
-  )
-
-(define-public (line-markup paper props . rest)
+          (let* ((tail (stack-molecule-line  space (cdr molecules)))
+                 (head (car molecules))
+                 (xoff (+ space (cdr (ly:molecule-get-extent head X)))))
+            (ly:molecule-add head
+                             (ly:molecule-translate-axis tail xoff X)))
+          (car molecules))
+      '()))
+
+(def-markup-command (line paper props markps) (markup-list?)
   "A horizontal line of markups. Syntax:
 \\line << MARKUPS >>
 "
-  
   (stack-molecule-line
    (cdr (chain-assoc 'word-space props))
-   (map (lambda (x) (interpret-markup paper props x)) (car rest)))
-  )
-
+   (map (lambda (m) (interpret-markup paper props m)) markps)))
 
-(define-public (combine-markup paper props . rest)
+(def-markup-command (combine paper props m1 m2) (markup? markup?)
   "Overstrike two markups."
   (ly:molecule-add
-   (interpret-markup paper props (car rest))
-   (interpret-markup paper props (cadr rest))))
-  
-(define (font-markup qualifier value)
-  (lambda (paper props . rest)
-    (interpret-markup paper (cons (cons `(,qualifier . ,value) (car props)) (cdr props)) (car rest))
-  
-  ))
+   (interpret-markup paper props m1)
+   (interpret-markup paper props m2)))
 
+(def-markup-command (finger paper props arg) (markup?)
+  (interpret-markup paper
+                    (cons '((font-size . -4) (font-family . number)) props)
+                    arg))
 
 (define-public (set-property-markup qualifier)
-  (lambda (paper props . rest  )
+  (lambda (paper props qualifier-val markp)
     (interpret-markup paper
-                     (cons (cons `(,qualifier . ,(car rest))
-                                 (car props)) (cdr props))
-                     (cadr rest))
-    ))
+                      (cons (cons `(,qualifier . ,qualifier-val) (car props)) (cdr props))
+                      markp)))
 
-(define-public (finger-markup paper props . rest)
-  (interpret-markup paper
-                   (cons (list '(font-size . -4)
-                               '(font-family . number))
-                               props)
-                   (car rest)))
+(def-markup-command fontsize (number? markup?)
+  (set-property-markup 'font-size))
 
-(define-public fontsize-markup (set-property-markup 'font-size))
-(define-public magnify-markup (set-property-markup 'font-magnification))
+(def-markup-command magnify (number? markup?)
+  (set-property-markup 'font-magnification))
 
-(define-public bold-markup
+(define (font-markup qualifier value)
+  (lambda (paper props markp)
+    (interpret-markup paper
+                      (cons (cons `(,qualifier . ,value) (car props)) (cdr props))
+                      markp)))
+
+(def-markup-command bold (markup?)
   (font-markup 'font-series 'bold))
-(define-public sans-markup
+
+(def-markup-command sans (markup?)
   (font-markup 'font-family 'sans))
-(define-public number-markup
+
+(def-markup-command number (markup?)
   (font-markup 'font-family 'number))
-(define-public roman-markup
-  (font-markup 'font-family 'roman))
 
+(def-markup-command roman (markup?)
+  (font-markup 'font-family 'roman))
 
-(define-public huge-markup
+(def-markup-command huge (markup?)
   (font-markup 'font-size 2))
-(define-public large-markup
+
+(def-markup-command large (markup?)
   (font-markup 'font-size 1))
-(define-public normalsize-markup
+
+(def-markup-command normalsize (markup?)
   (font-markup 'font-size 0))
-(define-public small-markup
+
+(def-markup-command small (markup?)
   (font-markup 'font-size -1))
-(define-public tiny-markup
+
+(def-markup-command tiny (markup?)
   (font-markup 'font-size -2))
-(define-public teeny-markup
+
+(def-markup-command teeny (markup?)
   (font-markup 'font-size -3))
-(define-public dynamic-markup
+
+(def-markup-command dynamic (markup?)
   (font-markup 'font-family 'dynamic))
-(define-public italic-markup
+
+(def-markup-command italic (markup?)
   (font-markup 'font-shape 'italic))
-(define-public typewriter-markup
-  (font-markup 'font-family 'typewriter))
 
+(def-markup-command typewriter (markup?)
+  (font-markup 'font-family 'typewriter))
 
-;; TODO: baseline-skip should come from the font.
-(define-public (column-markup paper props . rest)
+(def-markup-command (column paper props mrkups) (markup-list?)
   (stack-lines
    -1 0.0 (cdr (chain-assoc 'baseline-skip props))
-   (map (lambda (x) (interpret-markup paper props x)) (car rest)))
-  )
+   (map (lambda (m) (interpret-markup paper props m)) mrkups)))
 
-(define-public (dir-column-markup paper props . rest)
+(def-markup-command (dir-column paper props mrkups) (markup-list?)
   "Make a column of args, going up or down, depending on the setting
 of the #'direction layout property."
-  
-  (let*
-      (
-       (dir (cdr (chain-assoc 'direction props)))
-       )
+  (let* ((dir (cdr (chain-assoc 'direction props))))
     (stack-lines
      (if (number? dir) dir -1)
-     0.0 (cdr (chain-assoc 'baseline-skip props))
-     (map (lambda (x) (interpret-markup paper props x)) (car rest)))
-    ))
+     0.0
+     (cdr (chain-assoc 'baseline-skip props))
+     (map (lambda (x) (interpret-markup paper props x)) mrkups))))
 
-(define-public (center-markup paper props . rest)
-  (let*
-    (
-     (mols (map (lambda (x) (interpret-markup paper props x)) (car rest)))
-     (cmols (map (lambda (x) (ly:molecule-align-to! x X CENTER)) mols))
-     )
-    
-    (stack-lines
-     -1 0.0 (cdr (chain-assoc 'baseline-skip props))
-     mols)
-    ))
+(def-markup-command (center paper props mrkups) (markup-list?)
+  (let* ((mols (map (lambda (x) (interpret-markup paper props x)) mrkups))
+         (cmols (map (lambda (x) (ly:molecule-align-to! x X CENTER)) mols)))
+    (stack-lines -1 0.0 (cdr (chain-assoc 'baseline-skip props)) mols)))
 
-(define-public (right-align-markup paper props . rest)
-  (let* ((m (interpret-markup paper props (car rest))))
+(def-markup-command (right-align paper props mrkup) (markup?)
+  (let* ((m (interpret-markup paper props mrkup)))
     (ly:molecule-align-to! m X RIGHT)
     m))
-(define-public (left-align-markup paper props . rest)
-  (let* ((m (interpret-markup paper props (car rest))))
+
+(def-markup-command (left-align paper props mrkup) (markup?)
+  (let* ((m (interpret-markup paper props mrkup)))
     (ly:molecule-align-to! m X LEFT)
     m))
-(define-public (halign-markup paper props . rest)
+
+(def-markup-command (halign paper props dir mrkup) (number? markup?)
   "Set horizontal alignment. Syntax: halign A MARKUP. A=-1 is LEFT,
 A=1 is right, values in between vary alignment accordingly."
-  (let* ((m (interpret-markup paper props (cadr rest))))
-    (ly:molecule-align-to! m X (car rest))
+  (let* ((m (interpret-markup paper props mrkup)))
+    (ly:molecule-align-to! m X dir)
     m))
 
-
-
-(define-public (musicglyph-markup paper props . rest)
+(def-markup-command (musicglyph paper props glyph-name) (string?)
   (ly:find-glyph-by-name
    (ly:paper-get-font paper (cons '((font-name . ())
-                                   (font-shape . *)
-                                   (font-series . *)
-                                   (font-family . music)) props))
-   (car rest)))
+                                    (font-shape . *)
+                                    (font-series . *)
+                                    (font-family . music))
+                                  props))
+   glyph-name))
 
 
-(define-public (lookup-markup paper props . rest)
+(def-markup-command (lookup paper props glyph-name) (string?)
   "Lookup a glyph by name."
-  (ly:find-glyph-by-name
-   (ly:paper-get-font paper  props)
-   (car rest))
-  )
+  (ly:find-glyph-by-name (ly:paper-get-font paper props)
+                         glyph-name))
 
-(define-public (char-markup paper props . rest)
+(def-markup-command (char paper props num) (integer?)
   "Syntax: \\char NUMBER. "
-  (ly:get-glyph  (ly:paper-get-font paper props) (car rest))
-  )
+  (ly:get-glyph (ly:paper-get-font paper props) num))
 
-(define-public (raise-markup paper props  . rest)
+(def-markup-command (raise paper props amount mrkup) (number? markup?)
   "Syntax: \\raise AMOUNT MARKUP. "
-  (ly:molecule-translate-axis (interpret-markup
-                              paper
-                              props
-                              (cadr rest))
-                             (car rest) Y))
+  (ly:molecule-translate-axis (interpret-markup paper props mrkup)
+                              amount Y))
 
-(define-public (fraction-markup paper props . rest)
+(def-markup-command (fraction paper props mrkup1 mrkup2) (markup? markup?)
   "Make a fraction of two markups.
 
 Syntax: \\fraction MARKUP1 MARKUP2."
-
-  (let*
-      ((m1 (interpret-markup paper props (car rest)))
-       (m2 (interpret-markup paper props (cadr rest))))
-
+  (let* ((m1 (interpret-markup paper props mrkup1))
+         (m2 (interpret-markup paper props mrkup2)))
     (ly:molecule-align-to! m1 X CENTER)
-    (ly:molecule-align-to! m2 X CENTER)
-    
-    (let*
-       ((x1 (ly:molecule-get-extent m1 X))
-        (x2 (ly:molecule-get-extent m2 X))
-        (line (ly:round-filled-box (interval-union x1 x2) '(-0.05 . 0.05) 0.0))
-
-        ;; should stack mols separately, to maintain LINE on baseline
-        (stack (stack-lines -1 0.2 0.6 (list m1 line m2))))
-
+    (ly:molecule-align-to! m2 X CENTER)    
+    (let* ((x1 (ly:molecule-get-extent m1 X))
+           (x2 (ly:molecule-get-extent m2 X))
+           (line (ly:round-filled-box (interval-union x1 x2) '(-0.05 . 0.05) 0.0))
+           ;; should stack mols separately, to maintain LINE on baseline
+           (stack (stack-lines -1 0.2 0.6 (list m1 line m2))))
       (ly:molecule-align-to! stack Y CENTER)
       (ly:molecule-align-to! stack X LEFT)
       ;; should have EX dimension
       ;; empirical anyway
-      (ly:molecule-translate-axis stack 0.75 Y) 
-      )))
+      (ly:molecule-translate-axis stack 0.75 Y))))
 
 
 ;; TODO: better syntax.
 
-
-(use-modules (ice-9 optargs)
-             (ice-9 regex))
+(def-markup-command (note-by-number paper props log dot-count dir) (number? number? number?)
+  "Syntax: \\note-by-number #LOG #DOTS #DIR.  By using fractional values
+for DIR, you can obtain longer or shorter stems."
+  (let* ((font (ly:paper-get-font paper (cons '((font-family .  music)) props)))
+         (stemlen (max 3 (- log 1)))
+         (headgl (ly:find-glyph-by-name
+                  font
+                  (string-append "noteheads-" (number->string (min log 2)))))
+         (stemth 0.13)
+         (stemy (* dir stemlen))
+         (attachx (if (> dir 0)
+                      (- (cdr (ly:molecule-get-extent headgl X)) stemth)
+                      0))
+         (attachy (* dir 0.28))
+         (stemgl (and (> log 0)
+                      (ly:round-filled-box
+                       (cons attachx (+ attachx  stemth))
+                       (cons (min stemy attachy)
+                             (max stemy attachy))
+                       (/ stemth 3))))
+         (dot (ly:find-glyph-by-name font "dots-dot"))
+         (dotwid (interval-length (ly:molecule-get-extent dot X)))
+         (dots (and (> dot-count 0)
+                    (apply ly:molecule-add
+                           (map (lambda (x)
+                                  (ly:molecule-translate-axis
+                                   dot  (* (+ 1 (* 2 x)) dotwid) X) )
+                                (iota dot-count 1)))))
+         (flaggl (and (> log 2)
+                      (ly:molecule-translate
+                       (ly:find-glyph-by-name font
+                                              (string-append "flags-"
+                                                             (if (> dir 0) "u" "d")
+                                                             (number->string log)))
+                       (cons (+ attachx (/ stemth 2)) stemy)))))
+    (if flaggl
+        (set! stemgl (ly:molecule-add flaggl stemgl)))
+    (if (ly:molecule? stemgl)
+        (set! stemgl (ly:molecule-add stemgl headgl))
+        (set! stemgl headgl))
+    (if (ly:molecule? dots)
+        (set! stemgl
+              (ly:molecule-add
+               (ly:molecule-translate-axis dots
+                                           (+ (if (and (> dir 0) (> log 2))
+                                                  (* 1.5 dotwid)
+                                                  0)
+                                              ;; huh ? why not necessary?
+                                              ;;(cdr (ly:molecule-get-extent headgl X))
+                                              dotwid)
+                                           X)
+               stemgl)))
+    stemgl))
+
+(use-modules (ice-9 regex))
 
 (define-public log2 
   (let ((divisor (log 2)))
@@ -277,240 +497,121 @@ Syntax: \\fraction MARKUP1 MARKUP2."
                 (if dots (string-length dots) 0)))
         (error "This is not a valid duration string:" duration-string))))
 
-
-(define-public (note-markup paper props . rest)
+(def-markup-command (note paper props duration-string dir) (string? number?)
   "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."
+  (let ((parsed (parse-simple-duration duration-string)))
+    (note-by-number-markup paper props (car parsed) (cadr parsed) dir)))
 
-  (let*
-      ((parsed (parse-simple-duration (car rest)))
-       (dir (cadr rest)))
-    (note-by-number-markup paper props (car parsed) (cadr parsed) dir)
-  ))
-
-(define-public (note-by-number-markup paper props . rest )
-  "Syntax: \\note #LOG #DOTS #DIR.  By using fractional values
-for DIR, you can obtain longer or shorter stems."
-  (let*
-      (
-       (log (car rest))
-       (dot-count (cadr  rest))
-       (dir (caddr rest))
-       (font (ly:paper-get-font paper (cons '((font-family .  music)) props)))
-       (stemlen (max 3 (- log 1)))
-       (headgl
-       (ly:find-glyph-by-name font (string-append "noteheads-" (number->string (min log 2)))))
-
-       (stemth 0.13)
-       (stemy (* dir stemlen))
-       (attachx (if (> dir 0) (- (cdr (ly:molecule-get-extent headgl X)) stemth)
-                   0))
-       (attachy (* dir 0.28))
-       (stemgl (if (> log 0)
-                  (ly:round-filled-box
-                                    (cons attachx (+ attachx  stemth))
-                                    (cons (min stemy attachy)
-                                          (max stemy attachy))
-                                   (/ stemth 3)
-                                   ) #f))
-       (dot (ly:find-glyph-by-name font "dots-dot"))
-       (dotwid  (interval-length (ly:molecule-get-extent dot X)))
-       (dots (if (> dot-count 0)
-                (apply ly:molecule-add
-                 (map (lambda (x)
-                        (ly:molecule-translate-axis
-                         dot  (* (+ 1 (* 2 x)) dotwid) X) )
-                      (iota dot-count 1)))
-                #f))
-       
-       (flaggl (if (> log 2)
-                  (ly:molecule-translate
-                   (ly:find-glyph-by-name
-                    font
-                    (string-append "flags-"
-                                   (if (> dir 0) "u" "d")
-                                   (number->string log)
-                                   ))
-                   (cons (+ attachx (/ stemth 2)) stemy))
-
-                   #f)))
-    
-    (if flaggl
-       (set! stemgl (ly:molecule-add flaggl stemgl)))
-
-    (if (ly:molecule? stemgl)
-       (set! stemgl (ly:molecule-add stemgl headgl))
-        (set! stemgl headgl)
-       )
-    
-    (if (ly:molecule? dots)
-       (set! stemgl
-             (ly:molecule-add
-              (ly:molecule-translate-axis
-               dots
-               (+
-                (if (and (> dir 0) (> log 2))
-                    (* 1.5 dotwid) 0)
-                ;; huh ? why not necessary?
-               ;(cdr (ly:molecule-get-extent headgl X))
-                     dotwid
-                )
-               X)
-              stemgl 
-              )
-             ))
-
-    stemgl
-    ))
-
-(define-public (normal-size-super-markup paper props . rest)
+(def-markup-command (normal-size-super paper props mrkup) (markup?)
   (ly:molecule-translate-axis (interpret-markup
-                              paper
-                              props (car rest))
-                             (* 0.5 (cdr (chain-assoc 'baseline-skip props)))
-                             Y)
-  )
+                               paper
+                               props mrkup)
+                              (* 0.5 (cdr (chain-assoc 'baseline-skip props)))
+                              Y))
 
-(define-public (super-markup paper props  . rest)
+(def-markup-command (super paper props mrkup) (markup?)
   "Syntax: \\super MARKUP. "
-  (ly:molecule-translate-axis (interpret-markup
-                              paper
-                              (cons `((font-size .
-                                                 ,(- (chain-assoc-get 'font-size props 0) 3))) props) (car rest))
-                             (* 0.5 (cdr (chain-assoc 'baseline-skip props)))
-                             Y)
-  )
-
-(define-public (translate-markup paper props . rest)
-  "Syntax: \\translate OFFSET MARKUP. "
-  (ly:molecule-translate (interpret-markup  paper props (cadr rest))
-                        (car rest))
+  (ly:molecule-translate-axis
+   (interpret-markup
+    paper
+    (cons `((font-size . ,(- (chain-assoc-get 'font-size props 0) 3))) props)
+    mrkup)
+   (* 0.5 (cdr (chain-assoc 'baseline-skip props)))
+   Y))
 
-  )
+(def-markup-command (translate paper props offset mrkup) (number-pair? markup?)
+  "Syntax: \\translate OFFSET MARKUP. "
+  (ly:molecule-translate (interpret-markup  paper props mrkup)
+                         offset))
 
-(define-public (sub-markup paper props  . rest)
+(def-markup-command (sub paper props mrkup) (markup?)
   "Syntax: \\sub MARKUP."
   (ly:molecule-translate-axis
    (interpret-markup
     paper
-    (cons `((font-size .
-                      ,(- (chain-assoc-get 'font-size props 0) 3))) props)
-    (car rest))
+    (cons `((font-size . ,(- (chain-assoc-get 'font-size props 0) 3))) props)
+    mrkup)
    (* -0.5 (cdr (chain-assoc 'baseline-skip props)))
-   Y) )
+   Y))
 
-(define-public (normal-size-sub-markup paper props . rest)
+(def-markup-command (normal-size-sub paper props mrkup) (markup?)
   (ly:molecule-translate-axis
-   (interpret-markup
-    paper
-    props (car rest))
+   (interpret-markup paper props mrkup)
    (* -0.5 (cdr (chain-assoc 'baseline-skip props)))
-   Y) )
+   Y))
 
-(define-public (hbracket-markup paper props . rest)
+(def-markup-command (hbracket paper props mrkup) (markup?)
   "Horizontal brackets around its single argument. Syntax \\hbracket MARKUP."  
-  
-  (let*
-      ((th 0.1) ;; todo: take from GROB.
-       (m (interpret-markup paper props (car rest))) )
+  (let ((th 0.1) ;; todo: take from GROB.
+        (m (interpret-markup paper props mrkup)))
+    (bracketify-molecule m X th (* 2.5 th) th)))
 
-    (bracketify-molecule m X th (* 2.5 th) th)  
-))
-
-(define-public (bracket-markup paper props . rest)
+(def-markup-command (bracket paper props mrkup) (markup?)
   "Vertical brackets around its single argument. Syntax \\bracket MARKUP."  
-  (let*
-      ((th 0.1) ;; todo: take from GROB.
-       (m (interpret-markup paper props (car rest))) )
-
-    (bracketify-molecule m Y th (* 2.5 th) th)  
-))
+  (let ((th 0.1) ;; todo: take from GROB.
+        (m (interpret-markup paper props mrkup)))
+    (bracketify-molecule m Y th (* 2.5 th) th)))
 
 ;; todo: fix negative space
-(define (hspace-markup paper props . rest)
+(def-markup-command (hspace paper props amount) (number?)
   "Syntax: \\hspace NUMBER."
-  (let*
-      ((amount (car rest)))
-    (if (> amount 0)
-       (ly:make-molecule "" (cons 0 amount) '(-1 . 1) )
-       (ly:make-molecule "" (cons amount amount) '(-1 . 1)))
-  ))
-
-(define-public (override-markup paper props . rest)
+  (if (> amount 0)
+      (ly:make-molecule "" (cons 0 amount) '(-1 . 1) )
+      (ly:make-molecule "" (cons amount amount) '(-1 . 1))))
 
+(def-markup-command (override paper props new-prop mrkup) (pair? markup?)
   "Add the first argument in to the property list.  Properties may be
 any sort of property supported by @ref{font-interface} and
 @ref{text-interface}, for example
 
 \\override #'(font-family . married) \"bla\"
-
 "
-  
-  (interpret-markup paper (cons (list (car rest)) props)
-                   (cadr rest)))
+  (interpret-markup paper (cons (list new-prop) props) mrkup))
 
-(define-public (smaller-markup  paper props . rest)
+(def-markup-command (smaller paper props mrkup) (markup?)
   "Syntax: \\smaller MARKUP"
-  (let*
-      ((fs (chain-assoc-get 'font-size props 0))
-       (entry (cons 'font-size (- fs 1)))
-       )
-    (interpret-markup
-     paper (cons (list entry) props)
-     (car rest))
-    ))
+  (let* ((fs (chain-assoc-get 'font-size props 0))
+         (entry (cons 'font-size (- fs 1))))
+    (interpret-markup paper (cons (list entry) props) mrkup)))
 
 
-(define-public (bigger-markup  paper props . rest)
+(def-markup-command (bigger paper props mrkup) (markup?)
   "Syntax: \\bigger MARKUP"
-  (let*
-      ((fs (chain-assoc-get 'font-size props 0))
-       (entry (cons 'font-size (+ fs 1)))
-       )
-  (interpret-markup
-   paper (cons (list entry) props)
-   (car rest))
-  ))
+  (let* ((fs (chain-assoc-get 'font-size props 0))
+         (entry (cons 'font-size (+ fs 1))))
+    (interpret-markup paper (cons (list entry) props) mrkup)))
 
-(define-public larger-markup bigger-markup)
+(def-markup-command larger (markup?)
+  bigger-markup)
 
-
-(define-public (box-markup paper props . rest)
+(def-markup-command (box paper props mrkup) (markup?)
   "Syntax: \\box MARKUP"
-  (let*
-      ((th 0.1)
-       (pad 0.2)
-       (m (interpret-markup paper props (car rest)))
-       )
-    (box-molecule m th pad)
-  ))
+  (let ((th 0.1)
+        (pad 0.2)
+        (m (interpret-markup paper props mrkup)))
+    (box-molecule m th pad)))
 
-
-(define-public (strut-markup paper props . rest)
+(def-markup-command (strut paper props) ()
   "Syntax: \\strut
 
  A box of the same height as the space.
 "
-
-  (let*
-      ((m (Text_item::interpret_markup paper props " ")))
-
+  (let ((m (Text_item::interpret_markup paper props " ")))
     (ly:molecule-set-extent! m X '(1000 . -1000))
     m))
 
-
 (define number->mark-letter-vector (make-vector 25 #\A))
 
 (do ((i 0 (1+ i))
-     (j 0 (1+ j)) )
+     (j 0 (1+ j)))
     ((>= i 26))
   (if (= i (- (char->integer #\I) (char->integer #\A)))
       (set! i (1+ i)))
   (vector-set! number->mark-letter-vector j
-              (integer->char (+ i (char->integer #\A))))  )
+               (integer->char (+ i (char->integer #\A)))))
 
 (define (number->markletter-string n)
   "Double letters for big marks."
@@ -519,340 +620,27 @@ any sort of property supported by @ref{font-interface} and
     
   (if (>= n l)
       (string-append (number->markletter-string (1- (quotient n l)))
-                    (number->markletter-string (remainder n l)))
+                     (number->markletter-string (remainder n l)))
       (make-string 1 (vector-ref number->mark-letter-vector n)))))
 
 
-(define-public (markletter-markup paper props . rest)
+(def-markup-command (markletter paper props num) (number?)
   "Markup letters: skip I and do double letters for big marks.
 Syntax: \\markletter #25"
-  
-  (Text_item::interpret_markup paper props
-                              (number->markletter-string (car rest))
-                              ))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
-(define (markup-signature-to-keyword sig)
-  " (A B C) -> a0-b1-c2 "
-  (if (equal? sig '())
-      'empty
-      (let* ((count  0))
-       (string->symbol (string-join
-                        
-                        (map
-                         (lambda (func)
-                           (set! count (+ count 1))
-                           (string-append
-
-                            ;; for reasons I don't get,
-                            ;; (case func ((markup?) .. )
-                            ;; doesn't work.
-                            (cond 
-                             ((eq? func markup?) "markup")
-                             ((eq? func markup-list?) "markup-list")
-                             (else "scheme")
-                             )
-                            (number->string (- count 1))
-                            ))
-                         
-                         sig)
-                        "-"))
-
-       )))
-
-(define (markup-function? x)
-  (object-property x 'markup-signature) )
-
-(define (markup-list? arg)
-  (define (markup-list-inner? l)
-    (if (null? l)
-       #t
-       (and (markup? (car l)) (markup-list-inner? (cdr l))) ) )
-  (and (list? arg) (markup-list-inner? arg)))
-
-(define (markup-argument-list? signature arguments)
-  "Typecheck argument list."
-  (if (and (pair? signature) (pair? arguments))
-      (and ((car signature) (car arguments))
-          (markup-argument-list? (cdr signature) (cdr arguments)))
-      (and (null? signature) (null? arguments)))
-  )
-
-
-(define (markup-argument-list-error signature arguments number)
-  "return (ARG-NR TYPE-EXPECTED ARG-FOUND) if an error is detected, or
-#f is no error found.
-"
-  (if (and (pair? signature) (pair? arguments))
-      (if (not ((car signature) (car arguments)))
-         (list number (type-name (car signature)) (car arguments))
-         (markup-argument-list-error (cdr signature) (cdr arguments) (+ 1 number)))
-      #f
-  ))
-
-;;
-;; full recursive typecheck.
-;;
-(define (markup-typecheck? arg)
-  (or (string? arg)
-      (and (pair? arg)
-       (markup-function? (car arg))
-       (markup-argument-list?
-       (object-property (car arg) 'markup-signature)
-       (cdr arg))
-  ))
-)
-
-;; 
-;; typecheck, and throw an error when something amiss.
-;; 
-(define (markup-thrower-typecheck arg)
-  (cond
-   ((string? arg) #t)
-   ((not (pair? arg))
-    (throw 'markup-format "Not a pair" arg)
-    )
-   ((not (markup-function? (car arg)))
-    (throw 'markup-format "Not a markup function " (car arg)))
-   
-  
-   ((not (markup-argument-list? 
-         (object-property (car arg) 'markup-signature)
-         (cdr arg)))
-    (throw 'markup-format "Arguments failed  typecheck for " arg)))
-   #t
-  )
-
-;;
-;; good enough if you only  use make-XXX-markup functions.
-;; 
-(define (cheap-markup? x)
-  (or (string? x)
-      (and (pair? x)
-          (markup-function? (car x))))
-)
-
-;;
-;; replace by markup-thrower-typecheck for more detailed diagnostics.
-;; 
-(define markup?  cheap-markup?)
-
-(define markup-functions-and-signatures
-  (list
-
-   ;; abs size
-   (cons teeny-markup (list markup?))
-   (cons tiny-markup (list markup?))
-   (cons small-markup (list markup?))
-   (cons dynamic-markup (list markup?))
-   (cons large-markup (list markup?)) 
-   (cons normalsize-markup (list markup?)) 
-   
-   (cons huge-markup (list markup?))
-
-   ;; size
-   (cons smaller-markup (list markup?))
-   (cons bigger-markup (list markup?))
-   (cons larger-markup (list markup?))
-;   (cons char-number-markup (list string?))
-   
-   ;; 
-   (cons sub-markup (list markup?))
-   (cons normal-size-sub-markup (list markup?))
-   
-   (cons super-markup (list markup?))
-   (cons normal-size-super-markup (list markup?))
-
-   (cons finger-markup (list markup?))
-   (cons bold-markup (list markup?))
-   (cons italic-markup (list markup?))
-   (cons typewriter-markup (list markup?))
-   (cons roman-markup (list markup?))
-   (cons number-markup (list markup?))
-   (cons hbracket-markup  (list markup?))
-   (cons bracket-markup  (list markup?))
-   (cons note-markup (list string? number?))
-   (cons note-by-number-markup (list number? number? number?))
-   (cons fraction-markup (list markup? markup?))
-   (cons markletter-markup (list number?))
-   (cons column-markup (list markup-list?))
-   (cons dir-column-markup (list markup-list?))
-   (cons center-markup (list markup-list?))
-   (cons line-markup  (list markup-list?))
-
-   (cons right-align-markup (list markup?))
-   (cons left-align-markup (list markup?))   
-   (cons halign-markup (list number? markup?))
-   
-   (cons combine-markup (list markup? markup?))
-   (cons simple-markup (list string?))
-   (cons musicglyph-markup (list string?))
-   (cons translate-markup (list number-pair? markup?))
-   (cons override-markup (list pair? markup?))
-   (cons char-markup (list integer?))
-   (cons lookup-markup (list string?))
-   
-   (cons hspace-markup (list number?))
-
-   (cons raise-markup (list number? markup?))
-   (cons magnify-markup (list number? markup?))
-   (cons fontsize-markup (list number? markup?))
-
-   (cons box-markup  (list markup?))
-   (cons strut-markup '())
-   ))
-
-
-(define markup-module (current-module))
-
-(map (lambda (x)
-       (set-object-property! (car x) 'markup-signature (cdr x))
-       (set-object-property! (car x) 'markup-keyword (markup-signature-to-keyword (cdr x)))
-       )
-     markup-functions-and-signatures)
-
-(define-public markup-function-list (map car markup-functions-and-signatures))
-
-
-;; construct a
-;;
-;; make-FOO-markup function that typechecks its arguments.
-;;
-;; TODO: should construct a message says
-;; Invalid argument 4 : expecting a BLADIBLA, found: (list-ref 4 args)
-;;
-;; right now, you get the entire argument list.
-
-
-(define (make-markup-maker  entry)
-  (let*
-       ((foo-markup (car entry))
-        (signature (cons 'list (cdr entry)))
-        (name (symbol->string (procedure-name foo-markup)))
-        (make-name  (string-append "make-" name))
-        )
-      
-      `(define (,(string->symbol make-name) . args)
-        (let*
-            (
-             (arglen (length  args))
-             (siglen (length ,signature))
-             (error-msg
-              (if (and (> 0 siglen) (> 0 arglen))
-                  (markup-argument-list-error ,signature args 1)))
-             
-             )
-        
-        (if (or (not (= arglen siglen)) (< siglen 0) (< 0 arglen))
-            (scm-error 'markup-format ,make-name "Expect ~A arguments for ~A. Found ~A: ~S"
-                       (list (length ,signature)
-                             ,make-name
-                             (length args)
-                             args) #f))
-        (if error-msg
-            (scm-error 'markup-format ,make-name "Invalid argument in position ~A\n Expect: ~A\nFound: ~S." error-msg #f)
-            
-            (cons ,foo-markup args)
-            )))
-    )
-)
-
-
-
-(define (make-markup markup-function make-name signature args)
-  
-  " Construct a markup object from MARKUP-FUNCTION and ARGS. Typecheck
-against SIGNATURE, reporting MAKE-NAME as the user-invoked function.
-"
-
-  (let*
-      ((arglen (length args))
-       (siglen (length signature))
-       (error-msg
-       (if (and (> siglen 0) (> arglen 0))
-           (markup-argument-list-error signature args 1)
-           #f)))
-
-
-    (if (or (not (= arglen siglen)) (< siglen 0) (< arglen 0))
-       (scm-error 'markup-format make-name "Expect ~A arguments for ~A. Found ~A: ~S"
-                  (list siglen
-                        make-name
-                        arglen
-                        args) #f))
-
-    (if error-msg
-       (scm-error 'markup-format make-name "Invalid argument in position ~A\nExpect: ~A\nFound: ~S." error-msg #f)
-       
-       (cons markup-function  args)
-       )))
-
-(define (make-markup-maker entry)
-  (let* (
-        (name (symbol->string (procedure-name (car entry))))
-        (make-name  (string-append "make-" name))
-        (signature (object-property (car entry) 'markup-signature))
-        )
-  
-    `(define-public (,(string->symbol make-name) . args)
-       (make-markup ,(car entry) ,make-name ,(cons 'list signature)  args)
-       ))
-  )
-
-(eval
- (cons 'begin (map make-markup-maker markup-functions-and-signatures))
- markup-module
- )
-
-;;
-;; TODO: add module argument so user-defined markups can also be 
-;; processed.
-;;
-(define-public (lookup-markup-command code)
-  (let*
-      ((sym (string->symbol (string-append code "-markup")))
-       (var (module-local-variable markup-module sym))
-       )
-    (if (eq? var #f)
-       #f   
-       (cons (variable-ref var) (object-property  (variable-ref var) 'markup-keyword))
-    )
-  ))
-
-
-(define-public brew-new-markup-molecule Text_item::brew_molecule)
-
-(define-public empty-markup (make-simple-markup ""))
-
-(define-public interpret-markup Text_item::interpret_markup)
-
-
-;;;;;;;;;;;;;;;;
-;; utility
-
-(define (markup-join markups sep)
-  "Return line-markup of MARKUPS, joining them with markup SEP"
-  (if (pair? markups)
-      (make-line-markup (list-insert-separator markups sep))
-      empty-markup))
-
+  (Text_item::interpret_markup paper props (number->markletter-string num)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (if #f
-   (define (typecheck-with-error x)
-     (catch
-      'markup-format
-      (lambda () (markup? x))
-      (lambda (key message arg)
-       (display "\nERROR: markup format error: \n")
-       (display message)
-       (newline)
-       (write arg (current-output-port))
-       )
-      )))
+    (define (typecheck-with-error x)
+      (catch
+       'markup-format
+       (lambda () (markup? x))
+       (lambda (key message arg)
+         (display "\nERROR: markup format error: \n")
+         (display message)
+         (newline)
+         (write arg (current-output-port))))))
 
 ;; test make-foo-markup functions
 (if #f
@@ -863,31 +651,22 @@ against SIGNATURE, reporting MAKE-NAME as the user-invoked function.
       
       (make-line-markup (make-simple-markup "FOO"))
       (make-line-markup (make-simple-markup "FOO") (make-simple-markup "foo"))
-      (make-raise-markup "foo" (make-simple-markup "foo"))
-      )
-    )
-
+      (make-raise-markup "foo" (make-simple-markup "foo"))))
 
 ;;
 ;; test typecheckers. Not wholly useful, because errors are detected
 ;; in other places than they're made.
 ;;
 (if #f
- (begin
-
-   ;; To get error messages, see above to install the alternate
-   ;; typecheck routine for markup?.
-   
-
-
-   (display (typecheck-with-error `(,simple-markup "foobar")))
-   (display (typecheck-with-error `(,simple-markup "foobar")))
-   (display (typecheck-with-error `(,simple-markup 1)))
-   (display
-    (typecheck-with-error  `(,line-markup ((,simple-markup "foobar"))
-                                         (,simple-markup 1))))
-   (display
-    (typecheck-with-error  `(,line-markup (,simple-markup "foobar")
-                                        (,simple-markup "bla"))))
-   
-   ))
+    (begin
+      ;; To get error messages, see above to install the alternate
+      ;; typecheck routine for markup?.
+      (display (typecheck-with-error `(,simple-markup "foobar")))
+      (display (typecheck-with-error `(,simple-markup "foobar")))
+      (display (typecheck-with-error `(,simple-markup 1)))
+      (display
+       (typecheck-with-error `(,line-markup ((,simple-markup "foobar"))
+                                            (,simple-markup 1))))
+      (display
+       (typecheck-with-error `(,line-markup (,simple-markup "foobar")
+                                            (,simple-markup "bla"))))))