bkyk8rc3zvpnsf5inmcqq4n3k98cv6hj-my-site-hyper-literate-git.test.suzanne.soy-0.0.1

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 9f6f5d981293dd02316e245fb967de08df1a68ab
parent 532feda0483af7377829df63372ad59dbb913aed
Author: Matthew Flatt <mflatt@racket-lang.org>
Date:   Wed, 22 Jun 2011 07:39:01 -0600

add `--latex-section' mode to `scribble'

original commit: 3f95fabf7c4ef7616633820e79bf4d1ea472bbb9

Diffstat:
Mcollects/scribble/latex-render.rkt | 102++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mcollects/scribble/run.rkt | 5+++++
Mcollects/scribblings/scribble/running.scrbl | 12++++++++++--
Mcollects/scriblib/autobib.rkt | 37++++++++++++++++++++-----------------
Mcollects/scriblib/scribblings/autobib.scrbl | 5+++--
5 files changed, 97 insertions(+), 64 deletions(-)

diff --git a/collects/scribble/latex-render.rkt b/collects/scribble/latex-render.rkt @@ -11,7 +11,8 @@ scheme/list setup/main-collects file/convertible) -(provide render-mixin) +(provide render-mixin + make-render-part-mixin) (define current-table-mode (make-parameter #f)) (define rendering-tt (make-parameter #f)) @@ -34,6 +35,12 @@ (/ (cadr c) 255.0) (/ (caddr c) 255.0)))) +(define (make-render-part-mixin n) + (lambda (%) + (class (render-mixin %) + (define/override (render-part-depth) n) + (super-new)))) + (define (render-mixin %) (class % (inherit-field prefix-file style-file style-extra-files) @@ -56,6 +63,8 @@ (define/override (auto-extra-files? v) (latex-defaults? v)) (define/override (auto-extra-files-paths v) (latex-defaults-extra-files v)) + (define/public (render-part-depth) #f) + (define/override (render-one d ri fn) (let* ([defaults (ormap (lambda (v) (and (latex-defaults? v) v)) (style-properties (part-style d)))] @@ -72,51 +81,58 @@ (cond [(bytes? v) v] [else (main-collects-relative->path v)]))) - scribble-style-tex)]) - (for-each - (lambda (style-file) - (if (bytes? style-file) - (display style-file) - (with-input-from-file style-file - (lambda () - (copy-port (current-input-port) (current-output-port)))))) - (list* prefix-file - scribble-tex - (append (extract-part-style-files - d - ri - 'tex - (lambda (p) #f) - tex-addition? - tex-addition-path) - (list style-file) - style-extra-files))) - (printf "\\begin{document}\n\\preDoc\n") - (when (part-title-content d) - (let ([vers (extract-version d)] - [date (extract-date d)] - [pres (extract-pretitle d)] - [auths (extract-authors d)]) - (for ([pre (in-list pres)]) - (printf "\n\n") - (do-render-paragraph pre d ri #t)) - (when date (printf "\\date{~a}\n" date)) - (printf "\\titleAnd~aVersionAnd~aAuthors{" - (if (equal? vers "") "Empty" "") - (if (null? auths) "Empty" "")) - (render-content (part-title-content d) d ri) - (printf "}{~a}{" vers) - (for/fold ([first? #t]) ([auth (in-list auths)]) - (unless first? (printf "\\SAuthorSep{}")) - (do-render-paragraph auth d ri #t) - #f) - (printf "}\n"))) + scribble-style-tex)] + [all-style-files (cons scribble-tex + (append (extract-part-style-files + d + ri + 'tex + (lambda (p) #f) + tex-addition? + tex-addition-path) + (list style-file) + style-extra-files))] + [whole-doc? (not (render-part-depth))]) + (if whole-doc? + (for ([style-file (in-list (cons prefix-file all-style-files))]) + (if (bytes? style-file) + (display style-file) + (with-input-from-file style-file + (lambda () + (copy-port (current-input-port) (current-output-port)))))) + (for ([style-file (in-list all-style-files)]) + (install-file style-file))) + (when whole-doc? + (printf "\\begin{document}\n\\preDoc\n") + (when (part-title-content d) + (let ([vers (extract-version d)] + [date (extract-date d)] + [pres (extract-pretitle d)] + [auths (extract-authors d)]) + (for ([pre (in-list pres)]) + (printf "\n\n") + (do-render-paragraph pre d ri #t)) + (when date (printf "\\date{~a}\n" date)) + (printf "\\titleAnd~aVersionAnd~aAuthors{" + (if (equal? vers "") "Empty" "") + (if (null? auths) "Empty" "")) + (render-content (part-title-content d) d ri) + (printf "}{~a}{" vers) + (for/fold ([first? #t]) ([auth (in-list auths)]) + (unless first? (printf "\\SAuthorSep{}")) + (do-render-paragraph auth d ri #t) + #f) + (printf "}\n")))) (render-part d ri) - (printf "\n\n\\postDoc\n\\end{document}\n"))) + (when whole-doc? + (printf "\n\n\\postDoc\n\\end{document}\n")))) (define/override (render-part-content d ri) (let ([number (collected-info-number (part-collected-info d ri))]) - (when (and (part-title-content d) (pair? number)) + (when (and (part-title-content d) + (or (pair? number) + (let ([d (render-part-depth)]) + (and d (positive? d))))) (when (eq? (style-name (part-style d)) 'index) (printf "\\twocolumn\n\\parskip=0pt\n\\addcontentsline{toc}{section}{Index}\n")) (let ([pres (extract-pretitle d)]) @@ -127,7 +143,7 @@ (or (not (car number)) ((length number) . > . 3)))]) (printf "\n\n\\~a~a~a" - (case (length number) + (case (+ (length number) (or (render-part-depth) 0)) [(0 1) "sectionNewpage\n\n\\section"] [(2) "subsection"] [(3) "subsubsection"] diff --git a/collects/scribble/run.rkt b/collects/scribble/run.rkt @@ -51,6 +51,11 @@ (current-render-mixin latex:render-mixin)] [("--pdf") "generate PDF-format output (with PDFLaTeX)" (current-render-mixin pdf:render-mixin)] + [("--latex-section") n "generate LaTeX-format output for section depth <n>" + (let ([v (string->number n)]) + (unless (exact-nonnegative-integer? v) + (raise-user-error 'scribble (format "bad section depth: ~a" n))) + (current-render-mixin (latex:make-render-part-mixin v)))] #:once-each [("--dest") dir "write output in <dir>" (current-dest-directory dir)] diff --git a/collects/scribblings/scribble/running.scrbl b/collects/scribblings/scribble/running.scrbl @@ -1,5 +1,6 @@ #lang scribble/manual @(require "utils.rkt" + scribble/bnf (for-label setup/xref)) @(define fn (italic "fn")) @@ -29,6 +30,13 @@ its file suffix: @item{@DFlag{pdf} --- PDF @filepath{@|fn|.pdf} that is generated via @exec{pdflatex}} + @item{@DFlag{latex-section} @nonterm{n} --- LaTeX source + @filepath{@|fn|.tex} plus additional @filepath{.tex} files to + be included in the enclosing document's preamble, where the + enclosing document must use the UTF-8 input encoding and T1 + font encoding; use @tt{1} for @nonterm{n} to make the rendered + document a section, @tt{2} for a subsection, etc.} + @item{@DFlag{text} --- plain text in a single file @filepath{@|fn|.txt}, with non-ASCII content encoded as UTF-8} @@ -73,7 +81,7 @@ Use @DFlag{prefix} to specify an alternate format-specific to start of the output file. For HTML output, the starting file specifies the @tt{DOCTYPE} declaration of each output HTML file as a substitute for @filepath{scribble-prefix.html} in the @filepath{scribble} -collection. For Latex (or PDF) output, the the starting file specifies +collection. For Latex (or PDF) output (but not Latex-section output), the starting file specifies the @ltx{documentclass} declaration and initial @ltx{usepackage} declarations as a substitute for @filepath{scribble-prefix.tex} in the @filepath{scribble} collection. See also @racket[html-defaults], @@ -84,7 +92,7 @@ to the build destination, such as an image file that is referenced in the generated output but not included via @racket[image] (which copies the file automatically). -@subsection[#:tag "xref-flags"]{Handling Cross-References} +@section[#:tag "xref-flags"]{Handling Cross-References} Cross references within a document or documents rendered together are always resolved. When cross references span documents that are diff --git a/collects/scriblib/autobib.rkt b/collects/scriblib/autobib.rkt @@ -68,24 +68,27 @@ (loop (cdr keys)))))) ")"))) -(define (add-cites group bib-entries) - (define groups (for/fold ([h (hash)]) ([b (reverse bib-entries)]) - (hash-update h (author-element-names (auto-bib-author b)) - (lambda (cur) (cons b cur)) null))) +(define (add-cites group bib-entries sort?) + (define-values (groups keys) + (for/fold ([h (hash)] [ks null]) ([b (reverse bib-entries)]) + (let ([k (author-element-names (auto-bib-author b))]) + (values (hash-update h k (lambda (cur) (cons b cur)) null) + (cons k (remove k ks)))))) (make-element #f (append (list 'nbsp "(") (add-between - (for/list ([(k v) groups]) - (make-element - #f - (list* - (add-cite group (car v) 'autobib-author #f) - " " - (add-between - (for/list ([b v]) (add-cite group b 'autobib-date #t)) - ", ")))) + (for/list ([k (if sort? (sort keys string-ci<?) keys)]) + (let ([v (hash-ref groups k)]) + (make-element + #f + (list* + (add-cite group (car v) 'autobib-author #f) + " " + (add-between + (for/list ([b v]) (add-cite group b 'autobib-date #t)) + ", "))))) "; ") (list ")")))) @@ -100,8 +103,8 @@ (let* ([author/date<? (lambda (a b) (or - (string<? (extract-bib-key a) (extract-bib-key b)) - (and (string=? (extract-bib-key a) (extract-bib-key b)) + (string-ci<? (extract-bib-key a) (extract-bib-key b)) + (and (string-ci=? (extract-bib-key a) (extract-bib-key b)) (extract-bib-year a) (extract-bib-year b) (< (extract-bib-year a) (extract-bib-year b)))))] [bibs (sort (hash-map (bib-group-ht group) @@ -146,8 +149,8 @@ (define-syntax-rule (define-cite ~cite citet generate-bibliography) (begin (define group (make-bib-group (make-hasheq))) - (define (~cite bib-entry . bib-entries) - (add-cites group (cons bib-entry bib-entries))) + (define (~cite #:sort? [sort? #t] bib-entry . bib-entries) + (add-cites group (cons bib-entry bib-entries) sort?)) (define (citet bib-entry . bib-entries) (add-inline-cite group (cons bib-entry bib-entries))) (define (generate-bibliography #:tag [tag "doc-bibliography"] #:sec-title [sec-title "Bibliography"]) diff --git a/collects/scriblib/scribblings/autobib.scrbl b/collects/scriblib/scribblings/autobib.scrbl @@ -17,10 +17,11 @@ render citations. The function bound to @scheme[~cite-id] produces a citation referring to one or more bibliography entries with a preceding non-breaking -space. It has the contract +space, by default sorting the entries to match the bibliography order. +It has the contract @schemeblock[ -(->* (bib?) () #:rest (listof bib?) element?) +(->* (bib?) (#:sort? any/c) #:rest (listof bib?) element?) ] The function bound to @scheme[citet-id] generates an element suitable