1#lang racket/base 2(require scribble/struct 3 scribble/base) 4(provide & // tabbing) 5 6(define-struct tabbing-marker (kind) #:transparent) 7 8(define & (make-tabbing-marker '&)) 9(define // (make-tabbing-marker '//)) 10 11(define (tabbing #:spacing [spacing 4] . pres) 12 (define (loop pres cell row rows sep) 13 (cond [(null? pres) 14 (let* ([row (cons (reverse cell) row)] 15 [rows (cons (reverse row) rows)]) 16 (reverse rows))] 17 [(eq? (car pres) &) 18 (loop (cdr pres) null (list* sep (reverse cell) row) rows sep)] 19 [(eq? (car pres) //) 20 (let* ([row (cons (reverse cell) row)]) 21 (loop (cdr pres) null null (cons (reverse row) rows) null))] 22 [else 23 (loop (cdr pres) (cons (car pres) cell) row rows sep)])) 24 (define rows (loop pres null null null (list (hspace spacing)))) 25 (make-table #f (map layout-row rows))) 26 27(define (layout-row row) 28 (map layout-cell row)) 29 30(define (layout-cell cell) 31 (make-flow (list (make-paragraph cell)))) 32