From c06213e9c7caddd4a4ed5b1f90aa59b9a038df63 Mon Sep 17 00:00:00 2001 From: Robby Findler Date: Tue, 10 May 2011 11:07:41 -0500 Subject: [PATCH] added the scribble/lncs language original commit: a1217107b26359a13f642798570c4f7a2efb2303 --- collects/scribble/lncs/lang.rkt | 101 ++++++++++++++------ collects/scribble/lncs/lncs.tex | 11 +++ collects/scribblings/scribble/decode.scrbl | 4 +- collects/scribblings/scribble/generic.scrbl | 1 + collects/scribblings/scribble/lncs.scrbl | 57 +++++++++++ 5 files changed, 141 insertions(+), 33 deletions(-) create mode 100644 collects/scribblings/scribble/lncs.scrbl diff --git a/collects/scribble/lncs/lang.rkt b/collects/scribble/lncs/lang.rkt index c2e6d959..b7d19db3 100644 --- a/collects/scribble/lncs/lang.rkt +++ b/collects/scribble/lncs/lang.rkt @@ -2,23 +2,39 @@ (require scribble/doclang scribble/core (except-in scribble/base author) + (prefix-in s/b: scribble/base) scribble/decode "../private/defaults.ss" (for-syntax racket/base racket/list) setup/main-collects scribble/html-properties - scribble/latex-properties) + scribble/latex-properties + racket/stxparam + (for-syntax racket/stxparam-exptime + racket/base + setup/dirs)) (provide (except-out (all-from-out scribble/doclang) #%module-begin) (all-from-out scribble/base) (rename-out [module-begin #%module-begin]) abstract include-abstract authors author - affiliation affiliation-mark affiliation-sep - maketitle) + institute institutes + email) -;; No options, currently, but keep in case we want to support some: (define-syntax (module-begin stx) + (unless (file-exists? (collection-file-path "llncs.cls" "scribble" "lncs")) + (define cd (find-collects-dir)) + (raise-syntax-error 'scribble/lncs + (format "Please download the llncs.cls file (in llncs2e.zip) and put it in this directory:\n ~a~a" + (build-path (find-user-collects-dir) + "scribble" "lncs") + (if cd + (format "\nor in this one:\n ~a" + (build-path cd "scribble" "lncs")) + "")) + #f)) + ;; No options, currently, but keep in case we want to support some: (syntax-case* stx () (lambda (a b) (eq? (syntax-e a) (syntax-e b))) [(_ id ws . body) ;; Skip intraline whitespace to find options: @@ -30,14 +46,12 @@ (define ((post-process) doc) (add-defaults doc - (string->bytes/utf-8 - "\\documentclass{llncs}\n") ; (format "\\documentclass{llncs}\n\\usepackage{times}\n\\usepackage{qcourier}\n")) + (string->bytes/utf-8 "\\documentclass{llncs}\n") (scribble-file "lncs/style.tex") (list (scribble-file "lncs/llncs.cls")) #f)) - -(define jfp-extras +(define lncs-extras (let ([abs (lambda (s) (path->main-collects-relative (collection-file-path s "scribble" "lncs")))]) @@ -48,7 +62,7 @@ ;; ---------------------------------------- ;; Abstracts: -(define abstract-style (make-style "abstract" jfp-extras)) +(define abstract-style (make-style "abstract" lncs-extras)) (define (abstract . strs) (make-nested-flow @@ -77,31 +91,56 @@ (define-syntax (authors stx) (syntax-case stx (author) [(_ (author . args) ...) - #`(make-element (style "author" '()) - (decode-content - (list - #,@(apply - append - (add-between - (for/list ([stx (in-list (syntax->list #'(args ...)))]) - (syntax-case stx () - [(#:inst string rest ...) - (append (syntax->list #'(rest ...)) - (list #'(element (style "inst" '()) (decode-content (list string)))))] - [(rest ...) - (syntax->list #'(rest ...))])) - (list #'(element (style "and" '()) '())))))))] + #`(paragraph + (style 'author '()) + (make-element (style "LNCSauthor" lncs-extras) + (decode-content + (list + #,@(apply + append + (add-between + (for/list ([stx (in-list (syntax->list #'(args ...)))]) + (syntax-case stx () + [(#:inst string rest ...) + (append (syntax->list #'(rest ...)) + (list #'(element (style "LNCSinst" lncs-extras) (decode-content (list string)))))] + [(rest ...) + (syntax->list #'(rest ...))])) + (list #'(element (style "LNCSand" lncs-extras) '()))))))))] [(_ . rest) (raise-syntax-error 'authors "expected a sequence of authors" stx)])) -(define (maketitle) - (element (style "maketitle" jfp-extras) '())) -(define (affiliation . txt) - (make-element (make-style "Affiliation" jfp-extras) (decode-content txt))) +(define-syntax-parameter email-ok #f) -(define (affiliation-mark . txt) - (make-element (make-style "MarkSuperscript" jfp-extras) (decode-content txt))) +(define-syntax (institute stx) + (raise-syntax-error #f "can only be used inside 'institutes'" stx)) +(define-syntax (institutes stx) + (syntax-case stx (author) + [(_ (inst . args) ...) + #`(syntax-parameterize + ((email-ok #t)) + (paragraph + (style 'author '()) + (make-element (style "LNCSinstitutes" lncs-extras) + (decode-content + (list + #,@(apply + append + (add-between + (for/list ([stx (in-list (syntax->list #'(args ...)))]) + (syntax-case stx () + [(rest ...) + (syntax->list #'(rest ...))])) + (list #'(element (style "LNCSand" lncs-extras) '())))))))))] + [(_ . rest) + (raise-syntax-error 'institutes "expected a sequence of institutes" stx)])) -(define (affiliation-sep) - (hspace 2)) +(define-syntax (email stx) + (syntax-case stx () + [(_ . args) + (begin + (unless (syntax-parameter-value #'email-ok) + (raise-syntax-error 'email "email can appear inside institutes only")) + #'(make-element (style "LNCSemail" lncs-extras) + (decode-content (list . args))))])) diff --git a/collects/scribble/lncs/lncs.tex b/collects/scribble/lncs/lncs.tex index e69de29b..6125813c 100644 --- a/collects/scribble/lncs/lncs.tex +++ b/collects/scribble/lncs/lncs.tex @@ -0,0 +1,11 @@ +\newcommand{\LNCSand}{\and} + +\newcommand{\LNCSauthor}[1]{\author{#1}} +\newcommand{\LNCSinst}[1]{\inst{#1}} + +\newcommand{\LNCSinstitutes}[1]{\institute{#1}} +\newcommand{\LNCSinstitute}[1]{#1} + +\newcommand{\LNCSemail}[1]{\email{#1}} + +\renewcommand{\SAuthorSep}{} diff --git a/collects/scribblings/scribble/decode.scrbl b/collects/scribblings/scribble/decode.scrbl index 4c18231d..1b41d65a 100644 --- a/collects/scribblings/scribble/decode.scrbl +++ b/collects/scribblings/scribble/decode.scrbl @@ -162,8 +162,8 @@ otherwise. [style any/c] [content content?])]{ -See @racket[decode] and @racket[decode-part]. The @racket[tag-prefix] -and @racket[style] fields are propagated to the resulting +See @racket[decode] and @racket[decode-part]. The @racket[_tag-prefix] +and @racket[_style] fields are propagated to the resulting @racket[part]. } diff --git a/collects/scribblings/scribble/generic.scrbl b/collects/scribblings/scribble/generic.scrbl index d192ea9b..36e38454 100644 --- a/collects/scribblings/scribble/generic.scrbl +++ b/collects/scribblings/scribble/generic.scrbl @@ -9,4 +9,5 @@ @include-section["manual-stub.scrbl"] @include-section["sigplan.scrbl"] @include-section["jfp.scrbl"] +@include-section["lncs.scrbl"] diff --git a/collects/scribblings/scribble/lncs.scrbl b/collects/scribblings/scribble/lncs.scrbl new file mode 100644 index 00000000..07f74134 --- /dev/null +++ b/collects/scribblings/scribble/lncs.scrbl @@ -0,0 +1,57 @@ +#lang scribble/manual +@(require (except-in "utils.ss" author) + (for-label scribble/lncs)) + +@(define-syntax-rule (def base-author) + (begin + (require (for-label scribble/base)) + (define base-author @racket[author]))) +@(def base-author) + +@title{LNCS Paper Format} + +@defmodulelang[scribble/lncs #:use-sources (scribble/lncs/lang)]{ + The @racketmodname[scribble/lncs] +language is like @racketmodname[scribble/manual], but configured with +Latex style defaults to use the @filepath{llncs.cls} class +file. + +The class file must be downloaded from Springer and installed +into the @racket[scribble/lncs] collection directory. (Run a module +in the language @racketmodname[scribble/lncs] to learn the precise paths +where the file may go.) +} + +@defproc[(abstract [pre-content pre-content?] ...) block?]{ + +Generates a @tech{nested flow} for a paper abstract.} + +@defform[(include-abstract module-path)]{ + +Similar to @racket[include-section], but incorporates the document in the +specified module as an abstract. The document must have no title or +sub-parts.} + +@defform/subs[(authors auth ...) + ([auth (author pre-content-expr ...) + (author #:inst str-expr pre-content-expr ...)]) + #:contracts ([pre-content-expr pre-content?] + [str-expr string?])]{ + +A replacement for @base-author from @racketmodname[scribble/base]. + +The @racket[#:inst] should be a number that matches up to one of the +arguments to @racket[institutes]. +} + + +@defform[(institutes (institute pre-content-expr ...) ...) + #:contracts ([pre-content-expr pre-content?])]{ + +The @racket[pre-content-expr]s are used as the institutions of the authors. + +} + +@defform[(email pre-content-expr ...)]{ + Specifies an email address; must be used inside @racket[institute]. +}