title: 使用Scheme在TeXmacs中生成图片 tags: TeXmacs, graph, scheme

刚开始使用TeXmacs的时候就想照着Henri Lesourd写的A TeXmacs graphics tutorial用Scheme做一个图,结果由于对TeXmacs和Scheme的了解都不够深入,以及教程的时效性,没能成功。最近读了一点TeXmacs的文档之后,才有所领悟,花了一点时间读懂了这个教程示例代码,做了些许更改后,才做出下图:

A rose

本文将结合TeXmacs的内在机制简单介绍做图的整个过程和原理。我所用TeXmacs版本为1.99.2

作图过程

(define-macro (foreach i . b)
  `(for-each (lambda (,(car i))
               ,(cons 'begin b))
             ,(cadr i)))

(define-macro (foreach-number i . b)
  `(do ((,(car i) ,(cadr i)
         (,(if (memq (caddr i) '(> >=)) '- '+) ,(car i) 1)))
       ((,(if (eq? (caddr i) '>)
              '<=
              (if (eq? (caddr i) '<)
                  '>=
                  (if (eq? (caddr i) '>=) '< '>)))
         ,(car i) ,(cadddr i))
        ,(car i))
     ,(cons 'begin b)))

(define (rose r nsteps)
           (define pi (acos -1))
           (define points '())
           (define lines '())
           (set! r (tree->number r))
           (set! nsteps (tree->number nsteps))
           (foreach-number (i 0 < nsteps)
                           (with t (/ (* 2 i pi) nsteps)
                                  (set! points
                                        (cons `(point ,(number->string (* r (cos t)))
                                                      ,(number->string (* r (sin t))))
                                              points))))
           (foreach (p1 points)
                    (foreach (p2 points)
                             (set! lines (cons `(line ,p1 ,p2) lines))))
           `(with  "gr-geometry"  ,(cons 'tuple '("geometry" "0.5par" "0.5par" "center")) ,(cons 'graphics (append lines points))))

相关的TeXmacs机制