;; Page properties. (define PAGE_WIDTH 75) ;; Paragraph properties. (define INDENT " ") (define PARAGRAPH_POST "\n") (define PAGE_MARGIN " ") (define PARAGRAPH_WIDTH PAGE_WIDTH) (define QUOTE_WIDTH 65) (define MARGIN PAGE_MARGIN) ;; Variables (define partext "") (define section_number 1) (define subsection_number 1) (define subsubsection_number 1) (define repeat-string (lambda (str n) (if (< n 1) "" (string-append str (repeat-string str (- n 1))) ) ) ) (define title (lambda (text) (if (string? text) (if (string=? text "") "" (begin (display MARGIN) (display (repeat-string " " (quotient (- PARAGRAPH_WIDTH (string-length text)) 2))) (display text) (newline) ) ) (display "\n\n*** Error: No string in title. ***\n\n") ) ) ) (define author title) (define centre title) (define hr (lambda () (begin (display MARGIN) (display (repeat-string "_" (- PARAGRAPH_WIDTH 1))) (newline) ) ) ) (define remove-newlines (lambda (text) (if (string=? text "") "" (if (eqv? (string-ref text 0) #\newline) (remove-newlines (substring text 1 (string-length text))) (string-append (string (string-ref text 0)) (remove-newlines (substring text 1 (string-length text)))) ) ) ) ) ;; Get the position of the linebreak (define get-linebreak (lambda (text) (if (string=? text "") 0 (if (> (string-length text) PARAGRAPH_WIDTH) (if (eqv? (string-ref text (+ 1 PARAGRAPH_WIDTH)) #\space) PARAGRAPH_WIDTH (get-linebreak (substring text 0 PARAGRAPH_WIDTH)) ) (if (or (eqv? (string-ref text (- (string-length text) 1)) #\space) (eqv? (string-ref text (- (string-length text) 1)) #\-)) (string-length text) (get-linebreak (substring text 0 (- (string-length text) 1))) ) ) ) ) ) (define count-spaces (lambda (text) (if (string=? text "") 0 (if (eqv? (string-ref text 0) #\space) (+ 1 (count-spaces (substring text 1 (string-length text)))) (count-spaces (substring text 1 (string-length text))) ) ) ) ) (define insert-spaces (lambda (text n) (if (or (< n 1) (string=? text "")) text (let ( (addsp (quotient n (count-spaces text))) (extrasp (remainder n (count-spaces text))) ) (if (eqv? (string-ref text 0) #\space) (if (> extrasp 0) (string-append (repeat-string " " (+ 2 addsp)) (insert-spaces (substring text 1 (string-length text)) (- n (+ 1 addsp))) ) (string-append (repeat-string " " (+ 1 addsp)) (insert-spaces (substring text 1 (string-length text)) (- n addsp)) ) ) (string-append (string (string-ref text 0)) (insert-spaces (substring text 1 (string-length text)) n) ) ) ) ) ) ) (define grow-line (lambda (text) (if (eqv? (string-length text) PARAGRAPH_WIDTH) text (insert-spaces text (- PARAGRAPH_WIDTH (string-length text))) ) ) ) (define display-lines (lambda (text) (if (> (string-length text) PARAGRAPH_WIDTH) (let ((linebreak (get-linebreak text))) (if (eqv? linebreak 0) (begin (display MARGIN) (display (substring text 0 (- PARAGRAPH_WIDTH 2))) (display "-") (newline) (display-lines (substring text (- PARAGRAPH_WIDTH 2) (string-length text))) ) (begin (display MARGIN) (display (grow-line (substring text 0 (get-linebreak text)))) (newline) (if (eqv? (string-ref (substring text linebreak (string-length text)) 0) #\space ) (display-lines (substring text (+ 1 linebreak) (string-length text))) (display-lines (substring text linebreak (string-length text))) ) ) ) ) (begin (display MARGIN) (display text) (newline) ) ) ) ) (define firstparagraph (lambda (text) (if (string? text) (begin (set! PARAGRAPH_WIDTH PAGE_WIDTH) (set! MARGIN PAGE_MARGIN) (display-lines (string-append (remove-newlines text) PARAGRAPH_POST)) ) (display "\n*** Error: text in paragraph is not a string. ***\n\n") ) ) ) (define quote (lambda (text) (if (string? text) (begin (set! PARAGRAPH_WIDTH QUOTE_WIDTH) (set! MARGIN (repeat-string " " (quotient (- PAGE_WIDTH QUOTE_WIDTH) 2) ) ) (display-lines (string-append (remove-newlines text) PARAGRAPH_POST)) ) (display "\n*** Error: text in quote is not a string. ***\n\n") ) ) ) (define paragraph (lambda (text) (if (string? text) (begin (set! MARGIN PAGE_MARGIN) (set! partext (remove-newlines text)) (if (> (string-length partext) PARAGRAPH_WIDTH) (begin (display MARGIN) (display INDENT) (set! PARAGRAPH_WIDTH (- PAGE_WIDTH (string-length INDENT))) (display (grow-line (substring partext 0 (get-linebreak partext))) ) (newline) (set! partext (substring partext (get-linebreak partext) (string-length partext)) ) (set! PARAGRAPH_WIDTH PAGE_WIDTH) (display-lines (string-append partext PARAGRAPH_POST) ) ) (display (string-append MARGIN INDENT partext "\n" PARAGRAPH_POST)) ) ) (display "\n*** Error: text in paragraph is not a string. ***\n\n") ) ) ) (define pre display) (define section (lambda (text) (if (string? text) (begin (display (string-append MARGIN (number->string section_number) ". " text "\n\n" ) ) (set! section_number (+ 1 section_number)) (set! subsection_number 1) (set! subsubsection_number 1) ) (display "\n\n*** Error: text in section is not a string. ***\n\n") ) ) ) (define subsection (lambda (text) (if (string? text) (begin (display (string-append MARGIN (number->string section_number) "." (number->string subsection_number) ". " text "\n\n" ) ) (set! subsection_number (+ 1 subsection_number)) (set! subsubsection_number 1) ) (display "\n\n*** Error: text in section is not a string. ***\n\n") ) ) ) (define subsubsection (lambda (text) (if (string? text) (begin (display (string-append MARGIN (number->string section_number) "." (number->string section_number) "." (number->string section_number) ". " text "\n\n" ) ) (set! subsubsection_number (+ 1 subsection_number)) ) (display "\n\n*** Error: text in section is not a string. ***\n\n") ) ) )