« イヤンの SQL | トップページ | HTML + CSS で数式組版 (その4) »

2009年3月20日 (金)

HTML + CSS で数式組版 (その 3 )

さて、プログラミングのお時間です。

開発環境

xyzzy の Common Lisp 処理系を使わせていただきます。理由は、私が愛用しているエディタだからです。以上。

入力

分数を組版することだけを考えることにします。数式は、以下のように入力します。何かに似ているような気がするかもしれませんが、気のせいです。

x = \frac{a}{b} + c

プログラム

まだ手をつけたところですが、何か長くなりそうなので、途中経過を載せてしまいます。あまり長くなると、ソースを載せるのが面倒になってしまいますので。

入力文字列を、トークンに分割するところまでです。

(defvar *match-keyargs* "\\\\[a-z]+{.+}*")
(defvar *match-text* "[^ ]+")

(defun match-token (str)
  (match-token-specs
   str
   (list `(,*match-keyargs* keyargs)
         `(,*match-text* text))))

(defun match-token-specs (str specs)
  (if specs
      (let ((mb (string-match (concat "^" (caar specs)) str))
            (me (match-end 0)))
        (if mb (list mb me (cadar specs))
          (match-token-specs str (cdr specs))))
    nil))

(defun parse-string (str elems)
  (if (> (length str) 0)
      (let ((m (match-token str)))
        (let ((mb (car m))
              (me (cadr m))
              (spec (caddr m)))
        (if mb
            (if (eq spec 'keyargs)
              (cons (list spec (substring str mb me))
                    (parse-string (substring str me) elems))
              (cons (list spec (substring str mb me))
                    (parse-string (substring str me) elems)))
          (parse-string (substring str 1) elems))))))

最後の関数を eval すると、こうなります:

(parse-string "x = \\frac{a}{b} + c" nil)
=>((text "x") (text "=") (keyargs "\\frac{a}{b}") (text "+") (text "c"))

parse-string 関数の、 (if (eq spec 'keyargs) ... のところ、同じ式を 2 回書いていますが、ここが、これから手をつけようとしている場所です。 キーワード+引数を見つけたら、どうにかするという処理を、これから書こうかと思っているところです。

|

« イヤンの SQL | トップページ | HTML + CSS で数式組版 (その4) »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/28707435

この記事へのトラックバック一覧です: HTML + CSS で数式組版 (その 3 ):

« イヤンの SQL | トップページ | HTML + CSS で数式組版 (その4) »