Blob Blame History Raw
;; $Id: dbttlpg.dsl,v 1.13 2004/10/10 21:15:06 petere78 Exp $
;;
;; This file is part of the Modular DocBook Stylesheet distribution.
;; See ../README or http://nwalsh.com/docbook/dsssl/
;;

(define (have-sibling? sibling-gi #!optional (node (current-node)))
  (let loop ((nl (children (parent node))))
    (if (node-list-empty? nl) 
	#f
	(if (equal? (gi (node-list-first nl)) sibling-gi)
	    #t
	    (loop (node-list-rest nl))))))

(define (titlepage-content? elements gis)
  (let giloop ((gilist gis))
    (if (null? gilist)
	#f
	(if (not (node-list-empty? (node-list-filter-by-gi 
				    elements 
				    (list (car gilist)))))
	    #t
	    (giloop (cdr gilist))))))

(define (titlepage-gi-list-by-elements elements nodelist) 
  ;; Elements is a list of GIs.  Nodelist is a list of nodes.
  ;; This function returns all of the nodes in nodelist that
  ;; are in elements in the order they occur in elements.
  (let loop ((gilist elements) (rlist (empty-node-list)))
    (if (null? gilist)
	rlist
	(loop (cdr gilist) 
	      (node-list rlist (node-list-filter-by-gi 
				nodelist (list (car gilist))))))))

(define (titlepage-gi-list-by-nodelist elements nodelist) 
  ;; Elements is a list of GIs.  Nodelist is a list of nodes.
  ;; This function returns all of the nodes in nodelist that
  ;; are in elements in the order they occur in nodelist.
  (let loop ((nl nodelist) (rlist (empty-node-list)))
    (if (node-list-empty? nl)
	rlist
	(if (member (gi (node-list-first nl)) elements)
	    (loop (node-list-rest nl)
		  (node-list rlist (node-list-first nl)))
	    (loop (node-list-rest nl) rlist)))))

(define (titlepage-nodelist elements nodelist)
  ;; We expand BOOKBIBLIO, BIBLIOMISC, and BIBLIOSET in the element
  ;; list because that level of wrapper usually isn't significant.
  (let ((exp-nodelist (expand-children nodelist (list (normalize "bookbiblio") 
						      (normalize "bibliomisc")
						      (normalize "biblioset")))))
    (if %titlepage-in-info-order%
	(titlepage-gi-list-by-nodelist elements exp-nodelist)
	(titlepage-gi-list-by-elements elements exp-nodelist))))

(mode titlepage-address-mode
  (default (process-children)))

;; == Title pages for SETs ==============================================

(define (set-titlepage-recto-elements)
  (list (normalize "title") 
	(normalize "subtitle") 
	(normalize "graphic") 
	(normalize "mediaobject")
	(normalize "corpauthor") 
	(normalize "authorgroup") 
	(normalize "author") 
	(normalize "editor")))

(define (set-titlepage-verso-elements)
  (list (normalize "title") 
	(normalize "subtitle") 
	(normalize "corpauthor") 
	(normalize "authorgroup") 
	(normalize "author") 
	(normalize "editor")
	(normalize "edition") 
	(normalize "pubdate") 
	(normalize "copyright")
	(normalize "legalnotice") 
	(normalize "revhistory")))

(define (set-titlepage-content? elements side)
  (titlepage-content? elements (if (equal? side 'recto)
				   (set-titlepage-recto-elements)
				   (set-titlepage-verso-elements))))

(define (set-titlepage elements #!optional (side 'recto))
  (let ((nodelist (titlepage-nodelist 
		   (if (equal? side 'recto)
		       (set-titlepage-recto-elements)
		       (set-titlepage-verso-elements))
		   elements)))
;;    (make simple-page-sequence
;;      page-n-columns: %titlepage-n-columns%
;;      input-whitespace-treatment: 'collapse
;;      use: default-text-style
      (make sequence

      ;; This hack is required for the RTF backend. If an external-graphic
      ;; is the first thing on the page, RTF doesn't seem to do the right
      ;; thing (the graphic winds up on the baseline of the first line
      ;; of the page, left justified).  This "one point rule" fixes
      ;; that problem.
      (make paragraph
	line-spacing: 1pt
	(literal ""))

      (let loop ((nl nodelist) (lastnode (empty-node-list)))
	(if (node-list-empty? nl)
	    (empty-sosofo)
	    (make sequence
	      (if (or (node-list-empty? lastnode)
		      (not (equal? (gi (node-list-first nl))
				   (gi lastnode))))
		  (set-titlepage-before (node-list-first nl) side)
		  (empty-sosofo))
	      (cond
		((equal? (gi (node-list-first nl)) (normalize "abbrev"))
		 (set-titlepage-abbrev (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "abstract"))
		 (set-titlepage-abstract (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "address"))
		 (set-titlepage-address (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "affiliation"))
		 (set-titlepage-affiliation (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "artpagenums"))
		 (set-titlepage-artpagenums (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "author"))
		 (set-titlepage-author (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "authorblurb"))
		 (set-titlepage-authorblurb (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "authorgroup"))
		 (set-titlepage-authorgroup (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "authorinitials"))
		 (set-titlepage-authorinitials (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "bibliomisc"))
		 (set-titlepage-bibliomisc (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "biblioset"))
		 (set-titlepage-biblioset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "bookbiblio"))
		 (set-titlepage-bookbiblio (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "citetitle"))
		 (set-titlepage-citetitle (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "collab"))
		 (set-titlepage-collab (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "confgroup"))
		 (set-titlepage-confgroup (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "contractnum"))
		 (set-titlepage-contractnum (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "contractsponsor"))
		 (set-titlepage-contractsponsor (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "contrib"))
		 (set-titlepage-contrib (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "copyright"))
		 (set-titlepage-copyright (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "corpauthor"))
		 (set-titlepage-corpauthor (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "corpname"))
		 (set-titlepage-corpname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "date"))
		 (set-titlepage-date (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "edition"))
		 (set-titlepage-edition (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "editor"))
		 (set-titlepage-editor (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "firstname"))
		 (set-titlepage-firstname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "graphic"))
		 (set-titlepage-graphic (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "honorific"))
		 (set-titlepage-honorific (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "indexterm"))
		 (set-titlepage-indexterm (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "invpartnumber"))
		 (set-titlepage-invpartnumber (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "isbn"))
		 (set-titlepage-isbn (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "issn"))
		 (set-titlepage-issn (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "issuenum"))
		 (set-titlepage-issuenum (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "itermset"))
		 (set-titlepage-itermset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "keywordset"))
		 (set-titlepage-keywordset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "legalnotice"))
		 (set-titlepage-legalnotice (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "lineage"))
		 (set-titlepage-lineage (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "mediaobject"))
		 (set-titlepage-mediaobject (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "modespec"))
		 (set-titlepage-modespec (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "orgname"))
		 (set-titlepage-orgname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "othercredit"))
		 (set-titlepage-othercredit (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "othername"))
		 (set-titlepage-othername (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "pagenums"))
		 (set-titlepage-pagenums (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "printhistory"))
		 (set-titlepage-printhistory (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "productname"))
		 (set-titlepage-productname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "productnumber"))
		 (set-titlepage-productnumber (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "pubdate"))
		 (set-titlepage-pubdate (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "publisher"))
		 (set-titlepage-publisher (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "publishername"))
		 (set-titlepage-publishername (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "pubsnumber"))
		 (set-titlepage-pubsnumber (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "releaseinfo"))
		 (set-titlepage-releaseinfo (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "revhistory"))
		 (set-titlepage-revhistory (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "seriesinfo"))
		 (set-titlepage-seriesinfo (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "seriesvolnums"))
		 (set-titlepage-seriesvolnums (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "subjectset"))
		 (set-titlepage-subjectset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "subtitle"))
		 (set-titlepage-subtitle (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "surname"))
		 (set-titlepage-surname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "title"))
		 (set-titlepage-title (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "titleabbrev"))
		 (set-titlepage-titleabbrev (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "volumenum"))
		 (set-titlepage-volumenum (node-list-first nl) side))
		(else
		 (set-titlepage-default (node-list-first nl) side)))
	      (loop (node-list-rest nl) (node-list-first nl))))))))

(define (set-titlepage-before node side)
  (if (equal? side 'recto)
      (cond
       ((equal? (gi node) (normalize "corpauthor"))
	(make paragraph
	  space-after: (* (HSIZE 5) %head-after-factor% 8)
	  (literal "\no-break-space;")))
       ((equal? (gi node) (normalize "authorgroup"))
	(if (have-sibling? (normalize "corpauthor") node)
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       ((equal? (gi node) (normalize "author"))
	(if (or (have-sibling? (normalize "corpauthor") node) 
		(have-sibling? (normalize "authorgroup") node))
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       (else (empty-sosofo)))
      (empty-sosofo)))

(define (set-titlepage-default node side)
  (let ((foo (debug (string-append "No set-titlepage-* for " (gi node) "!"))))
    (empty-sosofo)))

(define (set-titlepage-element node side)
  (if (equal? side 'recto)
      (with-mode set-titlepage-recto-mode
	(process-node-list node))
      (with-mode set-titlepage-verso-mode
	(process-node-list node))))

(define (set-titlepage-abbrev node side)
  (set-titlepage-element node side))
(define (set-titlepage-abstract node side)
  (set-titlepage-element node side))
(define (set-titlepage-address node side)
  (set-titlepage-element node side))
(define (set-titlepage-affiliation node side)
  (set-titlepage-element node side))
(define (set-titlepage-artpagenums node side)
  (set-titlepage-element node side))
(define (set-titlepage-author node side)
  (set-titlepage-element node side))
(define (set-titlepage-authorblurb node side)
  (set-titlepage-element node side))
(define (set-titlepage-authorgroup node side)
  (set-titlepage-element node side))
(define (set-titlepage-authorinitials node side)
  (set-titlepage-element node side))
(define (set-titlepage-bibliomisc node side)
  (set-titlepage-element node side))
(define (set-titlepage-biblioset node side)
  (set-titlepage node side))
(define (set-titlepage-bookbiblio node side)
  (set-titlepage node side))
(define (set-titlepage-citetitle node side)
  (set-titlepage-element node side))
(define (set-titlepage-collab node side)
  (set-titlepage-element node side))
(define (set-titlepage-confgroup node side)
  (set-titlepage-element node side))
(define (set-titlepage-contractnum node side)
  (set-titlepage-element node side))
(define (set-titlepage-contractsponsor node side)
  (set-titlepage-element node side))
(define (set-titlepage-contrib  node side)
  (set-titlepage-element node side))
(define (set-titlepage-copyright node side)
  (set-titlepage-element node side))

(define (set-titlepage-corpauthor node side)
  (if (equal? side 'recto)
      (set-titlepage-element node side)
      (if (first-sibling? node)
	  (make paragraph
	    (with-mode set-titlepage-verso-mode
	      (process-node-list
	       (select-elements (children (parent node))
				(normalize "corpauthor")))))
	  (empty-sosofo))))

(define (set-titlepage-corpname node side)
  (set-titlepage-element node side))
(define (set-titlepage-date node side)
  (set-titlepage-element node side))
(define (set-titlepage-edition node side)
  (set-titlepage-element node side))
(define (set-titlepage-editor node side)
  (set-titlepage-element node side))
(define (set-titlepage-firstname node side)
  (set-titlepage-element node side))
(define (set-titlepage-graphic node side)
  (set-titlepage-element node side))
(define (set-titlepage-honorific node side)
  (set-titlepage-element node side))
(define (set-titlepage-indexterm node side)
  (set-titlepage-element node side))
(define (set-titlepage-invpartnumber node side)
  (set-titlepage-element node side))
(define (set-titlepage-isbn node side)
  (set-titlepage-element node side))
(define (set-titlepage-issn node side)
  (set-titlepage-element node side))
(define (set-titlepage-issuenum node side)
  (set-titlepage-element node side))
(define (set-titlepage-itermset node side)
  (set-titlepage-element node side))
(define (set-titlepage-keywordset node side)
  (set-titlepage-element node side))
(define (set-titlepage-legalnotice node side)
  (set-titlepage-element node side))
(define (set-titlepage-lineage node side)
  (set-titlepage-element node side))
(define (set-titlepage-mediaobject node side)
  (set-titlepage-element node side))
(define (set-titlepage-modespec node side)
  (set-titlepage-element node side))
(define (set-titlepage-orgname node side)
  (set-titlepage-element node side))
(define (set-titlepage-othercredit node side)
  (set-titlepage-element node side))
(define (set-titlepage-othername node side)
  (set-titlepage-element node side))
(define (set-titlepage-pagenums node side)
  (set-titlepage-element node side))
(define (set-titlepage-printhistory node side)
  (set-titlepage-element node side))
(define (set-titlepage-productname node side)
  (set-titlepage-element node side))
(define (set-titlepage-productnumber node side)
  (set-titlepage-element node side))
(define (set-titlepage-pubdate node side)
  (set-titlepage-element node side))
(define (set-titlepage-publisher node side)
  (set-titlepage-element node side))
(define (set-titlepage-publishername node side)
  (set-titlepage-element node side))
(define (set-titlepage-pubsnumber node side)
  (set-titlepage-element node side))
(define (set-titlepage-releaseinfo node side)
  (set-titlepage-element node side))
(define (set-titlepage-revhistory node side)
  (set-titlepage-element node side))
(define (set-titlepage-seriesinfo node side)
  (set-titlepage-element node side))
(define (set-titlepage-seriesvolnums node side)
  (set-titlepage-element node side))
(define (set-titlepage-subjectset node side)
  (set-titlepage-element node side))
(define (set-titlepage-subtitle node side)
  (set-titlepage-element node side))
(define (set-titlepage-surname node side)
  (set-titlepage-element node side))
(define (set-titlepage-title node side)
  (set-titlepage-element node side))
(define (set-titlepage-titleabbrev node side)
  (set-titlepage-element node side))
(define (set-titlepage-volumenum node side)
  (set-titlepage-element node side))

(define set-titlepage-recto-style
  (style
      font-family-name: %title-font-family%
      font-weight: 'bold
      font-size: (HSIZE 1)))

(define set-titlepage-verso-style
  (style
      font-family-name: %body-font-family%))

(mode set-titlepage-recto-mode
  (element abbrev
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element abstract
    (make display-group
      use: set-titlepage-recto-style
      quadding: 'start
      ($semiformal-object$)))

  (element (abstract title) (empty-sosofo))

  (element (abstract para)
    (make paragraph
      use: set-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element address 
    (make display-group
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make display-group
      use: set-titlepage-recto-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element author
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
          use: set-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element authorblurb
    (make display-group
      use: set-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element (authorblurb para)
    (make paragraph
      use: set-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element authorgroup
    (make display-group
      (process-children)))

  (element authorinitials
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element confgroup
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractnum
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contrib
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element copyright
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      space-before: (* (HSIZE 2) %head-before-factor%)
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))
  
  (element (copyright holder) ($charseq$))

  (element corpauthor
    (make sequence
      (make paragraph
	use: set-titlepage-recto-style
	font-size: (HSIZE 3)
	line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	space-before: (* (HSIZE 2) %head-before-factor%)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(process-children))
      ;; This paragraph is a hack to get the spacing right.
      ;; Authors always have an affiliation paragraph below them, even if
      ;; it's empty, so corpauthors need one too.
      (make paragraph
	use: set-titlepage-recto-style
	font-size: (HSIZE 1)
	line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	space-after: (* (HSIZE 2) %head-after-factor% 4)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(literal "\no-break-space;"))))

  (element corpname
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element date
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element edition
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    (let ((editor-name (author-string)))
      (make sequence      
	(if (first-sibling?) 
	    (make paragraph
	      use: set-titlepage-recto-style
	      font-size: (HSIZE 1)
	      line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	      space-before: (* (HSIZE 2) %head-before-factor% 6)
	      quadding: %division-title-quadding%
	      keep-with-next?: #t
	      (literal (gentext-edited-by)))
	    (empty-sosofo))
	(make paragraph
	  use: set-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-after: (* (HSIZE 2) %head-after-factor% 4)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal editor-name)))))

  (element firstname
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'center)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element isbn
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issn
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issuenum
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element jobtitle
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: set-titlepage-recto-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para)
    (make paragraph
      use: set-titlepage-recto-style
      quadding: 'start
      line-spacing: (* 0.8 (inherited-line-spacing))
      font-size: (* 0.8 (inherited-font-size))
      (process-children)))

  (element lineage
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element orgname
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element othercredit
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
          use: set-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element othername
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pagenums
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element printhistory
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productname
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productnumber
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubdate
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publisher
    (make display-group
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publishername
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: set-titlepage-recto-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: set-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: set-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: set-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: set-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: set-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		(else (empty-sosofo))))))))
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element shortaffil
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle 
    (make paragraph
      use: set-titlepage-recto-style
      font-size: (HSIZE 4)
      line-spacing: (* (HSIZE 4) %line-spacing-factor%)
      space-before: (* (HSIZE 4) %head-before-factor%)
      quadding: %division-subtitle-quadding%
      keep-with-next?: #t
      (process-children-trim)))

  (element surname
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element title 
    (make paragraph
      use: set-titlepage-recto-style
      font-size: (HSIZE 5)
      line-spacing: (* (HSIZE 5) %line-spacing-factor%)
      space-before: (* (HSIZE 5) %head-before-factor%)
      quadding: %division-title-quadding%
      keep-with-next?: #t
      heading-level: (if %generate-heading-level% 1 0)
      (with-mode title-mode
	(process-children-trim))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: set-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))
)

(mode set-titlepage-verso-mode
  (element abbrev
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element abstract ($semiformal-object$))

  (element (abstract title) (empty-sosofo))

  (element address 
    (make display-group
      use: set-titlepage-verso-style
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element author
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element authorblurb
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element authorgroup
    (make paragraph
      space-after: (* %bf-size% %line-spacing-factor%)
      (make sequence
	(literal (gentext-by))
	(literal "\no-break-space;")
	(process-children-trim))))

  (element authorinitials
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element confgroup
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element contractnum
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element contrib
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element copyright
    (make paragraph
      use: set-titlepage-verso-style
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    ;; note: set-titlepage-corpauthor takes care of wrapping multiple
    ;; corpauthors
    (make sequence
      (if (first-sibling?)
	  (if (equal? (gi (parent (current-node))) (normalize "authorgroup"))
	      (empty-sosofo)
	      (literal (gentext-by) " "))
	  (literal ", "))
      (process-children)))

  (element corpname
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element date
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element edition
    (make paragraph
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    ;; Print the editor name.
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (or #t (not in-group)) ; nevermind, always put out the Edited by
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-edited-by))
	      (literal "\no-break-space;")
	      (literal (author-string))))
	  (make sequence 
	    (literal (author-string))))))

  (element firstname
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'start)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element isbn
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element issn
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element issuenum
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element jobtitle
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: set-titlepage-verso-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para) 
    (make paragraph
      use: set-titlepage-verso-style
      font-size: (* (inherited-font-size) 0.8)
      (process-children-trim)))

  (element lineage
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element orgname
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element othercredit
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element othername
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element pagenums
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element printhistory
    (make display-group
      use: set-titlepage-verso-style
      (process-children)))

  (element productname
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element productnumber
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element pubdate
    (make paragraph
      (literal (gentext-element-name-space (gi (current-node))))
      (process-children)))

  (element publisher
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element publishername
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: set-titlepage-verso-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: set-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: set-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: set-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: set-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     ;(process-node-list revremark)))
		     (empty-sosofo)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: set-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		(else (empty-sosofo))))))))
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element shortaffil
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (literal (if (first-sibling?) ": " "; "))
      (process-children)))

  (element surname
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

  (element title
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (with-mode title-mode
	(process-children))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: set-titlepage-verso-style
      (process-children)))

)

;; == Title pages for BOOKs =============================================

(define (book-titlepage-recto-elements)
  (list (normalize "title") 
	(normalize "subtitle") 
	(normalize "graphic") 
	(normalize "mediaobject")
	(normalize "corpauthor") 
	(normalize "authorgroup") 
	(normalize "author") 
	(normalize "editor")))

(define (book-titlepage-verso-elements)
  (list (normalize "title") 
	(normalize "subtitle") 
	(normalize "corpauthor") 
	(normalize "authorgroup") 
	(normalize "author") 
	(normalize "editor")
	(normalize "edition") 
	(normalize "pubdate") 
	(normalize "copyright")
	(normalize "abstract") 
	(normalize "legalnotice") 
	(normalize "revhistory")))

(define (book-titlepage-content? elements side)
  (titlepage-content? elements (if (equal? side 'recto)
				   (book-titlepage-recto-elements)
				   (book-titlepage-verso-elements))))

(define (book-titlepage elements #!optional (side 'recto))
  (let ((nodelist (titlepage-nodelist 
		   (if (equal? side 'recto)
		       (book-titlepage-recto-elements)
		       (book-titlepage-verso-elements))
		   elements)))
;;    (make simple-page-sequence
;;      page-n-columns: %titlepage-n-columns%
;;      input-whitespace-treatment: 'collapse
;;      use: default-text-style
      (make sequence

      ;; This hack is required for the RTF backend. If an external-graphic
      ;; is the first thing on the page, RTF doesn't seem to do the right
      ;; thing (the graphic winds up on the baseline of the first line
      ;; of the page, left justified).  This "one point rule" fixes
      ;; that problem.
      (make paragraph
	line-spacing: 1pt
	(literal ""))
      
      (let loop ((nl nodelist) (lastnode (empty-node-list)))
	(if (node-list-empty? nl)
	    (empty-sosofo)
	    (make sequence
	      (if (or (node-list-empty? lastnode)
		      (not (equal? (gi (node-list-first nl))
				   (gi lastnode))))
		  (book-titlepage-before (node-list-first nl) side)
		  (empty-sosofo))
	      (cond
		((equal? (gi (node-list-first nl)) (normalize "abbrev"))
		 (book-titlepage-abbrev (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "abstract"))
		 (book-titlepage-abstract (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "address"))
		 (book-titlepage-address (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "affiliation"))
		 (book-titlepage-affiliation (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "artpagenums"))
		 (book-titlepage-artpagenums (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "author"))
		 (book-titlepage-author (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "authorblurb"))
		 (book-titlepage-authorblurb (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "authorgroup"))
		 (book-titlepage-authorgroup (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "authorinitials"))
		 (book-titlepage-authorinitials (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "bibliomisc"))
		 (book-titlepage-bibliomisc (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "biblioset"))
		 (book-titlepage-biblioset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "bookbiblio"))
		 (book-titlepage-bookbiblio (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "citetitle"))
		 (book-titlepage-citetitle (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "collab"))
		 (book-titlepage-collab (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "confgroup"))
		 (book-titlepage-confgroup (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "contractnum"))
		 (book-titlepage-contractnum (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "contractsponsor"))
		 (book-titlepage-contractsponsor (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "contrib"))
		 (book-titlepage-contrib (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "copyright"))
		 (book-titlepage-copyright (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "corpauthor"))
		 (book-titlepage-corpauthor (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "corpname"))
		 (book-titlepage-corpname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "date"))
		 (book-titlepage-date (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "edition"))
		 (book-titlepage-edition (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "editor"))
		 (book-titlepage-editor (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "firstname"))
		 (book-titlepage-firstname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "graphic"))
		 (book-titlepage-graphic (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "honorific"))
		 (book-titlepage-honorific (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "indexterm"))
		 (book-titlepage-indexterm (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "invpartnumber"))
		 (book-titlepage-invpartnumber (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "isbn"))
		 (book-titlepage-isbn (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "issn"))
		 (book-titlepage-issn (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "issuenum"))
		 (book-titlepage-issuenum (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "itermset"))
		 (book-titlepage-itermset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "keywordset"))
		 (book-titlepage-keywordset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "legalnotice"))
		 (book-titlepage-legalnotice (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "lineage"))
		 (book-titlepage-lineage (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "mediaobject"))
		 (book-titlepage-mediaobject (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "modespec"))
		 (book-titlepage-modespec (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "orgname"))
		 (book-titlepage-orgname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "othercredit"))
		 (book-titlepage-othercredit (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "othername"))
		 (book-titlepage-othername (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "pagenums"))
		 (book-titlepage-pagenums (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "printhistory"))
		 (book-titlepage-printhistory (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "productname"))
		 (book-titlepage-productname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "productnumber"))
		 (book-titlepage-productnumber (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "pubdate"))
		 (book-titlepage-pubdate (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "publisher"))
		 (book-titlepage-publisher (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "publishername"))
		 (book-titlepage-publishername (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "pubsnumber"))
		 (book-titlepage-pubsnumber (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "releaseinfo"))
		 (book-titlepage-releaseinfo (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "revhistory"))
		 (book-titlepage-revhistory (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "seriesinfo"))
		 (book-titlepage-seriesinfo (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "seriesvolnums"))
		 (book-titlepage-seriesvolnums (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "subjectset"))
		 (book-titlepage-subjectset (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "subtitle"))
		 (book-titlepage-subtitle (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "surname"))
		 (book-titlepage-surname (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "title"))
		 (book-titlepage-title (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "titleabbrev"))
		 (book-titlepage-titleabbrev (node-list-first nl) side))
		((equal? (gi (node-list-first nl)) (normalize "volumenum"))
		 (book-titlepage-volumenum (node-list-first nl) side))
		(else
		 (book-titlepage-default (node-list-first nl) side)))
	      (loop (node-list-rest nl) (node-list-first nl))))))))

(define (book-titlepage-before node side)
  (if (equal? side 'recto)
      (cond
       ((equal? (gi node) (normalize "corpauthor"))
	(make paragraph
	  space-after: (* (HSIZE 5) %head-after-factor% 8)
	  (literal "\no-break-space;")))
       ((equal? (gi node) (normalize "authorgroup"))
	(if (have-sibling? (normalize "corpauthor") node)
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       ((equal? (gi node) (normalize "author"))
	(if (or (have-sibling? (normalize "corpauthor") node) 
		(have-sibling? (normalize "authorgroup") node))
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       (else (empty-sosofo)))
      (empty-sosofo)))

(define (book-titlepage-default node side)
  (let ((foo (debug (string-append "No book-titlepage-* for " (gi node) "!"))))
    (empty-sosofo)))

(define (book-titlepage-element node side)
  (if (equal? side 'recto)
      (with-mode book-titlepage-recto-mode
	(process-node-list node))
      (with-mode book-titlepage-verso-mode
	(process-node-list node))))

(define (book-titlepage-abbrev node side)
  (book-titlepage-element node side))
(define (book-titlepage-abstract node side)
  (book-titlepage-element node side))
(define (book-titlepage-address node side)
  (book-titlepage-element node side))
(define (book-titlepage-affiliation node side)
  (book-titlepage-element node side))
(define (book-titlepage-artpagenums node side)
  (book-titlepage-element node side))
(define (book-titlepage-author node side)
  (book-titlepage-element node side))
(define (book-titlepage-authorblurb node side)
  (book-titlepage-element node side))
(define (book-titlepage-authorgroup node side)
  (book-titlepage-element node side))
(define (book-titlepage-authorinitials node side)
  (book-titlepage-element node side))
(define (book-titlepage-bibliomisc node side)
  (book-titlepage-element node side))
(define (book-titlepage-biblioset node side)
  (book-titlepage node side))
(define (book-titlepage-bookbiblio node side)
  (book-titlepage node side))
(define (book-titlepage-citetitle node side)
  (book-titlepage-element node side))
(define (book-titlepage-collab node side)
  (book-titlepage-element node side))
(define (book-titlepage-confgroup node side)
  (book-titlepage-element node side))
(define (book-titlepage-contractnum node side)
  (book-titlepage-element node side))
(define (book-titlepage-contractsponsor node side)
  (book-titlepage-element node side))
(define (book-titlepage-contrib  node side)
  (book-titlepage-element node side))
(define (book-titlepage-copyright node side)
  (book-titlepage-element node side))

(define (book-titlepage-corpauthor node side)
  (if (equal? side 'recto)
      (book-titlepage-element node side)
      (if (first-sibling? node)
	  (make paragraph
	    (with-mode book-titlepage-verso-mode
	      (process-node-list
	       (select-elements (children (parent node)) 
				(normalize "corpauthor")))))
	  (empty-sosofo))))

(define (book-titlepage-corpname node side)
  (book-titlepage-element node side))
(define (book-titlepage-date node side)
  (book-titlepage-element node side))
(define (book-titlepage-edition node side)
  (book-titlepage-element node side))
(define (book-titlepage-editor node side)
  (book-titlepage-element node side))
(define (book-titlepage-firstname node side)
  (book-titlepage-element node side))
(define (book-titlepage-graphic node side)
  (book-titlepage-element node side))
(define (book-titlepage-honorific node side)
  (book-titlepage-element node side))
(define (book-titlepage-indexterm node side)
  (book-titlepage-element node side))
(define (book-titlepage-invpartnumber node side)
  (book-titlepage-element node side))
(define (book-titlepage-isbn node side)
  (book-titlepage-element node side))
(define (book-titlepage-issn node side)
  (book-titlepage-element node side))
(define (book-titlepage-issuenum node side)
  (book-titlepage-element node side))
(define (book-titlepage-itermset node side)
  (book-titlepage-element node side))
(define (book-titlepage-keywordset node side)
  (book-titlepage-element node side))
(define (book-titlepage-legalnotice node side)
  (book-titlepage-element node side))
(define (book-titlepage-lineage node side)
  (book-titlepage-element node side))
(define (book-titlepage-mediaobject node side)
  (book-titlepage-element node side))
(define (book-titlepage-modespec node side)
  (book-titlepage-element node side))
(define (book-titlepage-orgname node side)
  (book-titlepage-element node side))
(define (book-titlepage-othercredit node side)
  (book-titlepage-element node side))
(define (book-titlepage-othername node side)
  (book-titlepage-element node side))
(define (book-titlepage-pagenums node side)
  (book-titlepage-element node side))
(define (book-titlepage-printhistory node side)
  (book-titlepage-element node side))
(define (book-titlepage-productname node side)
  (book-titlepage-element node side))
(define (book-titlepage-productnumber node side)
  (book-titlepage-element node side))
(define (book-titlepage-pubdate node side)
  (book-titlepage-element node side))
(define (book-titlepage-publisher node side)
  (book-titlepage-element node side))
(define (book-titlepage-publishername node side)
  (book-titlepage-element node side))
(define (book-titlepage-pubsnumber node side)
  (book-titlepage-element node side))
(define (book-titlepage-releaseinfo node side)
  (book-titlepage-element node side))
(define (book-titlepage-revhistory node side)
  (book-titlepage-element node side))
(define (book-titlepage-seriesinfo node side)
  (book-titlepage-element node side))
(define (book-titlepage-seriesvolnums node side)
  (book-titlepage-element node side))
(define (book-titlepage-subjectset node side)
  (book-titlepage-element node side))
(define (book-titlepage-subtitle node side)
  (book-titlepage-element node side))
(define (book-titlepage-surname node side)
  (book-titlepage-element node side))
(define (book-titlepage-title node side)
  (book-titlepage-element node side))
(define (book-titlepage-titleabbrev node side)
  (book-titlepage-element node side))
(define (book-titlepage-volumenum node side)
  (book-titlepage-element node side))

(define book-titlepage-recto-style
  (style
      font-family-name: %title-font-family%
      font-weight: 'bold
      font-size: (HSIZE 1)))

(define book-titlepage-verso-style
  (style
      font-family-name: %body-font-family%))

(mode book-titlepage-recto-mode
  (element abbrev
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element abstract
    (make display-group
      use: book-titlepage-recto-style
      quadding: 'start
      ($semiformal-object$)))

  (element (abstract title) (empty-sosofo))

  (element (abstract para)
    (make paragraph
      use: book-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element address 
    (make display-group
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make display-group
      use: book-titlepage-recto-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element author
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
	  use: book-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element authorblurb
    (make display-group
      use: book-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element (authorblurb para)
    (make paragraph
      use: book-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element authorgroup
    (make display-group
      (process-children)))

  (element authorinitials
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element confgroup
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractnum
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contrib
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element copyright
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      space-before: (* (HSIZE 2) %head-before-factor%)
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    (make sequence
      (make paragraph
	use: book-titlepage-recto-style
	font-size: (HSIZE 3)
	line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	space-before: (* (HSIZE 2) %head-before-factor%)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(process-children))
      ;; This paragraph is a hack to get the spacing right.
      ;; Authors always have an affiliation paragraph below them, even if
      ;; it's empty, so corpauthors need one too.
      (make paragraph
	use: book-titlepage-recto-style
	font-size: (HSIZE 1)
	line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	space-after: (* (HSIZE 2) %head-after-factor% 4)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(literal "\no-break-space;"))))

  (element corpname
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element date
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element edition
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    (let ((editor-name (author-string)))
      (make sequence      
	(if (first-sibling?) 
	    (make paragraph
	      use: book-titlepage-recto-style
	      font-size: (HSIZE 1)
	      line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	      space-before: (* (HSIZE 2) %head-before-factor% 6)
	      quadding: %division-title-quadding%
	      keep-with-next?: #t
	      (literal (gentext-edited-by)))
	    (empty-sosofo))
	(make paragraph
	  use: book-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-after: (* (HSIZE 2) %head-after-factor% 4)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal editor-name)))))

  (element firstname
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'center)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element isbn
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issn
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issuenum
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element jobtitle
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: book-titlepage-recto-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para)
    (make paragraph
      use: book-titlepage-recto-style
      quadding: 'start
      line-spacing: (* 0.8 (inherited-line-spacing))
      font-size: (* 0.8 (inherited-font-size))
      (process-children)))

  (element lineage
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element orgname
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element othercredit
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
	  use: book-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element othername
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pagenums
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element printhistory
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productname
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productnumber
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubdate
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publisher
    (make display-group
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publishername
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: book-titlepage-recto-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: book-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: book-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: book-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: book-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: book-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revremark)))
		  (else (empty-sosofo))))))))
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element shortaffil
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle 
    (make paragraph
      use: book-titlepage-recto-style
      font-size: (HSIZE 4)
      line-spacing: (* (HSIZE 4) %line-spacing-factor%)
      space-before: (* (HSIZE 4) %head-before-factor%)
      quadding: %division-subtitle-quadding%
      keep-with-next?: #t
      (process-children-trim)))

  (element surname
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element title 
    (make paragraph
      use: book-titlepage-recto-style
      font-size: (HSIZE 5)
      line-spacing: (* (HSIZE 5) %line-spacing-factor%)
      space-before: (* (HSIZE 5) %head-before-factor%)
      quadding: %division-title-quadding%
      keep-with-next?: #t
      heading-level: (if %generate-heading-level% 1 0)
      (with-mode title-mode
	(process-children-trim))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: book-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))
)

(mode book-titlepage-verso-mode
  (element abbrev
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element abstract ($semiformal-object$))

  (element (abstract title) (empty-sosofo))

  (element address 
    (make display-group
      use: book-titlepage-verso-style
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element author
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element authorblurb
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element authorgroup
    (let* ((editors (select-elements (children (current-node)) (normalize "editor"))))
      (make paragraph
	space-after: (* %bf-size% %line-spacing-factor%)
	(make sequence
	  (if (node-list-empty? editors)
	      (literal (gentext-by))
	      (literal (gentext-edited-by)))
	  (literal "\no-break-space;")
	  (process-children-trim)))))

  (element authorinitials
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element confgroup
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element contractnum
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element contrib
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element copyright
    (make paragraph
      use: book-titlepage-verso-style
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    ;; note: book-titlepage-corpauthor takes care of wrapping multiple
    ;; corpauthors
    (make sequence
      (if (first-sibling?)
	  (if (equal? (gi (parent (current-node))) (normalize "authorgroup"))
	      (empty-sosofo)
	      (literal (gentext-by) " "))
	  (literal ", "))
      (process-children)))

  (element corpname
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element date
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element edition
    (make paragraph
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    ;; Print the editor name.
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (or #f (not in-group)) ; nevermind, always put out the Edited by
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-edited-by))
	      (literal "\no-break-space;")
	      (literal (author-string))))
	  (make sequence
	    (literal (author-list-string))))))

  (element firstname
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'start)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element isbn
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element issn
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element issuenum
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element jobtitle
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: book-titlepage-verso-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para) 
    (make paragraph
      use: book-titlepage-verso-style
      font-size: (* (inherited-font-size) 0.8)
      (process-children-trim)))

  (element lineage
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element orgname
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element othercredit
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element othername
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element pagenums
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element printhistory
    (make display-group
      use: book-titlepage-verso-style
      (process-children)))

  (element productname
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element productnumber
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element pubdate
    (make paragraph
      (literal (gentext-element-name-space (gi (current-node))))
      (process-children)))

  (element publisher
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element publishername
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: book-titlepage-verso-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: book-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: book-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: book-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: book-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: book-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		(else (empty-sosofo)))))))) 
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element shortaffil
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (literal (if (first-sibling?) ": " "; "))
      (process-children)))

  (element surname
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))

  (element title
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (with-mode title-mode
	(process-children))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: book-titlepage-verso-style
      (process-children)))
)

;; == Title pages for PARTs =============================================

(define (part-titlepage-recto-elements)
  (list (normalize "title")
	(normalize "subtitle")))

(define (part-titlepage-verso-elements)
  '())

(define (part-titlepage-content? elements side)
  (titlepage-content? elements (if (equal? side 'recto)
				   (part-titlepage-recto-elements)
				   (part-titlepage-verso-elements))))

(define (part-titlepage elements #!optional (side 'recto))
  (let ((nodelist (titlepage-nodelist 
		   (if (equal? side 'recto)
		       (part-titlepage-recto-elements)
		       (part-titlepage-verso-elements))
		   elements))
        ;; partintro is a special case...
	(partintro (node-list-first
		    (node-list-filter-by-gi elements (list (normalize "partintro"))))))
    (if (part-titlepage-content? elements side)
;;	(make simple-page-sequence
;;	  page-n-columns: %titlepage-n-columns%
;;	  input-whitespace-treatment: 'collapse
;;	  use: default-text-style
	(make sequence
  
	  ;; This hack is required for the RTF backend. If an external-graphic
	  ;; is the first thing on the page, RTF doesn't seem to do the right
	  ;; thing (the graphic winds up on the baseline of the first line
	  ;; of the page, left justified).  This "one point rule" fixes
	  ;; that problem.
	  (make paragraph
	    line-spacing: 1pt
	    (literal ""))

	  (let loop ((nl nodelist) (lastnode (empty-node-list)))
	    (if (node-list-empty? nl)
		(empty-sosofo)
		(make sequence
		  (if (or (node-list-empty? lastnode)
			  (not (equal? (gi (node-list-first nl))
				       (gi lastnode))))
		      (part-titlepage-before (node-list-first nl) side)
		      (empty-sosofo))
		  (cond
		   ((equal? (gi (node-list-first nl)) (normalize "abbrev"))
		    (part-titlepage-abbrev (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "abstract"))
		    (part-titlepage-abstract (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "address"))
		    (part-titlepage-address (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "affiliation"))
		    (part-titlepage-affiliation (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "artpagenums"))
		    (part-titlepage-artpagenums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "author"))
		    (part-titlepage-author (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorblurb"))
		    (part-titlepage-authorblurb (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorgroup"))
		    (part-titlepage-authorgroup (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorinitials"))
		    (part-titlepage-authorinitials (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "bibliomisc"))
		    (part-titlepage-bibliomisc (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "biblioset"))
		    (part-titlepage-biblioset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "bookbiblio"))
		    (part-titlepage-bookbiblio (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "citetitle"))
		    (part-titlepage-citetitle (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "collab"))
		    (part-titlepage-collab (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "confgroup"))
		    (part-titlepage-confgroup (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contractnum"))
		    (part-titlepage-contractnum (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contractsponsor"))
		    (part-titlepage-contractsponsor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contrib"))
		    (part-titlepage-contrib (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "copyright"))
		    (part-titlepage-copyright (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "corpauthor"))
		    (part-titlepage-corpauthor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "corpname"))
		    (part-titlepage-corpname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "date"))
		    (part-titlepage-date (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "edition"))
		    (part-titlepage-edition (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "editor"))
		    (part-titlepage-editor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "firstname"))
		    (part-titlepage-firstname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "graphic"))
		    (part-titlepage-graphic (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "honorific"))
		    (part-titlepage-honorific (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "indexterm"))
		    (part-titlepage-indexterm (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "invpartnumber"))
		    (part-titlepage-invpartnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "isbn"))
		    (part-titlepage-isbn (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "issn"))
		    (part-titlepage-issn (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "issuenum"))
		    (part-titlepage-issuenum (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "itermset"))
		    (part-titlepage-itermset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "keywordset"))
		    (part-titlepage-keywordset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "legalnotice"))
		    (part-titlepage-legalnotice (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "lineage"))
		    (part-titlepage-lineage (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "mediaobject"))
		    (part-titlepage-mediaobject (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "modespec"))
		    (part-titlepage-modespec (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "orgname"))
		    (part-titlepage-orgname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "othercredit"))
		    (part-titlepage-othercredit (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "othername"))
		    (part-titlepage-othername (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pagenums"))
		    (part-titlepage-pagenums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "printhistory"))
		    (part-titlepage-printhistory (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "productname"))
		    (part-titlepage-productname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "productnumber"))
		    (part-titlepage-productnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pubdate"))
		    (part-titlepage-pubdate (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "publisher"))
		    (part-titlepage-publisher (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "publishername"))
		    (part-titlepage-publishername (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pubsnumber"))
		    (part-titlepage-pubsnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "releaseinfo"))
		    (part-titlepage-releaseinfo (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "revhistory"))
		    (part-titlepage-revhistory (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "seriesinfo"))
		    (part-titlepage-seriesinfo (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "seriesvolnums"))
		    (part-titlepage-seriesvolnums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "subjectset"))
		    (part-titlepage-subjectset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "subtitle"))
		    (part-titlepage-subtitle (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "surname"))
		    (part-titlepage-surname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "title"))
		    (part-titlepage-title (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "titleabbrev"))
		    (part-titlepage-titleabbrev (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "volumenum"))
		    (part-titlepage-volumenum (node-list-first nl) side))
		   (else
		    (part-titlepage-default (node-list-first nl) side)))
		  (loop (node-list-rest nl) (node-list-first nl)))))

	  (if (and %generate-part-toc%
		   %generate-part-toc-on-titlepage%
		   (equal? side 'recto))
	      (make display-group
		(build-toc (current-node)
			   (toc-depth (current-node))))
	      (empty-sosofo))

	  ;; PartIntro is a special case
	  (if (and (equal? side 'recto)
		   (not (node-list-empty? partintro))
		   %generate-partintro-on-titlepage%)
	      ($process-partintro$ partintro #f)
	      (empty-sosofo)))
	(empty-sosofo))))

(define (part-titlepage-before node side)
  (if (equal? side 'recto)
      (cond
       ((equal? (gi node) (normalize "corpauthor"))
	(make paragraph
	  space-after: (* (HSIZE 5) %head-after-factor% 8)
	  (literal "\no-break-space;")))
       ((equal? (gi node) (normalize "authorgroup"))
	(if (have-sibling? (normalize "corpauthor") node)
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       ((equal? (gi node) (normalize "author"))
	(if (or (have-sibling? (normalize "corpauthor") node) 
		(have-sibling? (normalize "authorgroup") node))
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       (else (empty-sosofo)))
      (empty-sosofo)))

(define (part-titlepage-default node side)
  (let ((foo (debug (string-append "No part-titlepage-* for " (gi node) "!"))))
    (empty-sosofo)))

(define (part-titlepage-element node side)
  (if (equal? side 'recto)
      (with-mode part-titlepage-recto-mode
	(process-node-list node))
      (with-mode part-titlepage-verso-mode
	(process-node-list node))))

(define (part-titlepage-abbrev node side)
  (part-titlepage-element node side))
(define (part-titlepage-abstract node side)
  (part-titlepage-element node side))
(define (part-titlepage-address node side)
  (part-titlepage-element node side))
(define (part-titlepage-affiliation node side)
  (part-titlepage-element node side))
(define (part-titlepage-artpagenums node side)
  (part-titlepage-element node side))
(define (part-titlepage-author node side)
  (part-titlepage-element node side))
(define (part-titlepage-authorblurb node side)
  (part-titlepage-element node side))
(define (part-titlepage-authorgroup node side)
  (part-titlepage-element node side))
(define (part-titlepage-authorinitials node side)
  (part-titlepage-element node side))
(define (part-titlepage-bibliomisc node side)
  (part-titlepage-element node side))
(define (part-titlepage-biblioset node side)
  (part-titlepage node side))
(define (part-titlepage-bookbiblio node side)
  (part-titlepage node side))
(define (part-titlepage-citetitle node side)
  (part-titlepage-element node side))
(define (part-titlepage-collab node side)
  (part-titlepage-element node side))
(define (part-titlepage-confgroup node side)
  (part-titlepage-element node side))
(define (part-titlepage-contractnum node side)
  (part-titlepage-element node side))
(define (part-titlepage-contractsponsor node side)
  (part-titlepage-element node side))
(define (part-titlepage-contrib  node side)
  (part-titlepage-element node side))
(define (part-titlepage-copyright node side)
  (part-titlepage-element node side))

(define (part-titlepage-corpauthor node side)
  (if (equal? side 'recto)
      (book-titlepage-element node side)
      (if (first-sibling? node)
	  (make paragraph
	    (with-mode book-titlepage-verso-mode
	      (process-node-list
	       (select-elements (children (parent node)) 
				(normalize "corpauthor")))))
	  (empty-sosofo))))

(define (part-titlepage-corpname node side)
  (part-titlepage-element node side))
(define (part-titlepage-date node side)
  (part-titlepage-element node side))
(define (part-titlepage-edition node side)
  (part-titlepage-element node side))
(define (part-titlepage-editor node side)
  (part-titlepage-element node side))
(define (part-titlepage-firstname node side)
  (part-titlepage-element node side))
(define (part-titlepage-graphic node side)
  (part-titlepage-element node side))
(define (part-titlepage-honorific node side)
  (part-titlepage-element node side))
(define (part-titlepage-indexterm node side)
  (part-titlepage-element node side))
(define (part-titlepage-invpartnumber node side)
  (part-titlepage-element node side))
(define (part-titlepage-isbn node side)
  (part-titlepage-element node side))
(define (part-titlepage-issn node side)
  (part-titlepage-element node side))
(define (part-titlepage-issuenum node side)
  (part-titlepage-element node side))
(define (part-titlepage-itermset node side)
  (part-titlepage-element node side))
(define (part-titlepage-keywordset node side)
  (part-titlepage-element node side))
(define (part-titlepage-legalnotice node side)
  (part-titlepage-element node side))
(define (part-titlepage-lineage node side)
  (part-titlepage-element node side))
(define (part-titlepage-mediaobject node side)
  (part-titlepage-element node side))
(define (part-titlepage-modespec node side)
  (part-titlepage-element node side))
(define (part-titlepage-orgname node side)
  (part-titlepage-element node side))
(define (part-titlepage-othercredit node side)
  (part-titlepage-element node side))
(define (part-titlepage-othername node side)
  (part-titlepage-element node side))
(define (part-titlepage-pagenums node side)
  (part-titlepage-element node side))
(define (part-titlepage-printhistory node side)
  (part-titlepage-element node side))
(define (part-titlepage-productname node side)
  (part-titlepage-element node side))
(define (part-titlepage-productnumber node side)
  (part-titlepage-element node side))
(define (part-titlepage-pubdate node side)
  (part-titlepage-element node side))
(define (part-titlepage-publisher node side)
  (part-titlepage-element node side))
(define (part-titlepage-publishername node side)
  (part-titlepage-element node side))
(define (part-titlepage-pubsnumber node side)
  (part-titlepage-element node side))
(define (part-titlepage-releaseinfo node side)
  (part-titlepage-element node side))
(define (part-titlepage-revhistory node side)
  (part-titlepage-element node side))
(define (part-titlepage-seriesinfo node side)
  (part-titlepage-element node side))
(define (part-titlepage-seriesvolnums node side)
  (part-titlepage-element node side))
(define (part-titlepage-subjectset node side)
  (part-titlepage-element node side))
(define (part-titlepage-subtitle node side)
  (part-titlepage-element node side))
(define (part-titlepage-surname node side)
  (part-titlepage-element node side))
(define (part-titlepage-title node side)
  (part-titlepage-element node side))
(define (part-titlepage-titleabbrev node side)
  (part-titlepage-element node side))
(define (part-titlepage-volumenum node side)
  (part-titlepage-element node side))

(define part-titlepage-recto-style
  (style
      font-family-name: %title-font-family%
      font-weight: 'bold
      font-size: (HSIZE 1)))

(define part-titlepage-verso-style
  (style
      font-family-name: %body-font-family%))

(mode part-titlepage-recto-mode
  (element abbrev
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element abstract
    (make display-group
      use: part-titlepage-recto-style
      quadding: 'start
      ($semiformal-object$)))

  (element (abstract title) (empty-sosofo))

  (element (abstract para)
    (make paragraph
      use: part-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element address 
    (make display-group
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make display-group
      use: part-titlepage-recto-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element author
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
          use: part-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element authorblurb
    (make display-group
      use: part-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element (authorblurb para)
    (make paragraph
      use: part-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element authorgroup
    (make display-group
      (process-children)))

  (element authorinitials
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element confgroup
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractnum
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contrib
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element copyright
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      space-before: (* (HSIZE 2) %head-before-factor%)
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    (make sequence
      (make paragraph
        use: part-titlepage-recto-style
	font-size: (HSIZE 3)
	line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	space-before: (* (HSIZE 2) %head-before-factor%)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(process-children))
      ;; This paragraph is a hack to get the spacing right.
      ;; Authors always have an affiliation paragraph below them, even if
      ;; it's empty, so corpauthors need one too.
      (make paragraph
        use: part-titlepage-recto-style
	font-size: (HSIZE 1)
	line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	space-after: (* (HSIZE 2) %head-after-factor% 4)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(literal "\no-break-space;"))))

  (element corpname
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element date
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element edition
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    (let ((editor-name (author-string)))
      (make sequence      
	(if (first-sibling?) 
	    (make paragraph
              use: part-titlepage-recto-style
	      font-size: (HSIZE 1)
	      line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	      space-before: (* (HSIZE 2) %head-before-factor% 6)
	      quadding: %division-title-quadding%
	      keep-with-next?: #t
	      (literal (gentext-edited-by)))
	    (empty-sosofo))
	(make paragraph
          use: part-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-after: (* (HSIZE 2) %head-after-factor% 4)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal editor-name)))))

  (element firstname
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'center)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element isbn
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issn
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issuenum
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element jobtitle
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: part-titlepage-recto-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para)
    (make paragraph
      use: part-titlepage-recto-style
      quadding: 'start
      line-spacing: (* 0.8 (inherited-line-spacing))
      font-size: (* 0.8 (inherited-font-size))
      (process-children)))

  (element lineage
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element orgname
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element othercredit
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
          use: part-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element othername
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pagenums
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element printhistory
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productname
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productnumber
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubdate
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publisher
    (make display-group
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publishername
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: part-titlepage-recto-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: part-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: part-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: part-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: part-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: part-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		  (else (empty-sosofo)))))))) 
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element shortaffil
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle 
    (make paragraph
      use: part-titlepage-recto-style
      font-size: (HSIZE 4)
      line-spacing: (* (HSIZE 4) %line-spacing-factor%)
      space-before: (* (HSIZE 4) %head-before-factor%)
      quadding: %division-subtitle-quadding%
      keep-with-next?: #t
      (process-children-trim)))

  (element surname
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element title
    (let ((division (ancestor-member (current-node) (division-element-list))))
      (make paragraph
        use: part-titlepage-recto-style
	font-size: (HSIZE 5)
	line-spacing: (* (HSIZE 5) %line-spacing-factor%)
	space-before: (* (HSIZE 5) %head-before-factor%)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	heading-level: (if %generate-heading-level% 1 0)
	(if (string=? (element-label division) "")
	    (empty-sosofo)
	    (literal (element-label division) 
		     (gentext-label-title-sep (gi division))))
	(with-mode title-mode
	  (process-children)))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: part-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))
)

(mode part-titlepage-verso-mode
  (element abbrev
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element abstract ($semiformal-object$))

  (element (abstract title) (empty-sosofo))

  (element address 
    (make display-group
      use: part-titlepage-verso-style
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element author
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element authorblurb
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element authorgroup
    (make paragraph
      space-after: (* %bf-size% %line-spacing-factor%)
      (make sequence
	(literal (gentext-by))
	(literal "\no-break-space;")
	(process-children-trim))))

  (element authorinitials
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element confgroup
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element contractnum
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element contrib
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element copyright
    (make paragraph
      use: part-titlepage-verso-style
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    ;; note: part-titlepage-corpauthor takes care of wrapping multiple
    ;; corpauthors
    (make sequence
      (if (first-sibling?)
	  (if (equal? (gi (parent (current-node))) (normalize "authorgroup"))
	      (empty-sosofo)
	      (literal (gentext-by) " "))
	  (literal ", "))
      (process-children)))

  (element corpname
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element date
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element edition
    (make paragraph
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    ;; Print the editor name.
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (or #t (not in-group)) ; nevermind, always put out the Edited by
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-edited-by))
	      (literal "\no-break-space;")
	      (literal (author-string))))
	  (make sequence 
	    (literal (author-string))))))

  (element firstname
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'start)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element isbn
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element issn
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element issuenum
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element jobtitle
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: part-titlepage-verso-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para) 
    (make paragraph
      use: part-titlepage-verso-style
      font-size: (* (inherited-font-size) 0.8)
      (process-children-trim)))

  (element lineage
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element orgname
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element othercredit
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element othername
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element pagenums
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element printhistory
    (make display-group
      use: part-titlepage-verso-style
      (process-children)))

  (element productname
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element productnumber
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element pubdate
    (make paragraph
      (literal (gentext-element-name-space (gi (current-node))))
      (process-children)))

  (element publisher
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element publishername
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: part-titlepage-verso-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: part-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: part-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: part-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: part-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: part-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revremark)))
		  (else (empty-sosofo)))))))) 
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element shortaffil
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (literal (if (first-sibling?) ": " "; "))
      (process-children)))

  (element surname
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))

  (element title
    (let ((division (ancestor-member (current-node) (division-element-list))))
      (make sequence
        font-family-name: %title-font-family%
	font-weight: 'bold
	(if (string=? (element-label division) "")
	    (empty-sosofo)
	    (literal (element-label division) 
		     (gentext-label-title-sep (gi division))))
	(with-mode title-mode
	  (process-children)))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: part-titlepage-verso-style
      (process-children)))
)

;; == Title pages for ARTICLEs ==========================================
;;
;; Note: Article title pages are a little different in that they do not
;; create their own simple-page-sequence.
;;

(define (article-titlepage-recto-elements)
  (list (normalize "title")
	(normalize "subtitle")
	(normalize "corpauthor")
	(normalize "authorgroup")
	(normalize "author")
	(normalize "releaseinfo")
	(normalize "copyright")
	(normalize "pubdate")
	(normalize "revhistory")
	(normalize "abstract")))

(define (article-titlepage-verso-elements)
  '())

(define (article-titlepage-content? elements side)
  (titlepage-content? elements (if (equal? side 'recto)
				   (article-titlepage-recto-elements)
				   (article-titlepage-verso-elements))))

(define (article-titlepage elements #!optional (side 'recto))
  (let* ((nodelist (titlepage-nodelist 
		    (if (equal? side 'recto)
			(article-titlepage-recto-elements)
			(article-titlepage-verso-elements))
		    elements)))
    (if (article-titlepage-content? elements side)
	(make sequence
	  (let loop ((nl nodelist) (lastnode (empty-node-list)))
	    (if (node-list-empty? nl)
		(empty-sosofo)
		(make sequence
		  (if (or (node-list-empty? lastnode)
			  (not (equal? (gi (node-list-first nl))
				       (gi lastnode))))
		      (article-titlepage-before (node-list-first nl) side)
		      (empty-sosofo))
		  (cond
		   ((equal? (gi (node-list-first nl)) (normalize "abbrev"))
		    (article-titlepage-abbrev (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "abstract"))
		    (article-titlepage-abstract (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "address"))
		    (article-titlepage-address (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "affiliation"))
		    (article-titlepage-affiliation (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "artpagenums"))
		    (article-titlepage-artpagenums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "author"))
		    (article-titlepage-author (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorblurb"))
		    (article-titlepage-authorblurb (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorgroup"))
		    (article-titlepage-authorgroup (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorinitials"))
		    (article-titlepage-authorinitials (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "bibliomisc"))
		    (article-titlepage-bibliomisc (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "biblioset"))
		    (article-titlepage-biblioset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "bookbiblio"))
		    (article-titlepage-bookbiblio (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "citetitle"))
		    (article-titlepage-citetitle (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "collab"))
		    (article-titlepage-collab (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "confgroup"))
		    (article-titlepage-confgroup (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contractnum"))
		    (article-titlepage-contractnum (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contractsponsor"))
		    (article-titlepage-contractsponsor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contrib"))
		    (article-titlepage-contrib (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "copyright"))
		    (article-titlepage-copyright (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "corpauthor"))
		    (article-titlepage-corpauthor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "corpname"))
		    (article-titlepage-corpname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "date"))
		    (article-titlepage-date (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "edition"))
		    (article-titlepage-edition (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "editor"))
		    (article-titlepage-editor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "firstname"))
		    (article-titlepage-firstname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "graphic"))
		    (article-titlepage-graphic (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "honorific"))
		    (article-titlepage-honorific (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "indexterm"))
		    (article-titlepage-indexterm (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "invpartnumber"))
		    (article-titlepage-invpartnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "isbn"))
		    (article-titlepage-isbn (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "issn"))
		    (article-titlepage-issn (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "issuenum"))
		    (article-titlepage-issuenum (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "itermset"))
		    (article-titlepage-itermset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "keywordset"))
		    (article-titlepage-keywordset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "legalnotice"))
		    (article-titlepage-legalnotice (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "lineage"))
		    (article-titlepage-lineage (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "mediaobject"))
		    (article-titlepage-mediaobject (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "modespec"))
		    (article-titlepage-modespec (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "orgname"))
		    (article-titlepage-orgname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "othercredit"))
		    (article-titlepage-othercredit (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "othername"))
		    (article-titlepage-othername (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pagenums"))
		    (article-titlepage-pagenums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "printhistory"))
		    (article-titlepage-printhistory (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "productname"))
		    (article-titlepage-productname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "productnumber"))
		    (article-titlepage-productnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pubdate"))
		    (article-titlepage-pubdate (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "publisher"))
		    (article-titlepage-publisher (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "publishername"))
		    (article-titlepage-publishername (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pubsnumber"))
		    (article-titlepage-pubsnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "releaseinfo"))
		    (article-titlepage-releaseinfo (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "revhistory"))
		    (article-titlepage-revhistory (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "seriesinfo"))
		    (article-titlepage-seriesinfo (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "seriesvolnums"))
		    (article-titlepage-seriesvolnums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "subjectset"))
		    (article-titlepage-subjectset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "subtitle"))
		    (article-titlepage-subtitle (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "surname"))
		    (article-titlepage-surname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "title"))
		    (article-titlepage-title (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "titleabbrev"))
		    (article-titlepage-titleabbrev (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "volumenum"))
		    (article-titlepage-volumenum (node-list-first nl) side))
		   (else
		    (article-titlepage-default (node-list-first nl) side)))
		  (loop (node-list-rest nl) (node-list-first nl)))))

	  (if (and %generate-article-toc%
		   %generate-article-toc-on-titlepage%
		   (equal? side 'recto))
	      (make display-group
		(build-toc (current-node)
			   (toc-depth (current-node))))
	      (empty-sosofo)))
	(empty-sosofo))))

(define (article-titlepage-before node side)
  (empty-sosofo))

(define (article-titlepage-default node side)
  (let ((foo (debug (string-append "No article-titlepage-* for " (gi node) "!"))))
    (empty-sosofo)))

(define (article-titlepage-element node side)
  (if (equal? side 'recto)
      (with-mode article-titlepage-recto-mode
	(process-node-list node))
      (with-mode article-titlepage-verso-mode
	(process-node-list node))))

(define (article-titlepage-abbrev node side)
  (article-titlepage-element node side))
(define (article-titlepage-abstract node side)
  (article-titlepage-element node side))
(define (article-titlepage-address node side)
  (article-titlepage-element node side))
(define (article-titlepage-affiliation node side)
  (article-titlepage-element node side))
(define (article-titlepage-artpagenums node side)
  (article-titlepage-element node side))
(define (article-titlepage-author node side)
  (article-titlepage-element node side))
(define (article-titlepage-authorblurb node side)
  (article-titlepage-element node side))
(define (article-titlepage-authorgroup node side)
  (article-titlepage-element node side))
(define (article-titlepage-authorinitials node side)
  (article-titlepage-element node side))
(define (article-titlepage-bibliomisc node side)
  (article-titlepage-element node side))
(define (article-titlepage-biblioset node side)
  (article-titlepage node side))
(define (article-titlepage-bookbiblio node side)
  (article-titlepage node side))
(define (article-titlepage-citetitle node side)
  (article-titlepage-element node side))
(define (article-titlepage-collab node side)
  (article-titlepage-element node side))
(define (article-titlepage-confgroup node side)
  (article-titlepage-element node side))
(define (article-titlepage-contractnum node side)
  (article-titlepage-element node side))
(define (article-titlepage-contractsponsor node side)
  (article-titlepage-element node side))
(define (article-titlepage-contrib  node side)
  (article-titlepage-element node side))
(define (article-titlepage-copyright node side)
  (article-titlepage-element node side))

(define (article-titlepage-corpauthor node side)
  (if (equal? side 'recto)
      (book-titlepage-element node side)
      (if (first-sibling? node)
	  (make paragraph
	    (with-mode book-titlepage-verso-mode
	      (process-node-list
	       (select-elements (children (parent node)) 
				(normalize "corpauthor")))))
	  (empty-sosofo))))

(define (article-titlepage-corpname node side)
  (article-titlepage-element node side))
(define (article-titlepage-date node side)
  (article-titlepage-element node side))
(define (article-titlepage-edition node side)
  (article-titlepage-element node side))
(define (article-titlepage-editor node side)
  (article-titlepage-element node side))
(define (article-titlepage-firstname node side)
  (article-titlepage-element node side))
(define (article-titlepage-graphic node side)
  (article-titlepage-element node side))
(define (article-titlepage-honorific node side)
  (article-titlepage-element node side))
(define (article-titlepage-indexterm node side)
  (article-titlepage-element node side))
(define (article-titlepage-invpartnumber node side)
  (article-titlepage-element node side))
(define (article-titlepage-isbn node side)
  (article-titlepage-element node side))
(define (article-titlepage-issn node side)
  (article-titlepage-element node side))
(define (article-titlepage-issuenum node side)
  (article-titlepage-element node side))
(define (article-titlepage-itermset node side)
  (article-titlepage-element node side))
(define (article-titlepage-keywordset node side)
  (article-titlepage-element node side))
(define (article-titlepage-legalnotice node side)
  (article-titlepage-element node side))
(define (article-titlepage-lineage node side)
  (article-titlepage-element node side))
(define (article-titlepage-mediaobject node side)
  (article-titlepage-element node side))
(define (article-titlepage-modespec node side)
  (article-titlepage-element node side))
(define (article-titlepage-orgname node side)
  (article-titlepage-element node side))
(define (article-titlepage-othercredit node side)
  (article-titlepage-element node side))
(define (article-titlepage-othername node side)
  (article-titlepage-element node side))
(define (article-titlepage-pagenums node side)
  (article-titlepage-element node side))
(define (article-titlepage-printhistory node side)
  (article-titlepage-element node side))
(define (article-titlepage-productname node side)
  (article-titlepage-element node side))
(define (article-titlepage-productnumber node side)
  (article-titlepage-element node side))
(define (article-titlepage-pubdate node side)
  (article-titlepage-element node side))
(define (article-titlepage-publisher node side)
  (article-titlepage-element node side))
(define (article-titlepage-publishername node side)
  (article-titlepage-element node side))
(define (article-titlepage-pubsnumber node side)
  (article-titlepage-element node side))
(define (article-titlepage-releaseinfo node side)
  (article-titlepage-element node side))
(define (article-titlepage-revhistory node side)
  (article-titlepage-element node side))
(define (article-titlepage-seriesinfo node side)
  (article-titlepage-element node side))
(define (article-titlepage-seriesvolnums node side)
  (article-titlepage-element node side))
(define (article-titlepage-subjectset node side)
  (article-titlepage-element node side))
(define (article-titlepage-subtitle node side)
  (article-titlepage-element node side))
(define (article-titlepage-surname node side)
  (article-titlepage-element node side))
(define (article-titlepage-title node side)
  (article-titlepage-element node side))
(define (article-titlepage-titleabbrev node side)
  (article-titlepage-element node side))
(define (article-titlepage-volumenum node side)
  (article-titlepage-element node side))

(define article-titlepage-recto-style
  (style
      font-family-name: %title-font-family%
      font-weight: 'bold
      font-size: (HSIZE 1)))

(define article-titlepage-verso-style
  (style
      font-family-name: %body-font-family%))

(mode article-titlepage-recto-mode
  (element abbrev
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element abstract
    (make display-group
      use: article-titlepage-verso-style ;; EVEN THOUGH IT'S RECTO!
      quadding: 'start
      start-indent: (+ (inherited-start-indent) (/ %body-width% 24))
      end-indent: (+ (inherited-end-indent) (/ %body-width% 24))
      ($semiformal-object$)))

  (element (abstract title) (empty-sosofo))

  (element address 
    (make display-group
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make display-group
      use: article-titlepage-recto-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element author
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
          use: article-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %article-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element authorblurb
    (make display-group
      use: article-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element (authorblurb para)
    (make paragraph
      use: article-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element authorgroup
    (make display-group
      (process-children)))

  (element authorinitials
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element confgroup
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element contractnum
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element contrib
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element copyright
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      space-before: (* (HSIZE 2) %head-before-factor%)
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    (make sequence
      (make paragraph
        use: article-titlepage-recto-style
	font-size: (HSIZE 3)
	line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	space-before: (* (HSIZE 2) %head-before-factor%)
	quadding: %article-title-quadding%
	keep-with-next?: #t
	(process-children))
      ;; This paragraph is a hack to get the spacing right.
      ;; Authors always have an affiliation paragraph below them, even if
      ;; it's empty, so corpauthors need one too.
      (make paragraph
        use: article-titlepage-recto-style
	font-size: (HSIZE 1)
	line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	space-after: (* (HSIZE 2) %head-after-factor% 4)
	quadding: %article-title-quadding%
	keep-with-next?: #t
	(literal "\no-break-space;"))))

  (element corpname
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element date
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element edition
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    (let ((editor-name (author-string)))
      (make sequence      
	(if (first-sibling?) 
	    (make paragraph
              use: article-titlepage-recto-style
	      font-size: (HSIZE 1)
	      line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	      space-before: (* (HSIZE 2) %head-before-factor% 6)
	      quadding: %article-title-quadding%
	      keep-with-next?: #t
	      (literal (gentext-edited-by)))
	    (empty-sosofo))
	(make paragraph
          use: article-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-after: (* (HSIZE 2) %head-after-factor% 4)
	  quadding: %article-title-quadding%
	  keep-with-next?: #t
	  (literal editor-name)))))

  (element firstname
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'center)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element isbn
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element issn
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element issuenum
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element jobtitle
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element keyword
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: article-titlepage-recto-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para)
    (make paragraph
      use: article-titlepage-recto-style
      quadding: 'start
      line-spacing: (* 0.8 (inherited-line-spacing))
      font-size: (* 0.8 (inherited-font-size))
      (process-children)))

  (element lineage
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element orgname
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element othercredit
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
          use: article-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %article-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element othername
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element pagenums
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element printhistory
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element productname
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element productnumber
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element pubdate
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element publisher
    (make display-group
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element publishername
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: article-titlepage-recto-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: article-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: article-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: article-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: article-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: article-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		  (else (empty-sosofo))))))))
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element shortaffil
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle 
    (make paragraph
      use: article-titlepage-recto-style
      font-size: (HSIZE 4)
      line-spacing: (* (HSIZE 4) %line-spacing-factor%)
      space-before: (* (HSIZE 4) %head-before-factor%)
      quadding: %article-subtitle-quadding%
      keep-with-next?: #t
      (process-children-trim)))

  (element surname
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))

  (element title 
    (make paragraph
      use: article-titlepage-recto-style
      font-size: (HSIZE 5)
      line-spacing: (* (HSIZE 5) %line-spacing-factor%)
      space-before: (* (HSIZE 5) %head-before-factor%)
      quadding: %article-title-quadding%
      keep-with-next?: #t
      (with-mode title-mode
	(process-children-trim))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: article-titlepage-recto-style
      quadding: %article-title-quadding%
      (process-children)))
)

(mode article-titlepage-verso-mode
  (element abbrev
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element abstract ($semiformal-object$))

  (element (abstract title) (empty-sosofo))

  (element address 
    (make display-group
      use: article-titlepage-verso-style
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element author
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element authorblurb
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element authorgroup
    (make paragraph
      space-after: (* %bf-size% %line-spacing-factor%)
      (make sequence
	(literal (gentext-by))
	(literal "\no-break-space;")
	(process-children-trim))))

  (element authorinitials
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element confgroup
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element contractnum
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element contrib
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element copyright
    (make paragraph
      use: article-titlepage-verso-style
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    ;; note: article-titlepage-corpauthor takes care of wrapping multiple
    ;; corpauthors
    (make sequence
      (if (first-sibling?)
	  (if (equal? (gi (parent (current-node))) (normalize "authorgroup"))
	      (empty-sosofo)
	      (literal (gentext-by) " "))
	  (literal ", "))
      (process-children)))

  (element corpname
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element date
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element edition
    (make paragraph
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    ;; Print the editor name.
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (or #t (not in-group)) ; nevermind, always put out the Edited by
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-edited-by))
	      (literal "\no-break-space;")
	      (literal (author-string))))
	  (make sequence 
	    (literal (author-string))))))

  (element firstname
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'start)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element isbn
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element issn
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element issuenum
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element jobtitle
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: article-titlepage-verso-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para) 
    (make paragraph
      use: article-titlepage-verso-style
      font-size: (* (inherited-font-size) 0.8)
      (process-children-trim)))

  (element lineage
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element orgname
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element othercredit
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element othername
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element pagenums
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element printhistory
    (make display-group
      use: article-titlepage-verso-style
      (process-children)))

  (element productname
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element productnumber
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element pubdate
    (make paragraph
      (literal (gentext-element-name-space (gi (current-node))))
      (process-children)))

  (element publisher
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element publishername
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: article-titlepage-verso-style
	font-family-name: %title-font-family%
	font-weight: 'bold
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (node-list-empty? revnumber)
		(empty-sosofo)
		(make paragraph
		  use: article-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (node-list-empty? revdate)
		(empty-sosofo)
		(make paragraph
		  use: article-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (node-list-empty? revauthor)
		(empty-sosofo)
		(make paragraph
		  use: article-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor)))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: article-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: article-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		  (else (empty-sosofo)))))))) 
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element shortaffil
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (literal (if (first-sibling?) ": " "; "))
      (process-children)))

  (element surname
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

  (element title
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (with-mode title-mode
	(process-children))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: article-titlepage-verso-style
      (process-children)))

)

;; == Title pages for REFERENCEs ========================================

(define (reference-titlepage-recto-elements)
  (list (normalize "title") 
	(normalize "subtitle")
	(normalize "corpauthor") 
	(normalize "authorgroup") 
	(normalize "author") 
	(normalize "editor")))

(define (reference-titlepage-verso-elements)
  '())

(define (reference-titlepage-content? elements side)
  (titlepage-content? elements (if (equal? side 'recto)
				   (reference-titlepage-recto-elements)
				   (reference-titlepage-verso-elements))))

(define (reference-titlepage elements #!optional (side 'recto))
  (let ((nodelist (titlepage-nodelist 
		   (if (equal? side 'recto)
		       (reference-titlepage-recto-elements)
		       (reference-titlepage-verso-elements))
		   elements))
        ;; partintro is a special case...
	(partintro (node-list-first
		    (node-list-filter-by-gi elements (list (normalize "partintro"))))))
    (if (reference-titlepage-content? elements side)
	(make simple-page-sequence
	  page-n-columns: %titlepage-n-columns%
	  input-whitespace-treatment: 'collapse
	  use: default-text-style
	  
	  ;; This hack is required for the RTF backend. If an external-graphic
	  ;; is the first thing on the page, RTF doesn't seem to do the right
	  ;; thing (the graphic winds up on the baseline of the first line
	  ;; of the page, left justified).  This "one point rule" fixes
	  ;; that problem.
	  (make paragraph
	    line-spacing: 1pt
	    (literal ""))
      
	  (let loop ((nl nodelist) (lastnode (empty-node-list)))
	    (if (node-list-empty? nl)
		(empty-sosofo)
		(make sequence
		  (if (or (node-list-empty? lastnode)
			  (not (equal? (gi (node-list-first nl))
				       (gi lastnode))))
		      (reference-titlepage-before (node-list-first nl) side)
		      (empty-sosofo))
		  (cond
		   ((equal? (gi (node-list-first nl)) (normalize "abbrev"))
		    (reference-titlepage-abbrev (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "abstract"))
		    (reference-titlepage-abstract (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "address"))
		    (reference-titlepage-address (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "affiliation"))
		    (reference-titlepage-affiliation (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "artpagenums"))
		    (reference-titlepage-artpagenums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "author"))
		    (reference-titlepage-author (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorblurb"))
		    (reference-titlepage-authorblurb (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorgroup"))
		    (reference-titlepage-authorgroup (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "authorinitials"))
		    (reference-titlepage-authorinitials (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "bibliomisc"))
		    (reference-titlepage-bibliomisc (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "biblioset"))
		    (reference-titlepage-biblioset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "bookbiblio"))
		    (reference-titlepage-bookbiblio (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "citetitle"))
		    (reference-titlepage-citetitle (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "collab"))
		    (reference-titlepage-collab (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "confgroup"))
		    (reference-titlepage-confgroup (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contractnum"))
		    (reference-titlepage-contractnum (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contractsponsor"))
		    (reference-titlepage-contractsponsor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "contrib"))
		    (reference-titlepage-contrib (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "copyright"))
		    (reference-titlepage-copyright (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "corpauthor"))
		    (reference-titlepage-corpauthor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "corpname"))
		    (reference-titlepage-corpname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "date"))
		    (reference-titlepage-date (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "edition"))
		    (reference-titlepage-edition (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "editor"))
		    (reference-titlepage-editor (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "firstname"))
		    (reference-titlepage-firstname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "graphic"))
		    (reference-titlepage-graphic (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "honorific"))
		    (reference-titlepage-honorific (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "indexterm"))
		    (reference-titlepage-indexterm (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "invpartnumber"))
		    (reference-titlepage-invpartnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "isbn"))
		    (reference-titlepage-isbn (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "issn"))
		    (reference-titlepage-issn (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "issuenum"))
		    (reference-titlepage-issuenum (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "itermset"))
		    (reference-titlepage-itermset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "keywordset"))
		    (reference-titlepage-keywordset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "legalnotice"))
		    (reference-titlepage-legalnotice (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "lineage"))
		    (reference-titlepage-lineage (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "mediaobject"))
		    (reference-titlepage-mediaobject (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "modespec"))
		    (reference-titlepage-modespec (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "orgname"))
		    (reference-titlepage-orgname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "othercredit"))
		    (reference-titlepage-othercredit (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "othername"))
		    (reference-titlepage-othername (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pagenums"))
		    (reference-titlepage-pagenums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "printhistory"))
		    (reference-titlepage-printhistory (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "productname"))
		    (reference-titlepage-productname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "productnumber"))
		    (reference-titlepage-productnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pubdate"))
		    (reference-titlepage-pubdate (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "publisher"))
		    (reference-titlepage-publisher (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "publishername"))
		    (reference-titlepage-publishername (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "pubsnumber"))
		    (reference-titlepage-pubsnumber (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "releaseinfo"))
		    (reference-titlepage-releaseinfo (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "revhistory"))
		    (reference-titlepage-revhistory (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "seriesinfo"))
		    (reference-titlepage-seriesinfo (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "seriesvolnums"))
		    (reference-titlepage-seriesvolnums (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "subjectset"))
		    (reference-titlepage-subjectset (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "subtitle"))
		    (reference-titlepage-subtitle (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "surname"))
		    (reference-titlepage-surname (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "title"))
		    (reference-titlepage-title (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "titleabbrev"))
		    (reference-titlepage-titleabbrev (node-list-first nl) side))
		   ((equal? (gi (node-list-first nl)) (normalize "volumenum"))
		    (reference-titlepage-volumenum (node-list-first nl) side))
		   (else
		    (reference-titlepage-default (node-list-first nl) side)))
		  (loop (node-list-rest nl) (node-list-first nl)))))

	  (if (and %generate-reference-toc%
		   %generate-reference-toc-on-titlepage%
		   (equal? side 'recto))
	      (make display-group
		(build-toc (current-node)
			   (toc-depth (current-node))))
	      (empty-sosofo))

	  ;; PartIntro is a special case
	  (if (and (equal? side 'recto)
		   (not (node-list-empty? partintro))
		   %generate-partintro-on-titlepage%)
	      ($process-partintro$ partintro #f)
	      (empty-sosofo)))

	(empty-sosofo))))

(define (reference-titlepage-before node side)
  (if (equal? side 'recto)
      (cond
       ((equal? (gi node) (normalize "corpauthor"))
	(make paragraph
	  space-after: (* (HSIZE 5) %head-after-factor% 8)
	  (literal "\no-break-space;")))
       ((equal? (gi node) (normalize "authorgroup"))
	(if (have-sibling? (normalize "corpauthor") node)
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       ((equal? (gi node) (normalize "author"))
	(if (or (have-sibling? (normalize "corpauthor") node) 
		(have-sibling? (normalize "authorgroup") node))
	    (empty-sosofo)
	    (make paragraph
	      space-after: (* (HSIZE 5) %head-after-factor% 8)
	      (literal "\no-break-space;"))))
       (else (empty-sosofo)))
      (empty-sosofo)))

(define (reference-titlepage-default node side)
  (let ((foo (debug (string-append "No reference-titlepage-* for " (gi node) "!"))))
    (empty-sosofo)))

(define (reference-titlepage-element node side)
  (if (equal? side 'recto)
      (with-mode reference-titlepage-recto-mode
	(process-node-list node))
      (with-mode reference-titlepage-verso-mode
	(process-node-list node))))

(define (reference-titlepage-abbrev node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-abstract node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-address node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-affiliation node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-artpagenums node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-author node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-authorblurb node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-authorgroup node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-authorinitials node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-bibliomisc node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-biblioset node side)
  (reference-titlepage node side))
(define (reference-titlepage-bookbiblio node side)
  (reference-titlepage node side))
(define (reference-titlepage-citetitle node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-collab node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-confgroup node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-contractnum node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-contractsponsor node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-contrib  node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-copyright node side)
  (reference-titlepage-element node side))

(define (reference-titlepage-corpauthor node side)
  (if (equal? side 'recto)
      (book-titlepage-element node side)
      (if (first-sibling? node)
	  (make paragraph
	    (with-mode book-titlepage-verso-mode
	      (process-node-list
	       (select-elements (children (parent node)) 
				(normalize "corpauthor")))))
	  (empty-sosofo))))

(define (reference-titlepage-corpname node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-date node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-edition node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-editor node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-firstname node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-graphic node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-honorific node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-indexterm node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-invpartnumber node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-isbn node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-issn node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-issuenum node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-itermset node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-keywordset node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-legalnotice node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-lineage node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-mediaobject node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-modespec node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-orgname node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-othercredit node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-othername node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-pagenums node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-printhistory node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-productname node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-productnumber node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-pubdate node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-publisher node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-publishername node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-pubsnumber node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-releaseinfo node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-revhistory node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-seriesinfo node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-seriesvolnums node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-subjectset node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-subtitle node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-surname node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-title node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-titleabbrev node side)
  (reference-titlepage-element node side))
(define (reference-titlepage-volumenum node side)
  (reference-titlepage-element node side))

(define reference-titlepage-recto-style
  (style
      font-family-name: %title-font-family%
      font-weight: 'bold
      font-size: (HSIZE 1)))

(define reference-titlepage-verso-style
  (style
      font-family-name: %body-font-family%))

(mode reference-titlepage-recto-mode
  (element abbrev
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element abstract
    (make display-group
      use: reference-titlepage-recto-style
      quadding: 'start
      ($semiformal-object$)))

  (element (abstract title) (empty-sosofo))

  (element (abstract para)
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element address 
    (make display-group
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make display-group
      use: reference-titlepage-recto-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element author
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
	  use: reference-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element authorblurb
    (make display-group
      use: reference-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element (authorblurb para)
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: 'start
      (process-children)))

  (element authorgroup
    (make display-group
      (process-children)))

  (element authorinitials
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element confgroup
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractnum
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element contrib
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element copyright
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      space-before: (* (HSIZE 2) %head-before-factor%)
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    (make sequence
      (make paragraph
        use: reference-titlepage-recto-style
	font-size: (HSIZE 3)
	line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	space-before: (* (HSIZE 2) %head-before-factor%)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(process-children))
      ;; This paragraph is a hack to get the spacing right.
      ;; Authors always have an affiliation paragraph below them, even if
      ;; it's empty, so corpauthors need one too.
      (make paragraph
        use: reference-titlepage-recto-style
	font-size: (HSIZE 1)
	line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	space-after: (* (HSIZE 2) %head-after-factor% 4)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	(literal "\no-break-space;"))))

  (element corpname
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element date
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element edition
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    (let ((editor-name (author-string)))
      (make sequence      
	(if (first-sibling?) 
	    (make paragraph
              use: reference-titlepage-recto-style
	      font-size: (HSIZE 1)
	      line-spacing: (* (HSIZE 1) %line-spacing-factor%)
	      space-before: (* (HSIZE 2) %head-before-factor% 6)
	      quadding: %division-title-quadding%
	      keep-with-next?: #t
	      (literal (gentext-edited-by)))
	    (empty-sosofo))
	(make paragraph
          use: reference-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-after: (* (HSIZE 2) %head-after-factor% 4)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal editor-name)))))

  (element firstname
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'center)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element isbn
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issn
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element issuenum
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element jobtitle
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: reference-titlepage-recto-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para)
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: 'start
      line-spacing: (* 0.8 (inherited-line-spacing))
      font-size: (* 0.8 (inherited-font-size))
      (process-children)))

  (element lineage
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element orgname
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element othercredit
    (let ((author-name  (author-string))
	  (author-affil (select-elements (children (current-node)) 
					 (normalize "affiliation"))))
      (make sequence      
	(make paragraph
	  use: reference-titlepage-recto-style
	  font-size: (HSIZE 3)
	  line-spacing: (* (HSIZE 3) %line-spacing-factor%)
	  space-before: (* (HSIZE 2) %head-before-factor%)
	  quadding: %division-title-quadding%
	  keep-with-next?: #t
	  (literal author-name))
	(process-node-list author-affil))))

  (element othername
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pagenums
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element printhistory
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productname
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element productnumber
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubdate
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publisher
    (make display-group
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element publishername
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: reference-titlepage-recto-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: reference-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: reference-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: reference-titlepage-recto-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: reference-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: reference-titlepage-recto-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		(else (empty-sosofo)))))))) 
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element shortaffil
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle 
    (make paragraph
      use: reference-titlepage-recto-style
      font-size: (HSIZE 4)
      line-spacing: (* (HSIZE 4) %line-spacing-factor%)
      space-before: (* (HSIZE 4) %head-before-factor%)
      quadding: %division-subtitle-quadding%
      keep-with-next?: #t
      (process-children-trim)))

  (element surname
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))

  (element title
    (let ((ref (ancestor-member (current-node)
				(list (normalize "reference")))))
      (make paragraph
        use: reference-titlepage-recto-style
	font-size: (HSIZE 5)
	line-spacing: (* (HSIZE 5) %line-spacing-factor%)
	space-before: (* (HSIZE 5) %head-before-factor%)
	quadding: %division-title-quadding%
	keep-with-next?: #t
	heading-level: (if %generate-heading-level% 1 0)
	(literal (element-label ref)
		 (gentext-label-title-sep (gi ref)))
	(with-mode title-mode
	  (process-children)))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: reference-titlepage-recto-style
      quadding: %division-title-quadding%
      (process-children)))
)

(mode reference-titlepage-verso-mode
  (element abbrev
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element abstract ($semiformal-object$))

  (element (abstract title) (empty-sosofo))

  (element address 
    (make display-group
      use: reference-titlepage-verso-style
      (with-mode titlepage-address-mode 
	($linespecific-display$ %indent-address-lines% %number-address-lines%))))

  (element affiliation
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element artpagenums
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element author
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element authorblurb
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element authorgroup
    (make paragraph
      space-after: (* %bf-size% %line-spacing-factor%)
      (make sequence
	(literal (gentext-by))
	(literal "\no-break-space;")
	(process-children-trim))))

  (element authorinitials
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element bibliomisc (process-children))

  (element bibliomset (process-children))

  (element collab
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element confgroup
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element contractnum
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element contractsponsor
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element contrib
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element copyright
    (make paragraph
      use: reference-titlepage-verso-style
      (literal (gentext-element-name (current-node)))
      (literal "\no-break-space;")
      (literal (dingbat "copyright"))
      (literal "\no-break-space;")
      (process-children)))

  (element (copyright year)
    (make sequence
      (process-children)
      (if (not (last-sibling? (current-node)))
	  (literal ", ")
	  (literal " "))))

  (element (copyright holder) ($charseq$))

  (element corpauthor
    ;; note: reference-titlepage-corpauthor takes care of wrapping multiple
    ;; corpauthors
    (make sequence
      (if (first-sibling?)
	  (if (equal? (gi (parent (current-node))) (normalize "authorgroup"))
	      (empty-sosofo)
	      (literal (gentext-by) " "))
	  (literal ", "))
      (process-children)))

  (element corpname
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element date
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element edition
    (make paragraph
      (process-children)
      (literal "\no-break-space;")
      (literal (gentext-element-name-space (gi (current-node))))))

  (element editor
    ;; Print the editor name.
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (or #t (not in-group)) ; nevermind, always put out the Edited by
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-edited-by))
	      (literal "\no-break-space;")
	      (literal (author-string))))
	  (make sequence 
	    (literal (author-string))))))

  (element firstname
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element graphic
    (let* ((nd (current-node))
	   (fileref (attribute-string "fileref" nd))
	   (entityref (attribute-string "entityref" nd))
	   (format (attribute-string "format" nd))
	   (align (attribute-string "align" nd)))
      (if (or fileref entityref) 
	  (make external-graphic
	    notation-system-id: (if format format "")
	    entity-system-id: (if fileref 
				  (graphic-file fileref)
				  (if entityref 
				      (entity-generated-system-id entityref)
				      ""))
	    display?: #t
	    display-alignment: 'start)
	  (empty-sosofo))))

  (element honorific
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element isbn
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element issn
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element itermset (empty-sosofo))

  (element invpartnumber
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element issuenum
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element jobtitle
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element keywordset
    (make paragraph
      quadding: 'start
      (make sequence
	font-weight: 'bold
	(literal "Keywords: "))
      (process-children)))

  (element (keyword)
    (make sequence
      (process-children)
      (if (not (last-sibling?))
	  (literal ", ")
	  (literal ""))))

  (element legalnotice
    (make display-group
      use: reference-titlepage-verso-style
      ($semiformal-object$)))

  (element (legalnotice title) (empty-sosofo))

  (element (legalnotice para) 
    (make paragraph
      use: reference-titlepage-verso-style
      font-size: (* (inherited-font-size) 0.8)
      (process-children-trim)))

  (element lineage
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element modespec (empty-sosofo))

  (element orgdiv
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element orgname
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element othercredit
    ;; Print the author name.  Handle the case where there's no AUTHORGROUP
    (let ((in-group (have-ancestor? (normalize "authorgroup") (current-node))))
      (if (not in-group)
	  (make paragraph
	    ;; Hack to get the spacing right below the author name line...
	    space-after: (* %bf-size% %line-spacing-factor%)
	    (make sequence
	      (literal (gentext-by))
	      (literal "\no-break-space;")
	      (literal (author-list-string))))
	  (make sequence 
	    (literal (author-list-string))))))  

  (element othername
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element pagenums
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element printhistory
    (make display-group
      use: reference-titlepage-verso-style
      (process-children)))

  (element productname
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element productnumber
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element pubdate
    (make paragraph
      (literal (gentext-element-name-space (gi (current-node))))
      (process-children)))

  (element publisher
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element publishername
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element pubsnumber
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element releaseinfo
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element revhistory
    (make sequence
      (make paragraph
	use: reference-titlepage-verso-style
	space-before: (* (HSIZE 3) %head-before-factor%)
	space-after: (/ (* (HSIZE 1) %head-before-factor%) 2)
	(literal (gentext-element-name (current-node))))
      (make table
	before-row-border: #f
	(process-children))))
  
  (element (revhistory revision)
    (let ((revnumber (select-elements (descendants (current-node)) 
				      (normalize "revnumber")))
	  (revdate   (select-elements (descendants (current-node)) 
				      (normalize "date")))
	  (revauthor (select-elements (descendants (current-node))
				      (normalize "authorinitials")))
	  (revremark (select-elements (descendants (current-node))
				      (normalize "revremark")))
	  (revdescription (select-elements (descendants (current-node))
				      (normalize "revdescription"))))
      (make sequence
	(make table-row
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (if (not (node-list-empty? revnumber))
		(make paragraph
		  use: reference-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-element-name-space (current-node)))
		  (process-node-list revnumber))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 2
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revdate))
		(make paragraph
		  use: reference-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (process-node-list revdate))
		(empty-sosofo)))
	  (make table-cell
	    column-number: 3
	    n-columns-spanned: 1
	    n-rows-spanned: 1
	    start-indent: 0pt
	    cell-before-column-margin: (if (equal? (print-backend) 'tex)
					   6pt
					   0pt)
	    (if (not (node-list-empty? revauthor))
		(make paragraph
		  use: reference-titlepage-verso-style
		  font-size: %bf-size%
		  font-weight: 'medium
		  (literal (gentext-revised-by))
		  (process-node-list revauthor))
		(empty-sosofo))))
	(make table-row
	  cell-after-row-border: #f
	  (make table-cell
	    column-number: 1
	    n-columns-spanned: 3
	    n-rows-spanned: 1
	    start-indent: 0pt
	    (cond ((not (node-list-empty? revremark))
		   (make paragraph
		     use: reference-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     space-after: (if (last-sibling?) 
				      0pt
				      (/ %block-sep% 2))
		     (process-node-list revremark)))
		  ((not (node-list-empty? revdescription))
		   (make sequence
		     use: reference-titlepage-verso-style
		     font-size: %bf-size%
		     font-weight: 'medium
		     (process-node-list revdescription)))
		(else (empty-sosofo)))))))) 
  
  (element (revision revnumber) (process-children-trim))
  (element (revision date) (process-children-trim))
  (element (revision authorinitials) (process-children-trim))
  (element (revision revremark) (process-children-trim))
  (element (revision revdescription) (process-children))

  (element seriesvolnums
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element shortaffil
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element subjectset (empty-sosofo))

  (element subtitle
    (make sequence
      font-family-name: %title-font-family%
      font-weight: 'bold
      (literal (if (first-sibling?) ": " "; "))
      (process-children)))

  (element surname
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

  (element title
    (let ((ref (ancestor-member (current-node)
				(list (normalize "reference")))))
      (make sequence
        font-family-name: %title-font-family%
        font-weight: 'bold
	(literal (element-label ref)
		 (gentext-label-title-sep (gi ref)))
	(with-mode title-mode
	  (process-children)))))

  (element formalpara ($para-container$))
  (element (formalpara title) ($runinhead$))
  (element (formalpara para) (make sequence (process-children)))

  (element titleabbrev (empty-sosofo))

  (element volumenum
    (make paragraph
      use: reference-titlepage-verso-style
      (process-children)))

)