diff --git a/collects/scribble/base-render.ss b/collects/scribble/base-render.ss index d6bab27d..fb220cc8 100644 --- a/collects/scribble/base-render.ss +++ b/collects/scribble/base-render.ss @@ -349,7 +349,7 @@ null (append (render-block (car (flow-paragraphs p)) - part ri start-inline?) + part ri start-inline?) (apply append (map (lambda (p) (render-block p part ri #f)) diff --git a/collects/scribble/html-render.ss b/collects/scribble/html-render.ss index cd2dd883..81aee7e9 100644 --- a/collects/scribble/html-render.ss +++ b/collects/scribble/html-render.ss @@ -238,6 +238,7 @@ ;; user start page) [up-path #f] [style-file #f] + [style-extra-files null] [script-path #f] [script-file #f]) @@ -564,6 +565,7 @@ ,(content->string c this d ri)))] [else `(title)])]) (unless css-path (install-file style-file)) + (for-each (lambda (f) (install-file f)) style-extra-files) (unless script-path (install-file script-file)) (printf "\n" "-//W3C//DTD HTML 4.0 Transitional//EN" @@ -576,6 +578,9 @@ [content "text-html; charset=utf-8"])) ,title ,(scribble-css-contents style-file css-path) + ,@(map (lambda (style-file) + (scribble-css-contents style-file css-path)) + style-extra-files) ,(scribble-js-contents script-file script-path)) (body () ,@(render-toc-view d ri) @@ -974,11 +979,12 @@ [as (cdr (or (t-style-get 'alignment) (cons #f (map (lambda (x) #f) flows))))] [vas (cdr (or (t-style-get 'valignment) - (cons #f (map (lambda (x) #f) flows))))]) + (cons #f (map (lambda (x) #f) flows))))] + [first? #t]) (cond [(null? ds) null] [(eq? (car ds) 'cont) - (loop (cdr ds) (cdr as) (cdr vas))] + (loop (cdr ds) (cdr as) (cdr vas) first?)] [else (let ([d (car ds)] [a (car as)] [va (car vas)]) (cons @@ -1003,7 +1009,7 @@ [else n])))]) null)) ,@(render-flow d part ri #f)) - (loop (cdr ds) (cdr as) (cdr vas))))])))) + (loop (cdr ds) (cdr as) (cdr vas) #f)))])))) `((table ([cellspacing "0"] ,@(if need-inline? '([style "display: inline-table; vertical-align: text-top;"]) @@ -1018,10 +1024,12 @@ (if (and a (string? (cadr a))) `([class ,(cadr a)]) null)) ,@(if (string? t-style) `([class ,t-style]) null) ,@(style->attribs raw-style)) - ,@(map make-row - (table-flowss t) - (cdr (or (t-style-get 'row-styles) - (cons #f (map (lambda (x) #f) (table-flowss t))))))))) + ,@(if (null? (table-flowss t)) + `((tr (td))) + (map make-row + (table-flowss t) + (cdr (or (t-style-get 'row-styles) + (cons #f (map (lambda (x) #f) (table-flowss t)))))))))) (define/override (render-blockquote t part ri) `((blockquote ,(if (string? (blockquote-style t)) diff --git a/collects/scribble/latex-render.ss b/collects/scribble/latex-render.ss index b52d1bb0..b0daf780 100644 --- a/collects/scribble/latex-render.ss +++ b/collects/scribble/latex-render.ss @@ -19,7 +19,8 @@ (define (render-mixin %) (class % - (init-field [style-file #f]) + (init-field [style-file #f] + [style-extra-files null]) (define/override (get-suffix) #".tex") @@ -31,9 +32,12 @@ (define/override (render-one d ri fn) (let ([style-file (or style-file scribble-tex)]) - (with-input-from-file style-file - (lambda () - (copy-port (current-input-port) (current-output-port)))) + (for-each + (lambda (style-file) + (with-input-from-file style-file + (lambda () + (copy-port (current-input-port) (current-output-port))))) + (cons style-file style-extra-files)) (printf "\\begin{document}\n\\preDoc\n") (when (part-title-content d) (let ([m (ormap (lambda (v) @@ -280,7 +284,7 @@ (loop (cdr flows) (add1 n))] [else n]))]) (unless (= cnt 1) (printf "\\multicolumn{~a}{l}{" cnt)) - (render-flow (car flows) part ri #f) + (render-table-flow (car flows) part ri) (unless (= cnt 1) (printf "}")) (unless (null? (list-tail flows cnt)) (printf " &\n")))) (unless (null? (cdr flows)) (loop (cdr flows))))) @@ -295,6 +299,24 @@ tableform))))) null) + (define/private (render-table-flow p part ri) + ;; Emit a \\ between blocks: + (let loop ([ps (flow-paragraphs p)]) + (cond + [(null? ps) (void)] + [else + (let ([minipage? (not (or (paragraph? (car ps)) + (table? (car ps))))]) + (when minipage? + (printf "\\begin{minipage}{\\linewidth}\n")) + (render-block (car ps) part ri #f) + (when minipage? + (printf " \\end{minipage}\n")) + (unless (null? (cdr ps)) + (printf " \\\\\n") + (loop (cdr ps))))])) + null) + (define/override (render-itemization t part ri) (printf "\n\n\\begin{itemize}\n") (for ([flow (itemization-flows t)]) diff --git a/collects/scribble/manual.ss b/collects/scribble/manual.ss index e4af7d94..bffe72fc 100644 --- a/collects/scribble/manual.ss +++ b/collects/scribble/manual.ss @@ -1912,7 +1912,7 @@ (make-a-bib-entry key (make-element - #f + "bibentry" (append (if author `(,@(decode-content (list author)) ", ") null) (if is-book? null '(ldquo)) diff --git a/collects/scribble/run.ss b/collects/scribble/run.ss index e2bd9ccf..e79b6f71 100644 --- a/collects/scribble/run.ss +++ b/collects/scribble/run.ss @@ -34,6 +34,8 @@ (make-parameter null)) (define current-style-file (make-parameter #f)) + (define current-style-extra-files + (make-parameter null)) (define current-redirect (make-parameter #f)) @@ -63,7 +65,7 @@ (current-dest-directory dir)] [("--dest-name") name "write output as " (current-dest-name name)] - [("--style") file "use given .css/.tex file" + [("--style") file "use given base .css/.tex file" (current-style-file file)] [("--redirect") url "redirect external tag links to " (current-redirect url)] @@ -86,7 +88,9 @@ "bad procedure identifier for ++ref-in: ~s" proc-id)) (current-xref-input-modules - (cons (cons mod id) (current-xref-input-modules))))]] + (cons (cons mod id) (current-xref-input-modules))))] + [("++style") file "add given .css/.tex file" + (current-style-extra-files (cons file (current-style-extra-files)))]] [args (file . another-file) (cons file another-file)])) (define (build-docs-files files) @@ -102,7 +106,8 @@ (let ([renderer (new ((current-render-mixin) render%) [dest-dir dir] - [style-file (current-style-file)])]) + [style-file (current-style-file)] + [style-extra-files (reverse (current-style-extra-files))])]) (when (current-redirect) (send renderer set-external-tag-path (current-redirect))) (send renderer report-output!) diff --git a/collects/scribble/scribble.css b/collects/scribble/scribble.css index d40e5602..12b717de 100644 --- a/collects/scribble/scribble.css +++ b/collects/scribble/scribble.css @@ -32,6 +32,14 @@ h3, h4, h5, h6, h7, h8 { margin-bottom: 0.5em; } +/* Needed for browsers like Opera, and eventually for HTML 4 conformance. + This means that multiple paragraphs in a table element do not have a space + between them. */ +table p { + margin-top: 0; + margin-bottom: 0; +} + /* ---------------------------------------- */ /* Main */ diff --git a/collects/scribble/scribble.tex b/collects/scribble/scribble.tex index 1ea92c57..d3147abc 100644 --- a/collects/scribble/scribble.tex +++ b/collects/scribble/scribble.tex @@ -82,6 +82,8 @@ \newenvironment{leftindent}{\begin{quote}}{\end{quote}} \newenvironment{insetpara}{\begin{quote}}{\end{quote}} +\newenvironment{bibentry}[1]{\parbox[t]{0.8\linewidth}{#1}} + \newenvironment{bigtabular}{\begin{longtable}}{\end{longtable}\vspace{-3ex}} \newcommand{\bigtabline}{\vspace{-2ex}} diff --git a/collects/scribblings/scribble/struct.scrbl b/collects/scribblings/scribble/struct.scrbl index 07e10ec8..8923b1e5 100644 --- a/collects/scribblings/scribble/struct.scrbl +++ b/collects/scribblings/scribble/struct.scrbl @@ -362,6 +362,16 @@ the table can span multiple columns by using @scheme['cont] instead of a flow in the following columns (i.e., for all but the first in a set of cells that contain a single flow). +When a table cell's flow has multiple paragraphs, the rendered output +starts each paragraph on its own line, but generally doesn't insert +space between the paragraphs (as it would at the top level). For Latex +output, individual paragraphs are not automatically line-wrapped; to +get a line-wrapped paragraph, use an element with a string style and +define a corresponding Latex macro in terms of @tt{parbox}. For Latex +output of blocks in the flow that are @scheme[blockquote]s, +@scheme[itemization]s, or @scheme[delayed-block]s, the block is +wrapped with @tt{minipage} using @tt{linewidth} as the width. + The @scheme[style] can be any of the following: @itemize[