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