;; These regexps are sensitive to the precise output of tex2page: (define re:section (regexp "(<[^>]*>)*[0-9.]+(.*)")) (define re:chapter (regexp "^(.*)")) (define re:method (regexp "(.*) in ")) (define (clean-up s) (regexp-replace* "^ +" (regexp-replace* "&[^;]*;" (regexp-replace* "<[^>]*>" (regexp-replace* "( )+" (regexp-replace* "&" (regexp-replace* ">" (regexp-replace* "<" s "<") ">") "\\&") " ") "") "") "")) ;; Find the closest section title to the anchor (define (get-title page anchor) (let ([re:anchor (regexp (regexp-quote anchor))]) (with-handlers ([void (lambda (x) "???")]) (with-input-from-file (build-path dir-to-read page) (lambda () (let loop ([title-so-far "???"]) (let ([r (read-line)]) (if (eof-object? r) "???" (let ([title-so-far (cond [(regexp-match re:section r) => (lambda (m) (caddr m))] [(regexp-match re:chapter r) => (lambda (m) (cadr m))] [(regexp-match re:method r) => (lambda (m) (cadr m))] [else title-so-far])]) (if (regexp-match re:anchor r) (if (equal? title-so-far "???") ;; try section on one more line; needed for class sections in MrEd: (let* ([r (read-line)] [m (and (string? r) (regexp-match re:section r))]) (if m (caddr m) title-so-far)) title-so-far) (loop title-so-far)))))))))))