mirror of
				https://github.com/smarty-php/smarty.git
				synced 2025-11-04 14:21:36 +01:00 
			
		
		
		
	
		
			
	
	
		
			1905 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			1905 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								;; $Id$
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; This file is part of the Modular DocBook Stylesheet distribution.
							 | 
						||
| 
								 | 
							
								;; See ../README or http://nwalsh.com/docbook/dsssl/
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; This file contains general functions common to both print and HTML
							 | 
						||
| 
								 | 
							
								;; versions of the DocBook stylesheets.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; If **ANY** change is made to this file, you _MUST_ alter the
							 | 
						||
| 
								 | 
							
								;; following definition:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define %docbook-common-version%
							 | 
						||
| 
								 | 
							
								  "Modular DocBook Stylesheet Common Functions")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; === element lists ====================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; these have to be functions because they have to be evaluated when
							 | 
						||
| 
								 | 
							
								;; there is a current-node so that normalize can know what declaration
							 | 
						||
| 
								 | 
							
								;; is in effect
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (set-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "set")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (book-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (division-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (component-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "preface")
							 | 
						||
| 
								 | 
							
									(normalize "chapter")
							 | 
						||
| 
								 | 
							
									(normalize "appendix") 
							 | 
						||
| 
								 | 
							
									(normalize "article")
							 | 
						||
| 
								 | 
							
									(normalize "glossary")
							 | 
						||
| 
								 | 
							
									(normalize "bibliography")
							 | 
						||
| 
								 | 
							
									(normalize "index")
							 | 
						||
| 
								 | 
							
									(normalize "colophon")
							 | 
						||
| 
								 | 
							
									(normalize "setindex")
							 | 
						||
| 
								 | 
							
									(normalize "reference")
							 | 
						||
| 
								 | 
							
									(normalize "refentry")
							 | 
						||
| 
								 | 
							
									(normalize "book"))) ;; just in case nothing else matches...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (major-component-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "preface")
							 | 
						||
| 
								 | 
							
									(normalize "chapter") 
							 | 
						||
| 
								 | 
							
									(normalize "appendix") 
							 | 
						||
| 
								 | 
							
									(normalize "article")
							 | 
						||
| 
								 | 
							
									(normalize "glossary")
							 | 
						||
| 
								 | 
							
									(normalize "bibliography")
							 | 
						||
| 
								 | 
							
									(normalize "index")
							 | 
						||
| 
								 | 
							
									(normalize "colophon")
							 | 
						||
| 
								 | 
							
									(normalize "setindex")
							 | 
						||
| 
								 | 
							
									(normalize "reference")
							 | 
						||
| 
								 | 
							
									(normalize "refentry")
							 | 
						||
| 
								 | 
							
									(normalize "part")
							 | 
						||
| 
								 | 
							
									(normalize "book"))) ;; just in case nothing else matches...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (section-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "sect1")
							 | 
						||
| 
								 | 
							
									(normalize "sect2")
							 | 
						||
| 
								 | 
							
									(normalize "sect3") 
							 | 
						||
| 
								 | 
							
									(normalize "sect4")
							 | 
						||
| 
								 | 
							
									(normalize "sect5")
							 | 
						||
| 
								 | 
							
									(normalize "section")
							 | 
						||
| 
								 | 
							
									(normalize "simplesect")
							 | 
						||
| 
								 | 
							
									(normalize "refsect1") 
							 | 
						||
| 
								 | 
							
									(normalize "refsect2") 
							 | 
						||
| 
								 | 
							
									(normalize "refsect3")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (block-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "example") 
							 | 
						||
| 
								 | 
							
									(normalize "figure") 
							 | 
						||
| 
								 | 
							
									(normalize "table") 
							 | 
						||
| 
								 | 
							
									(normalize "equation") 
							 | 
						||
| 
								 | 
							
									(normalize "procedure")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (outer-parent-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "toc") 
							 | 
						||
| 
								 | 
							
									(normalize "lot") 
							 | 
						||
| 
								 | 
							
									(normalize "appendix") 
							 | 
						||
| 
								 | 
							
									(normalize "chapter") 
							 | 
						||
| 
								 | 
							
									(normalize "part") 
							 | 
						||
| 
								 | 
							
									(normalize "preface") 
							 | 
						||
| 
								 | 
							
									(normalize "reference")
							 | 
						||
| 
								 | 
							
									(normalize "bibliography") 
							 | 
						||
| 
								 | 
							
									(normalize "glossary") 
							 | 
						||
| 
								 | 
							
									(normalize "index") 
							 | 
						||
| 
								 | 
							
									(normalize "setindex")
							 | 
						||
| 
								 | 
							
									(normalize "sect1") 
							 | 
						||
| 
								 | 
							
									(normalize "sect2") 
							 | 
						||
| 
								 | 
							
									(normalize "sect3") 
							 | 
						||
| 
								 | 
							
									(normalize "sect4") 
							 | 
						||
| 
								 | 
							
									(normalize "sect5") 
							 | 
						||
| 
								 | 
							
									(normalize "simplesect")
							 | 
						||
| 
								 | 
							
									(normalize "partintro") 
							 | 
						||
| 
								 | 
							
									(normalize "bibliodiv") 
							 | 
						||
| 
								 | 
							
									(normalize "glossdiv") 
							 | 
						||
| 
								 | 
							
									(normalize "indexdiv")
							 | 
						||
| 
								 | 
							
									(normalize "refentry") 
							 | 
						||
| 
								 | 
							
									(normalize "refsect1") 
							 | 
						||
| 
								 | 
							
									(normalize "refsect2") 
							 | 
						||
| 
								 | 
							
									(normalize "refsect3")
							 | 
						||
| 
								 | 
							
									(normalize "msgtext") 
							 | 
						||
| 
								 | 
							
									(normalize "msgexplan")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (list-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "orderedlist") 
							 | 
						||
| 
								 | 
							
									(normalize "itemizedlist") 
							 | 
						||
| 
								 | 
							
									(normalize "variablelist") 
							 | 
						||
| 
								 | 
							
									(normalize "segmentedlist")
							 | 
						||
| 
								 | 
							
								        (normalize "simplelist") 
							 | 
						||
| 
								 | 
							
									(normalize "calloutlist") 
							 | 
						||
| 
								 | 
							
									(normalize "step")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (info-element-list)
							 | 
						||
| 
								 | 
							
								  (list (normalize "appendixinfo")
							 | 
						||
| 
								 | 
							
									(normalize "articleinfo")
							 | 
						||
| 
								 | 
							
									(normalize "bibliographyinfo")
							 | 
						||
| 
								 | 
							
									(normalize "bookinfo")
							 | 
						||
| 
								 | 
							
									(normalize "chapterinfo")
							 | 
						||
| 
								 | 
							
									(normalize "glossaryinfo")
							 | 
						||
| 
								 | 
							
									(normalize "indexinfo")
							 | 
						||
| 
								 | 
							
									(normalize "objectinfo")
							 | 
						||
| 
								 | 
							
									(normalize "partinfo")
							 | 
						||
| 
								 | 
							
									(normalize "prefaceinfo")
							 | 
						||
| 
								 | 
							
									(normalize "refentryinfo")
							 | 
						||
| 
								 | 
							
									(normalize "referenceinfo")
							 | 
						||
| 
								 | 
							
									(normalize "refsect1info")
							 | 
						||
| 
								 | 
							
									(normalize "refsect2info")
							 | 
						||
| 
								 | 
							
									(normalize "refsect3info")
							 | 
						||
| 
								 | 
							
									(normalize "refsynopsisdivinfo")
							 | 
						||
| 
								 | 
							
									(normalize "sect1info")
							 | 
						||
| 
								 | 
							
									(normalize "sect2info")
							 | 
						||
| 
								 | 
							
									(normalize "sect3info")
							 | 
						||
| 
								 | 
							
									(normalize "sect4info")
							 | 
						||
| 
								 | 
							
									(normalize "sect5info")
							 | 
						||
| 
								 | 
							
									(normalize "sectioninfo")
							 | 
						||
| 
								 | 
							
									(normalize "setindexinfo")
							 | 
						||
| 
								 | 
							
									(normalize "setinfo")
							 | 
						||
| 
								 | 
							
									(normalize "sidebarinfo")
							 | 
						||
| 
								 | 
							
									;; historical
							 | 
						||
| 
								 | 
							
									(normalize "artheader")
							 | 
						||
| 
								 | 
							
									(normalize "docinfo")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; === automatic TOC ====================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; Returns #t if nd should appear in the auto TOC
							 | 
						||
| 
								 | 
							
								(define (appears-in-auto-toc? nd)
							 | 
						||
| 
								 | 
							
								  (if (or (equal? (gi nd) (normalize "refsect1"))
							 | 
						||
| 
								 | 
							
									  (have-ancestor? (normalize "refsect1") nd))
							 | 
						||
| 
								 | 
							
								      #f
							 | 
						||
| 
								 | 
							
								      #t))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; # return elements of nl for which appears-in-auto-toc? is #t
							 | 
						||
| 
								 | 
							
								(define (toc-list-filter nodelist)
							 | 
						||
| 
								 | 
							
								  (let loop ((toclist (empty-node-list)) (nl nodelist))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
									toclist
							 | 
						||
| 
								 | 
							
									(if (appears-in-auto-toc? (node-list-first nl))
							 | 
						||
| 
								 | 
							
									    (loop (node-list toclist (node-list-first nl))
							 | 
						||
| 
								 | 
							
										  (node-list-rest nl))
							 | 
						||
| 
								 | 
							
									    (loop toclist (node-list-rest nl))))))
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								;; === common ===========================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (INLIST?)
							 | 
						||
| 
								 | 
							
								  (has-ancestor-member? (current-node) (list-element-list)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (INBLOCK?)
							 | 
						||
| 
								 | 
							
								  (has-ancestor-member? (current-node) 
							 | 
						||
| 
								 | 
							
											(list (normalize "example") 
							 | 
						||
| 
								 | 
							
											      (normalize "informalexample")
							 | 
						||
| 
								 | 
							
											      (normalize "figure") 
							 | 
						||
| 
								 | 
							
											      (normalize "informalfigure")
							 | 
						||
| 
								 | 
							
											      (normalize "equation")
							 | 
						||
| 
								 | 
							
											      (normalize "informalequation")
							 | 
						||
| 
								 | 
							
											      (normalize "funcsynopsis")
							 | 
						||
| 
								 | 
							
											      (normalize "programlistingco")
							 | 
						||
| 
								 | 
							
											      (normalize "screenco")
							 | 
						||
| 
								 | 
							
											      (normalize "graphicco"))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (PARNUM)
							 | 
						||
| 
								 | 
							
								  (child-number (parent (current-node))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (NESTEDFNUM n fmt)
							 | 
						||
| 
								 | 
							
								  (if (number? n)
							 | 
						||
| 
								 | 
							
								      (format-number n fmt)
							 | 
						||
| 
								 | 
							
								      #f))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (FNUM n) (NESTEDFNUM n "1"))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (book-start?)
							 | 
						||
| 
								 | 
							
								  ;; Returns #t if the current-node is in the first division or 
							 | 
						||
| 
								 | 
							
								  ;; component of a book.
							 | 
						||
| 
								 | 
							
								  (let ((book (ancestor (normalize "book")))
							 | 
						||
| 
								 | 
							
									(nd   (ancestor-member 
							 | 
						||
| 
								 | 
							
									       (current-node) 
							 | 
						||
| 
								 | 
							
									       (append (component-element-list) (division-element-list)))))
							 | 
						||
| 
								 | 
							
								    (let loop ((ch (children book)))
							 | 
						||
| 
								 | 
							
								      (if (node-list-empty? ch)
							 | 
						||
| 
								 | 
							
									  #f
							 | 
						||
| 
								 | 
							
									  (if (member (gi (node-list-first ch)) 
							 | 
						||
| 
								 | 
							
										      (append (component-element-list) (division-element-list)))
							 | 
						||
| 
								 | 
							
									      (node-list=? (node-list-first ch) nd)
							 | 
						||
| 
								 | 
							
									      (loop (node-list-rest ch)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (first-chapter?)
							 | 
						||
| 
								 | 
							
								  ;; Returns #t if the current-node is in the first chapter of a book
							 | 
						||
| 
								 | 
							
								  (let* ((book (ancestor (normalize "book")))
							 | 
						||
| 
								 | 
							
									 (nd   (ancestor-member 
							 | 
						||
| 
								 | 
							
										(current-node) 
							 | 
						||
| 
								 | 
							
										(append (component-element-list) (division-element-list))))
							 | 
						||
| 
								 | 
							
									 (bookch (children book))
							 | 
						||
| 
								 | 
							
									 (bookcomp (expand-children bookch (list (normalize "part")))))
							 | 
						||
| 
								 | 
							
								    (let loop ((nl bookcomp))
							 | 
						||
| 
								 | 
							
								      (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
									  #f
							 | 
						||
| 
								 | 
							
									  (if (equal? (gi (node-list-first nl)) (normalize "chapter"))
							 | 
						||
| 
								 | 
							
									      (if (node-list=? (node-list-first nl) nd)
							 | 
						||
| 
								 | 
							
										  #t
							 | 
						||
| 
								 | 
							
										  #f)
							 | 
						||
| 
								 | 
							
									      (loop (node-list-rest nl)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; === bibliographic ====================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; Localized author-string
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (author-list-string #!optional (author (current-node)))
							 | 
						||
| 
								 | 
							
								  ;; Return a formatted string representation of the contents of AUTHOR
							 | 
						||
| 
								 | 
							
								  ;; *including appropriate punctuation* if the AUTHOR occurs in a list
							 | 
						||
| 
								 | 
							
								  ;; of AUTHORs in an AUTHORGROUP:
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  ;;   John Doe
							 | 
						||
| 
								 | 
							
								  ;; or
							 | 
						||
| 
								 | 
							
								  ;;   John Doe and Jane Doe
							 | 
						||
| 
								 | 
							
								  ;; or
							 | 
						||
| 
								 | 
							
								  ;;   John Doe, Jane Doe, and A. Nonymous
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (let* ((author-node-list (select-elements
							 | 
						||
| 
								 | 
							
											    (descendants 
							 | 
						||
| 
								 | 
							
											     (ancestor (normalize "authorgroup") author))
							 | 
						||
| 
								 | 
							
											    (normalize "author")))
							 | 
						||
| 
								 | 
							
									 (corpauthor-node-list (select-elements
							 | 
						||
| 
								 | 
							
												(descendants 
							 | 
						||
| 
								 | 
							
												 (ancestor (normalize "authorgroup") author))
							 | 
						||
| 
								 | 
							
												(normalize "corpauthor")))
							 | 
						||
| 
								 | 
							
									 (othercredit-node-list (select-elements
							 | 
						||
| 
								 | 
							
												 (descendants 
							 | 
						||
| 
								 | 
							
												  (ancestor (normalize "authorgroup") author))
							 | 
						||
| 
								 | 
							
												 (normalize "othercredit")))
							 | 
						||
| 
								 | 
							
									 (editor-node-list (select-elements
							 | 
						||
| 
								 | 
							
											    (descendants 
							 | 
						||
| 
								 | 
							
											     (ancestor (normalize "authorgroup")))
							 | 
						||
| 
								 | 
							
											    (normalize "editor")))
							 | 
						||
| 
								 | 
							
									 (author-count (if (have-ancestor? (normalize "authorgroup") author)
							 | 
						||
| 
								 | 
							
											   (+ (node-list-length author-node-list)
							 | 
						||
| 
								 | 
							
											      (node-list-length corpauthor-node-list)
							 | 
						||
| 
								 | 
							
											      (node-list-length othercredit-node-list)
							 | 
						||
| 
								 | 
							
											      (node-list-length editor-node-list))
							 | 
						||
| 
								 | 
							
											   1))
							 | 
						||
| 
								 | 
							
									 (this-count (if (have-ancestor? (normalize "authorgroup") author)
							 | 
						||
| 
								 | 
							
											 (+ (node-list-length (preced author)) 1)
							 | 
						||
| 
								 | 
							
											 1)))
							 | 
						||
| 
								 | 
							
								    (string-append
							 | 
						||
| 
								 | 
							
								     (if (and (> author-count 1)
							 | 
						||
| 
								 | 
							
									      (last-sibling? author))
							 | 
						||
| 
								 | 
							
									 (string-append (gentext-and) " ")
							 | 
						||
| 
								 | 
							
									 "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     (author-string author)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								     (if (> author-count 2)
							 | 
						||
| 
								 | 
							
									 (if (> (- author-count this-count) 1)
							 | 
						||
| 
								 | 
							
									     (gentext-listcomma)
							 | 
						||
| 
								 | 
							
									     (if (= (- author-count this-count) 1)
							 | 
						||
| 
								 | 
							
										 (gentext-lastlistcomma)
							 | 
						||
| 
								 | 
							
										 ""))
							 | 
						||
| 
								 | 
							
									 "")
							 | 
						||
| 
								 | 
							
								     (if (and (> author-count 1)
							 | 
						||
| 
								 | 
							
									      (not (last-sibling? author)))
							 | 
						||
| 
								 | 
							
									 " "
							 | 
						||
| 
								 | 
							
									 ""))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; === procedures =======================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define ($proc-hierarch-number-format$ depth)
							 | 
						||
| 
								 | 
							
								  (case (modulo depth 5)
							 | 
						||
| 
								 | 
							
								    ((1) "1")
							 | 
						||
| 
								 | 
							
								    ((2) "a")
							 | 
						||
| 
								 | 
							
								    ((3) "i")
							 | 
						||
| 
								 | 
							
								    ((4) "A")
							 | 
						||
| 
								 | 
							
								    (else "I")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define ($proc-hierarch-number$ nd seperator)
							 | 
						||
| 
								 | 
							
								  (if (equal? (gi nd) (normalize "step"))
							 | 
						||
| 
								 | 
							
								      (string-append
							 | 
						||
| 
								 | 
							
								       (format-number
							 | 
						||
| 
								 | 
							
									(child-number nd) 
							 | 
						||
| 
								 | 
							
									($proc-hierarch-number-format$ ($proc-step-depth$ nd)))
							 | 
						||
| 
								 | 
							
								       seperator)
							 | 
						||
| 
								 | 
							
								      ""))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define ($proc-step-depth$ nd)
							 | 
						||
| 
								 | 
							
								  (let loop ((step nd) (depth 0))
							 | 
						||
| 
								 | 
							
								    (if (equal? (gi step) (normalize "procedure"))
							 | 
						||
| 
								 | 
							
									depth
							 | 
						||
| 
								 | 
							
									(loop (parent step) 
							 | 
						||
| 
								 | 
							
									      (if (equal? (gi step) (normalize "step"))
							 | 
						||
| 
								 | 
							
										  (+ depth 1)
							 | 
						||
| 
								 | 
							
										  depth)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define ($proc-step-number$ nd)
							 | 
						||
| 
								 | 
							
								  (let* ((step (if (equal? (gi nd) (normalize "step")) nd (parent nd)))
							 | 
						||
| 
								 | 
							
									 (str ($proc-hierarch-number$ step "")))
							 | 
						||
| 
								 | 
							
								    (string-append str (gentext-label-title-sep (normalize "step")))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define ($proc-step-xref-number$ nd)
							 | 
						||
| 
								 | 
							
								  (let loop ((step nd) (str "") (first #t))
							 | 
						||
| 
								 | 
							
								    (if (equal? (gi step) (normalize "procedure"))
							 | 
						||
| 
								 | 
							
									str
							 | 
						||
| 
								 | 
							
									(loop (parent step) 
							 | 
						||
| 
								 | 
							
									      (if (equal? (gi step) (normalize "step"))
							 | 
						||
| 
								 | 
							
										  (string-append 
							 | 
						||
| 
								 | 
							
										   ($proc-hierarch-number$ step
							 | 
						||
| 
								 | 
							
												      (if first
							 | 
						||
| 
								 | 
							
													  ""
							 | 
						||
| 
								 | 
							
													  (gentext-intra-label-sep (normalize "step"))))
							 | 
						||
| 
								 | 
							
										   str)
							 | 
						||
| 
								 | 
							
										  str)
							 | 
						||
| 
								 | 
							
									      (if (equal? (gi step) (normalize "step"))
							 | 
						||
| 
								 | 
							
										  #f
							 | 
						||
| 
								 | 
							
										  first)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; === sections =========================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (section-level-by-gi chunked? gi)
							 | 
						||
| 
								 | 
							
								  ;; Figure out the heading level of an element by its name.  We need
							 | 
						||
| 
								 | 
							
								  ;; to distinguish between the chunked processing mode (for HTML) and
							 | 
						||
| 
								 | 
							
								  ;; the non-chunked (print or HTML).  It is important that no heading
							 | 
						||
| 
								 | 
							
								  ;; level is skipped in a document structure (e.g., sect1 = 2, sect2
							 | 
						||
| 
								 | 
							
								  ;; = 4); this results in broken PDF bookmarks.
							 | 
						||
| 
								 | 
							
								  (if chunked?
							 | 
						||
| 
								 | 
							
								      (cond
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect5")) 5)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect4")) 4)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect3")) 3)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect2")) 2)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect1")) 1)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsect3")) 4)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsect2")) 3)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsect1")) 2)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsynopsisdiv")) 2)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "bibliography")) 1)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "bibliodiv")) 2)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "index")) 1)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "setindex")) 1)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "indexdiv")) 2)
							 | 
						||
| 
								 | 
							
								       (else 1))
							 | 
						||
| 
								 | 
							
								      (cond
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect5")) 6)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect4")) 5)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect3")) 4)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect2")) 3)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "sect1")) 2)
							 | 
						||
| 
								 | 
							
								       ;; The next four are not used by the HTML stylesheets.
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsect3")) 5)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsect2")) 4)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsect1")) 3)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "refsynopsisdiv")) 3)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "bibliography")) 1)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "bibliodiv")) 2)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "index")) 1)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "setindex")) 1)
							 | 
						||
| 
								 | 
							
								       ((equal? gi (normalize "indexdiv")) 2)
							 | 
						||
| 
								 | 
							
								       (else 1))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (section-level-by-node chunked? sect)
							 | 
						||
| 
								 | 
							
								  (if (equal? (gi sect) (normalize "section"))
							 | 
						||
| 
								 | 
							
								      ;; Section is special, it is recursive.
							 | 
						||
| 
								 | 
							
								      (let ((depth (length (hierarchical-number-recursive 
							 | 
						||
| 
								 | 
							
											    (normalize "section")))))
							 | 
						||
| 
								 | 
							
									(if (> depth 5)
							 | 
						||
| 
								 | 
							
									    6
							 | 
						||
| 
								 | 
							
									    (+ depth 1)))
							 | 
						||
| 
								 | 
							
								      (if (equal? (gi sect) (normalize "simplesect"))
							 | 
						||
| 
								 | 
							
									  ;; SimpleSect is special, it should be level "n+1", where "n" is
							 | 
						||
| 
								 | 
							
									  ;; the level of the numbered section that contains it.  If it is
							 | 
						||
| 
								 | 
							
									  ;; the *first* sectioning element in a chapter, make it 
							 | 
						||
| 
								 | 
							
									  ;; %default-simplesect-level%
							 | 
						||
| 
								 | 
							
								          (cond
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "sect5"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "sect5"))))
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "sect4"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "sect4"))))
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "sect3"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "sect3"))))
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "sect2"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "sect2"))))
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "sect1"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "sect1"))))
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "refsect3"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "refsect3"))))
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "refsect2"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "refsect2"))))
							 | 
						||
| 
								 | 
							
								           ((have-ancestor? (normalize "refsect1"))
							 | 
						||
| 
								 | 
							
									    (+ 1 (section-level-by-gi chunked? (normalize "refsect1"))))
							 | 
						||
| 
								 | 
							
								           (else %default-simplesect-level%))
							 | 
						||
| 
								 | 
							
									  ;; the rest of the section elements can be identified by name
							 | 
						||
| 
								 | 
							
									  (section-level-by-gi chunked? (gi sect)))))
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								;; === synopsis =========================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; The following definitions match those given in the reference
							 | 
						||
| 
								 | 
							
								;; documentation for DocBook V3.0
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-opt-open-str% "[")
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-opt-close-str% "]")
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-req-open-str% "{")
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-req-close-str% "}")
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-plain-open-str% " ")
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-plain-close-str% " ")
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-def-open-str% "[")
							 | 
						||
| 
								 | 
							
								(define	%arg-choice-def-close-str% "]")
							 | 
						||
| 
								 | 
							
								(define	%arg-rep-repeat-str% "...")
							 | 
						||
| 
								 | 
							
								(define	%arg-rep-norepeat-str% "")
							 | 
						||
| 
								 | 
							
								(define	%arg-rep-def-str% "")
							 | 
						||
| 
								 | 
							
								(define %arg-or-sep% " | ")
							 | 
						||
| 
								 | 
							
								(define %cmdsynopsis-hanging-indent% 4pi)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; === linking ==========================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; From the DocBook V3.0 Reference entry for element XREF:
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; Description
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;;   Cross reference link to another part of the document. XRef is empty,
							 | 
						||
| 
								 | 
							
								;;   and has common, Linkend, and Endterm attributes.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;;   Processing Expectations
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;;   XRef must have a Linkend, but the Endterm is optional. If it is used,
							 | 
						||
| 
								 | 
							
								;;   the content of the element it points to is displayed as the text of
							 | 
						||
| 
								 | 
							
								;;   the cross reference; if it is absent, the XRefLabel of the
							 | 
						||
| 
								 | 
							
								;;   cross-referenced object is displayed.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; If neither the ENDTERM nor the XREFLABEL is present, then the cross
							 | 
						||
| 
								 | 
							
								;; reference text is taken from the (gentext-xref-strings) function
							 | 
						||
| 
								 | 
							
								;; in the localization file, like this
							 | 
						||
| 
								 | 
							
								;; 
							 | 
						||
| 
								 | 
							
								;; A cross reference to an element, the target, begins with the
							 | 
						||
| 
								 | 
							
								;; text returned by (gentext-xref-strings (gi target)).  Within
							 | 
						||
| 
								 | 
							
								;; that text, the following substitutions are made:
							 | 
						||
| 
								 | 
							
								;; 
							 | 
						||
| 
								 | 
							
								;; %p is replaced by the number of the page on which target occurs
							 | 
						||
| 
								 | 
							
								;; %g is replaced by the (gentext-element-name)
							 | 
						||
| 
								 | 
							
								;; %n is replaced by the label
							 | 
						||
| 
								 | 
							
								;; %t is replaced by the title
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; After the "direct" cross reference, a number of indirect references
							 | 
						||
| 
								 | 
							
								;; are possible.  If the target element is in a different block, section,
							 | 
						||
| 
								 | 
							
								;; component, division, or book an indirect cross reference may be made.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; The indirect cross reference will only be made if
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;;   (auto-xref-indirect? target ancestor) 
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; returns #t. The indirect reference is created by appending the
							 | 
						||
| 
								 | 
							
								;; connect returned by (auto-xref-indirect-connector) to the direct
							 | 
						||
| 
								 | 
							
								;; reference and then adding a direct refernce to the ancestor.
							 | 
						||
| 
								 | 
							
								;; The process is repeated for each ancestral element.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; For example, if a direct reference to a section returns
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;;    "the section called %t"
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; and a direct reference to a chapter returns 
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;;    "Chapter %n"
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; and (auto-xref-indirect? sect1 chapter) returns #t, and 
							 | 
						||
| 
								 | 
							
								;; (auto-xref-indirect-connector chapter) returns "in", then
							 | 
						||
| 
								 | 
							
								;; an xref to a section in another chapter will be:
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;;    "the section called %t in Chapter %n"
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; Where %t and %n will be filled in accordingly.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (auto-xref-indirect? target ancestor)
							 | 
						||
| 
								 | 
							
								  ;; This function answers the question: should an indirect reference
							 | 
						||
| 
								 | 
							
								  ;; to ancestor be made for target?  For example:
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  ;; (auto-xref-indirect? SECT1 CHAP)
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  ;; should return #t iff a reference of the form "in [CHAP-xref]" should
							 | 
						||
| 
								 | 
							
								  ;; be generated for a reference to SECT1 if SECT1 is in a different
							 | 
						||
| 
								 | 
							
								  ;; chapter than the XREF to SECT1.
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  ;; This function _does not_ have to consider the case of whether or
							 | 
						||
| 
								 | 
							
								  ;; not target and the xref are in the same ancestor.  
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  (cond
							 | 
						||
| 
								 | 
							
								   ;; Always add indirect references to another book
							 | 
						||
| 
								 | 
							
								   ((member (gi ancestor) (book-element-list))
							 | 
						||
| 
								 | 
							
								    #t)
							 | 
						||
| 
								 | 
							
								   ;; Add indirect references to the section or component a block
							 | 
						||
| 
								 | 
							
								   ;; is in iff chapters aren't autolabelled.  (Otherwise "Figure 1-3"
							 | 
						||
| 
								 | 
							
								   ;; is sufficient)
							 | 
						||
| 
								 | 
							
								   ((and (member (gi target) (block-element-list))
							 | 
						||
| 
								 | 
							
									 (not %chapter-autolabel%))
							 | 
						||
| 
								 | 
							
								    #t)
							 | 
						||
| 
								 | 
							
								   ;; Add indirect references to the component a section is in if
							 | 
						||
| 
								 | 
							
								   ;; the sections are not autolabelled
							 | 
						||
| 
								 | 
							
								   ((and (member (gi target) (section-element-list))
							 | 
						||
| 
								 | 
							
									 (member (gi ancestor) (component-element-list))
							 | 
						||
| 
								 | 
							
									 (not %section-autolabel%))
							 | 
						||
| 
								 | 
							
								    #t)
							 | 
						||
| 
								 | 
							
								   (else #f)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (auto-xref-direct target 
							 | 
						||
| 
								 | 
							
											  #!optional 
							 | 
						||
| 
								 | 
							
											  (xref-string (gentext-xref-strings target)))
							 | 
						||
| 
								 | 
							
								  (let* ((substitute (list
							 | 
						||
| 
								 | 
							
										      (list "%g"  (element-gi-sosofo target))
							 | 
						||
| 
								 | 
							
										      (list "%n"  (element-label-sosofo target))
							 | 
						||
| 
								 | 
							
										      (list "%p"  (element-page-number-sosofo target))
							 | 
						||
| 
								 | 
							
										      (list "%t"  (element-title-xref-sosofo target))))
							 | 
						||
| 
								 | 
							
									 (tlist   (match-split-list xref-string (assoc-objs substitute))))
							 | 
						||
| 
								 | 
							
								    (string-list-sosofo tlist substitute)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (auto-xref-indirect target 
							 | 
						||
| 
								 | 
							
											    #!optional
							 | 
						||
| 
								 | 
							
											    (xref-string (gentext-xref-strings target)))
							 | 
						||
| 
								 | 
							
								  (make sequence
							 | 
						||
| 
								 | 
							
								    (auto-xref-indirect-connector target)
							 | 
						||
| 
								 | 
							
								    (auto-xref-direct target xref-string)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (auto-xref target 
							 | 
						||
| 
								 | 
							
										   #!optional (xref-string (gentext-xref-strings target)))
							 | 
						||
| 
								 | 
							
								  (let ((source (current-node))
							 | 
						||
| 
								 | 
							
									(cont-blok (ancestor-member target (block-element-list)))
							 | 
						||
| 
								 | 
							
									(cont-sect (ancestor-member target (section-element-list)))
							 | 
						||
| 
								 | 
							
									(cont-comp (ancestor-member target (component-element-list)))
							 | 
						||
| 
								 | 
							
									(cont-divn (ancestor-member target (division-element-list)))
							 | 
						||
| 
								 | 
							
									(cont-book (ancestor-member target (book-element-list))))
							 | 
						||
| 
								 | 
							
								    (make sequence
							 | 
						||
| 
								 | 
							
								      (auto-xref-direct target xref-string)
							 | 
						||
| 
								 | 
							
								      (if (or (node-list=? cont-blok 
							 | 
						||
| 
								 | 
							
											   (ancestor-member source (block-element-list)))
							 | 
						||
| 
								 | 
							
									      (node-list=? cont-blok target)
							 | 
						||
| 
								 | 
							
									      (not (auto-xref-indirect? target cont-blok)))
							 | 
						||
| 
								 | 
							
									  (empty-sosofo)
							 | 
						||
| 
								 | 
							
									  (auto-xref-indirect cont-blok))
							 | 
						||
| 
								 | 
							
								      (if (or (node-list=? cont-sect 
							 | 
						||
| 
								 | 
							
											   (ancestor-member source (section-element-list)))
							 | 
						||
| 
								 | 
							
									      (node-list=? cont-sect target)
							 | 
						||
| 
								 | 
							
									      (not (auto-xref-indirect? target cont-sect)))
							 | 
						||
| 
								 | 
							
									  (empty-sosofo)
							 | 
						||
| 
								 | 
							
									  (auto-xref-indirect cont-sect))
							 | 
						||
| 
								 | 
							
								      (if (or (node-list=? cont-comp 
							 | 
						||
| 
								 | 
							
											   (ancestor-member source (component-element-list)))
							 | 
						||
| 
								 | 
							
									      (node-list=? cont-comp target)
							 | 
						||
| 
								 | 
							
									      (not (auto-xref-indirect? target cont-comp)))
							 | 
						||
| 
								 | 
							
									  (empty-sosofo)
							 | 
						||
| 
								 | 
							
									  (auto-xref-indirect cont-comp))
							 | 
						||
| 
								 | 
							
								      (if (or (node-list=? cont-divn 
							 | 
						||
| 
								 | 
							
											   (ancestor-member source (division-element-list)))
							 | 
						||
| 
								 | 
							
									      (node-list=? cont-divn target)
							 | 
						||
| 
								 | 
							
									      (not (auto-xref-indirect? target cont-divn)))
							 | 
						||
| 
								 | 
							
									  (empty-sosofo)
							 | 
						||
| 
								 | 
							
									  (auto-xref-indirect cont-divn))
							 | 
						||
| 
								 | 
							
								      (if (or (node-list=? cont-book 
							 | 
						||
| 
								 | 
							
											   (ancestor-member source (book-element-list)))
							 | 
						||
| 
								 | 
							
									      (node-list=? cont-book target)
							 | 
						||
| 
								 | 
							
									      (not (auto-xref-indirect? target cont-book)))
							 | 
						||
| 
								 | 
							
									  (empty-sosofo)
							 | 
						||
| 
								 | 
							
									  (auto-xref-indirect cont-book)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (set-number-restart-list cmp)       (list (normalize "set")))
							 | 
						||
| 
								 | 
							
								(define (book-number-restart-list cmp)      (list (normalize "set")))
							 | 
						||
| 
								 | 
							
								(define (part-number-restart-list cmp)      (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (reference-number-restart-list cmp) (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (preface-number-restart-list cmp)   (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (chapter-number-restart-list cmp)   (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (appendix-number-restart-list cmp)  (list (normalize "book") 
							 | 
						||
| 
								 | 
							
														  (normalize "article")))
							 | 
						||
| 
								 | 
							
								(define (article-number-restart-list cmp)   (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (glossary-number-restart-list cmp)  (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (bibliography-number-restart-list cmp) (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (index-number-restart-list cmp)     (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								(define (setindex-number-restart-list cmp)  (list (normalize "set")))
							 | 
						||
| 
								 | 
							
								(define (refentry-number-restart-list cmp)  (list (normalize "reference")))
							 | 
						||
| 
								 | 
							
								(define (default-number-restart-list cmp)   (list (normalize "book")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (component-number-restart-list cmp)
							 | 
						||
| 
								 | 
							
								  ;; Return the list of elements at which numbering of 'cmp' should reset.
							 | 
						||
| 
								 | 
							
								  ;; For example, for CHAPTER, it might return '("BOOK") causing chapters
							 | 
						||
| 
								 | 
							
								  ;; to be sequentially numbered across a book.  If it returned
							 | 
						||
| 
								 | 
							
								  ;; '("BOOK" "PART") then chapter numbering would restart at each 
							 | 
						||
| 
								 | 
							
								  ;; BOOK or PART.
							 | 
						||
| 
								 | 
							
								  (let ((name (gi cmp)))
							 | 
						||
| 
								 | 
							
								    (cond
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "set"))       (set-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "book"))      (book-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "part"))      (part-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "reference")) (reference-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "preface"))   (preface-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "chapter"))   (chapter-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "appendix"))  (appendix-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "article"))   (article-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "glossary"))  (glossary-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "bibliography")) (bibliography-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "index"))     (index-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "setindex"))  (setindex-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "refentry"))  (refentry-number-restart-list cmp))
							 | 
						||
| 
								 | 
							
								     (else (default-number-restart-list cmp)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (set-number-ignore-list cmp)       '())
							 | 
						||
| 
								 | 
							
								(define (book-number-ignore-list cmp)      '())
							 | 
						||
| 
								 | 
							
								(define (part-number-ignore-list cmp)      '())
							 | 
						||
| 
								 | 
							
								(define (reference-number-ignore-list cmp) (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (preface-number-ignore-list cmp)   (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (chapter-number-ignore-list cmp)   (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (appendix-number-ignore-list cmp)  (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (article-number-ignore-list cmp)   (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (glossary-number-ignore-list cmp)  (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (bibliography-number-ignore-list cmp) (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (index-number-ignore-list cmp)     (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (setindex-number-ignore-list cmp)  (list (normalize "part")))
							 | 
						||
| 
								 | 
							
								(define (refentry-number-ignore-list cmp)  '())
							 | 
						||
| 
								 | 
							
								(define (default-number-ignore-list cmp)   '())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (component-number-ignore-list cmp)
							 | 
						||
| 
								 | 
							
								  ;; Return the list of elements (inside the restart list) which are
							 | 
						||
| 
								 | 
							
								  ;; hierarchy levels which should be ignored.  For example, for CHAPTER,
							 | 
						||
| 
								 | 
							
								  ;; it might return '("PART") causing chapter numbering inside books
							 | 
						||
| 
								 | 
							
								  ;; to ignore parts.
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  ;; Basically, if you skip up past a component/division element in
							 | 
						||
| 
								 | 
							
								  ;; the restart list, you better put the element(s) you skipped in 
							 | 
						||
| 
								 | 
							
								  ;; the ignore list or the stylesheet may never see your component
							 | 
						||
| 
								 | 
							
								  ;; when it's trying to do the numbering.
							 | 
						||
| 
								 | 
							
								  (let ((name (gi cmp)))
							 | 
						||
| 
								 | 
							
								    (cond
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "set"))       (set-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "book"))      (book-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "part"))      (part-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "reference")) (reference-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "preface"))   (preface-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "chapter"))   (chapter-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "appendix"))  (appendix-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "article"))   (article-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "glossary"))  (glossary-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "bibliography")) (bibliography-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "index"))     (index-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "setindex"))  (setindex-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "refentry"))  (refentry-number-ignore-list cmp))
							 | 
						||
| 
								 | 
							
								     (else (default-number-ignore-list cmp)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (set-number-sibling-list cmp)       '())
							 | 
						||
| 
								 | 
							
								(define (book-number-sibling-list cmp)      '())
							 | 
						||
| 
								 | 
							
								(define (part-number-sibling-list cmp)      '())
							 | 
						||
| 
								 | 
							
								(define (reference-number-sibling-list cmp) '())
							 | 
						||
| 
								 | 
							
								(define (preface-number-sibling-list cmp)   '())
							 | 
						||
| 
								 | 
							
								(define (chapter-number-sibling-list cmp)   '())
							 | 
						||
| 
								 | 
							
								(define (appendix-number-sibling-list cmp)  '())
							 | 
						||
| 
								 | 
							
								(define (article-number-sibling-list cmp)   '())
							 | 
						||
| 
								 | 
							
								(define (glossary-number-sibling-list cmp)  '())
							 | 
						||
| 
								 | 
							
								(define (bibliography-number-sibling-list cmp) '())
							 | 
						||
| 
								 | 
							
								(define (index-number-sibling-list cmp)     '())
							 | 
						||
| 
								 | 
							
								(define (setindex-number-sibling-list cmp)  '())
							 | 
						||
| 
								 | 
							
								(define (refentry-number-sibling-list cmp)  '())
							 | 
						||
| 
								 | 
							
								(define (default-number-sibling-list cmp)   '())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (component-number-sibling-list cmp)
							 | 
						||
| 
								 | 
							
								  ;; Return the list of elements with which 'cmp' should be numbered.
							 | 
						||
| 
								 | 
							
								  ;; For example, for PART it might return '("PART" "REFERENCE") causing
							 | 
						||
| 
								 | 
							
								  ;; sibling parts and references to be numbered together.
							 | 
						||
| 
								 | 
							
								  (let ((name (gi cmp)))
							 | 
						||
| 
								 | 
							
								    (cond
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "set"))       (set-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "book"))      (book-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "part"))      (part-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "reference")) (reference-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "preface"))   (preface-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "chapter"))   (chapter-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "appendix"))  (appendix-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "article"))   (article-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "glossary"))  (glossary-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "bibliography")) (bibliography-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "index"))     (index-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "setindex"))  (setindex-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     ((equal? name (normalize "refentry"))  (refentry-number-sibling-list cmp))
							 | 
						||
| 
								 | 
							
								     (else (default-number-sibling-list cmp)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (component-number component-node)
							 | 
						||
| 
								 | 
							
								  (let* ((root  (ancestor-member component-node 
							 | 
						||
| 
								 | 
							
												 (component-number-restart-list 
							 | 
						||
| 
								 | 
							
												  component-node)))
							 | 
						||
| 
								 | 
							
									 (clist (expand-children (children root) 
							 | 
						||
| 
								 | 
							
												 (component-number-ignore-list
							 | 
						||
| 
								 | 
							
												  component-node)))
							 | 
						||
| 
								 | 
							
									 (slist (append (list (gi component-node))
							 | 
						||
| 
								 | 
							
											(component-number-sibling-list component-node))))
							 | 
						||
| 
								 | 
							
								    (let loop ((nl clist) (count 1))
							 | 
						||
| 
								 | 
							
								      (if (node-list-empty? nl) 
							 | 
						||
| 
								 | 
							
									  1
							 | 
						||
| 
								 | 
							
									  (if (node-list=? (node-list-first nl) component-node)
							 | 
						||
| 
								 | 
							
									      count
							 | 
						||
| 
								 | 
							
									      (if (member (gi (node-list-first nl)) slist)
							 | 
						||
| 
								 | 
							
										  (loop (node-list-rest nl) (+ count 1))
							 | 
						||
| 
								 | 
							
										  (loop (node-list-rest nl) count)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; == components and divisions == 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (set-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (book-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (part-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (format-number (component-number nd) (label-number-format nd)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (reference-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (format-number (component-number nd) (label-number-format nd)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (preface-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (chapter-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (if (or force-label? %chapter-autolabel%)
							 | 
						||
| 
								 | 
							
								      (format-number (component-number nd) (label-number-format nd))
							 | 
						||
| 
								 | 
							
								      ""))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (appendix-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  ;; Abandoned special processing for appendixes in articles. Maybe
							 | 
						||
| 
								 | 
							
								  ;; it's a good idea, but it can't be done here because it screws
							 | 
						||
| 
								 | 
							
								  ;; up cross references to appendixes.
							 | 
						||
| 
								 | 
							
								  (if (or force-label? %chapter-autolabel%)
							 | 
						||
| 
								 | 
							
								      (format-number (component-number nd) (label-number-format nd))
							 | 
						||
| 
								 | 
							
								      ""))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (article-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (glossary-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (bibliography-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (index-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (indexdiv-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (colophon-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (setindex-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (refentry-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (let* ((isep       (gentext-intra-label-sep nd))
							 | 
						||
| 
								 | 
							
									 (refnamediv (select-elements (children nd)
							 | 
						||
| 
								 | 
							
												      (normalize "refnamediv")))
							 | 
						||
| 
								 | 
							
									 (refd       (select-elements (children refnamediv)
							 | 
						||
| 
								 | 
							
												      (normalize "refdescriptor")))
							 | 
						||
| 
								 | 
							
									 (refnames   (select-elements (children refnamediv)
							 | 
						||
| 
								 | 
							
												      (normalize "refname"))))
							 | 
						||
| 
								 | 
							
								    ""))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; == /components and divisions == 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (dedication-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (bibliodiv-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (glossdiv-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (section-autolabel-prefix nd)
							 | 
						||
| 
								 | 
							
								  (let* ((isep   (gentext-intra-label-sep nd))
							 | 
						||
| 
								 | 
							
									 (haschn (not (node-list-empty? (ancestor (normalize "chapter") nd))))
							 | 
						||
| 
								 | 
							
									 (hasapn (not (node-list-empty? (ancestor (normalize "appendix") nd)))))
							 | 
						||
| 
								 | 
							
								    (cond
							 | 
						||
| 
								 | 
							
								     (haschn (string-append 
							 | 
						||
| 
								 | 
							
									      (element-label (ancestor (normalize "chapter") nd)) isep))
							 | 
						||
| 
								 | 
							
								     (hasapn (string-append 
							 | 
						||
| 
								 | 
							
									      (element-label (ancestor (normalize "appendix") nd)) isep))
							 | 
						||
| 
								 | 
							
								     (else ""))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (section-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (let* ((isep (gentext-intra-label-sep nd))
							 | 
						||
| 
								 | 
							
									 (hasprf (not (node-list-empty? (ancestor (normalize "preface") nd))))
							 | 
						||
| 
								 | 
							
									 (prefix (section-autolabel-prefix nd)))
							 | 
						||
| 
								 | 
							
								    (if (and (or force-label? %section-autolabel%)
							 | 
						||
| 
								 | 
							
									     (or %label-preface-sections%
							 | 
						||
| 
								 | 
							
										 (not hasprf)))
							 | 
						||
| 
								 | 
							
									(cond
							 | 
						||
| 
								 | 
							
									 ((equal? (gi nd) (normalize "sect1"))
							 | 
						||
| 
								 | 
							
									  (string-append prefix (format-number (child-number nd) 
							 | 
						||
| 
								 | 
							
													       (label-number-format nd))))
							 | 
						||
| 
								 | 
							
									 ((equal? (gi nd) (normalize "sect2"))
							 | 
						||
| 
								 | 
							
									  (string-append 
							 | 
						||
| 
								 | 
							
									   (element-label (ancestor (normalize "sect1") nd) force-label?)
							 | 
						||
| 
								 | 
							
									   isep 
							 | 
						||
| 
								 | 
							
									   (format-number (child-number nd) (label-number-format nd))))
							 | 
						||
| 
								 | 
							
									 ((equal? (gi nd) (normalize "sect3"))
							 | 
						||
| 
								 | 
							
									  (string-append
							 | 
						||
| 
								 | 
							
									   (element-label (ancestor (normalize "sect2") nd) force-label?)
							 | 
						||
| 
								 | 
							
									   isep 
							 | 
						||
| 
								 | 
							
									   (format-number (child-number nd) (label-number-format nd))))
							 | 
						||
| 
								 | 
							
									 ((equal? (gi nd) (normalize "sect4"))
							 | 
						||
| 
								 | 
							
									  (string-append
							 | 
						||
| 
								 | 
							
									   (element-label (ancestor (normalize "sect3") nd) force-label?)
							 | 
						||
| 
								 | 
							
									   isep 
							 | 
						||
| 
								 | 
							
									   (format-number (child-number nd) (label-number-format nd))))
							 | 
						||
| 
								 | 
							
									 ((equal? (gi nd) (normalize "sect5"))
							 | 
						||
| 
								 | 
							
									  (string-append 
							 | 
						||
| 
								 | 
							
									   (element-label (ancestor (normalize "sect4") nd) force-label?)
							 | 
						||
| 
								 | 
							
									   isep 
							 | 
						||
| 
								 | 
							
									   (format-number (child-number nd) (label-number-format nd))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 ((equal? (gi nd) (normalize "simplesect"))
							 | 
						||
| 
								 | 
							
									  (let* ((possible-sect-ancestors
							 | 
						||
| 
								 | 
							
										  (node-list (ancestor (normalize "section") nd)
							 | 
						||
| 
								 | 
							
											     (ancestor (normalize "sect5") nd)
							 | 
						||
| 
								 | 
							
											     (ancestor (normalize "sect4") nd)
							 | 
						||
| 
								 | 
							
											     (ancestor (normalize "sect3") nd)
							 | 
						||
| 
								 | 
							
											     (ancestor (normalize "sect2") nd)
							 | 
						||
| 
								 | 
							
											     (ancestor (normalize "sect1") nd)))
							 | 
						||
| 
								 | 
							
										 (section-ancestor (node-list-first possible-sect-ancestors)))
							 | 
						||
| 
								 | 
							
									    (if (node-list-empty? section-ancestor)
							 | 
						||
| 
								 | 
							
										(string-append prefix (format-number (child-number nd) 
							 | 
						||
| 
								 | 
							
														     (label-number-format nd)))
							 | 
						||
| 
								 | 
							
										(string-append 
							 | 
						||
| 
								 | 
							
										 (element-label section-ancestor force-label?)
							 | 
						||
| 
								 | 
							
										 isep 
							 | 
						||
| 
								 | 
							
										 (format-number (child-number nd) (label-number-format nd))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 ((equal? (gi nd) (normalize "section"))
							 | 
						||
| 
								 | 
							
									  (if (node-list-empty? (ancestor (normalize "section") nd))
							 | 
						||
| 
								 | 
							
									      (string-append prefix (format-number (child-number nd) 
							 | 
						||
| 
								 | 
							
														   (label-number-format nd)))
							 | 
						||
| 
								 | 
							
									      (string-append 
							 | 
						||
| 
								 | 
							
									       (element-label (ancestor (normalize "section") nd) force-label?)
							 | 
						||
| 
								 | 
							
									       isep 
							 | 
						||
| 
								 | 
							
									       (format-number (child-number nd) (label-number-format nd)))))
							 | 
						||
| 
								 | 
							
									 (else (string-append (gi nd) " IS NOT A SECTION!")))
							 | 
						||
| 
								 | 
							
									"")))
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								(define (refsection-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (step-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  ($proc-step-xref-number$ nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (listitem-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (if (equal? (gi (parent nd)) (normalize "orderedlist"))
							 | 
						||
| 
								 | 
							
								      (number->string (child-number nd))
							 | 
						||
| 
								 | 
							
								      "[xref to LISTITEM only supported in ORDEREDLIST]"))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (sidebar-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (legalnotice-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (abstract-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (block-autolabel nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (let* ((chn    (element-label (ancestor (normalize "chapter") nd)))
							 | 
						||
| 
								 | 
							
									 (apn    (element-label (ancestor (normalize "appendix") nd)))
							 | 
						||
| 
								 | 
							
									 (rfn    (element-label (ancestor (normalize "refentry") nd)))
							 | 
						||
| 
								 | 
							
									 ;; If the root of this document isn't in component-element-list, these
							 | 
						||
| 
								 | 
							
									 ;; things all wind up being numbered 0. To avoid that, we force the
							 | 
						||
| 
								 | 
							
									 ;; root element to be in the list of components if it isn't already
							 | 
						||
| 
								 | 
							
									 ;; a component.
							 | 
						||
| 
								 | 
							
									 (incomp (member (gi (sgml-root-element)) (component-element-list)))
							 | 
						||
| 
								 | 
							
									 ;; In articles in books, number blocks from book not from article.
							 | 
						||
| 
								 | 
							
									 ;; Otherwise you get 1, 1, 1, 1, etc. for the first figure in each
							 | 
						||
| 
								 | 
							
									 ;; article.
							 | 
						||
| 
								 | 
							
									 (artinbook (and (not (node-list-empty? (ancestor (normalize "article") nd)))
							 | 
						||
| 
								 | 
							
											 (not (node-list-empty? (ancestor (normalize "book") nd)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 (bkn    (if artinbook
							 | 
						||
| 
								 | 
							
										     (format-number (component-child-number
							 | 
						||
| 
								 | 
							
												     nd
							 | 
						||
| 
								 | 
							
												     (list (normalize "book")))
							 | 
						||
| 
								 | 
							
												    (label-number-format nd))
							 | 
						||
| 
								 | 
							
										     (if incomp
							 | 
						||
| 
								 | 
							
											 (format-number (component-child-number
							 | 
						||
| 
								 | 
							
													 nd
							 | 
						||
| 
								 | 
							
													 (component-element-list))
							 | 
						||
| 
								 | 
							
													(label-number-format nd))
							 | 
						||
| 
								 | 
							
											 (format-number (component-child-number
							 | 
						||
| 
								 | 
							
													 nd
							 | 
						||
| 
								 | 
							
													 (append (component-element-list)
							 | 
						||
| 
								 | 
							
														 (list (gi (sgml-root-element)))))
							 | 
						||
| 
								 | 
							
													(label-number-format nd))))))
							 | 
						||
| 
								 | 
							
								    (if (equal? chn "")
							 | 
						||
| 
								 | 
							
									(if (equal? apn "")
							 | 
						||
| 
								 | 
							
									    (if (equal? rfn "")
							 | 
						||
| 
								 | 
							
										bkn
							 | 
						||
| 
								 | 
							
										(string-append rfn (gentext-intra-label-sep nd) bkn))
							 | 
						||
| 
								 | 
							
									    (string-append apn (gentext-intra-label-sep nd) bkn))
							 | 
						||
| 
								 | 
							
									(string-append chn (gentext-intra-label-sep nd) bkn))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; For all elements, if a LABEL attribute is present, that is the label
							 | 
						||
| 
								 | 
							
								;; that they get.  Otherwise:
							 | 
						||
| 
								 | 
							
								;; BOOK gets the Book volume, by book-autolabel
							 | 
						||
| 
								 | 
							
								;; PREFACE gets "", by preface-autolabel
							 | 
						||
| 
								 | 
							
								;; CHAPTER gets the Chapter number, by chapter-autolabel
							 | 
						||
| 
								 | 
							
								;; APPENDIX gets the Appendix letter, by appendix-autolabel
							 | 
						||
| 
								 | 
							
								;; REFERENCE gets "", by reference-autolabel
							 | 
						||
| 
								 | 
							
								;; REFENTRY gets "", by refentry-autolabel
							 | 
						||
| 
								 | 
							
								;; SECT* gets the nested section number (e.g., 1.3.5), by section-autolabel
							 | 
						||
| 
								 | 
							
								;; REFSECT* gets the nested section number, by refsection-autolabel
							 | 
						||
| 
								 | 
							
								;; everything else gets numbered by block-autolabel
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								(define (element-label #!optional (nd (current-node)) (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (if (node-list-empty? nd)
							 | 
						||
| 
								 | 
							
								      ""
							 | 
						||
| 
								 | 
							
								      (let ((label (attribute-string (normalize "label") nd)))
							 | 
						||
| 
								 | 
							
									(if label
							 | 
						||
| 
								 | 
							
									    label
							 | 
						||
| 
								 | 
							
									    (cond
							 | 
						||
| 
								 | 
							
									     ;; Use a seperately defined assoc list?
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "abstract"))
							 | 
						||
| 
								 | 
							
									      (abstract-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "appendix"))
							 | 
						||
| 
								 | 
							
									      (appendix-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "article"))
							 | 
						||
| 
								 | 
							
									      (article-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "bibliodiv"))
							 | 
						||
| 
								 | 
							
									      (bibliodiv-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "bibliography"))
							 | 
						||
| 
								 | 
							
									      (bibliography-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "book"))
							 | 
						||
| 
								 | 
							
									      (book-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "chapter"))
							 | 
						||
| 
								 | 
							
									      (chapter-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "dedication"))
							 | 
						||
| 
								 | 
							
									      (dedication-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "glossary"))
							 | 
						||
| 
								 | 
							
									      (glossary-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "glossdiv"))
							 | 
						||
| 
								 | 
							
									      (glossdiv-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "index"))
							 | 
						||
| 
								 | 
							
									      (index-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "colophon"))
							 | 
						||
| 
								 | 
							
									      (colophon-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "indexdiv"))
							 | 
						||
| 
								 | 
							
									      (indexdiv-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "setindex"))
							 | 
						||
| 
								 | 
							
									      (setindex-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "legalnotice"))
							 | 
						||
| 
								 | 
							
									      (legalnotice-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "listitem"))
							 | 
						||
| 
								 | 
							
									      (listitem-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "part"))
							 | 
						||
| 
								 | 
							
									      (part-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "preface"))
							 | 
						||
| 
								 | 
							
									      (preface-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "refentry"))
							 | 
						||
| 
								 | 
							
									      (refentry-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "reference"))
							 | 
						||
| 
								 | 
							
									      (reference-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "refsynopsisdiv"))
							 | 
						||
| 
								 | 
							
									      (refsection-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "refsect1"))
							 | 
						||
| 
								 | 
							
									      (refsection-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "refsect2"))
							 | 
						||
| 
								 | 
							
									      (refsection-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "refsect3"))
							 | 
						||
| 
								 | 
							
									      (refsection-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "sect1"))
							 | 
						||
| 
								 | 
							
									      (section-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "sect2"))
							 | 
						||
| 
								 | 
							
									      (section-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "sect3"))
							 | 
						||
| 
								 | 
							
									      (section-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "sect4"))
							 | 
						||
| 
								 | 
							
									      (section-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "sect5"))
							 | 
						||
| 
								 | 
							
									      (section-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "section"))
							 | 
						||
| 
								 | 
							
									      (section-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "simplesect"))
							 | 
						||
| 
								 | 
							
									      (section-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "set"))
							 | 
						||
| 
								 | 
							
									      (set-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "sidebar"))
							 | 
						||
| 
								 | 
							
									      (sidebar-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     ((equal? (gi nd) (normalize "step"))
							 | 
						||
| 
								 | 
							
									      (step-autolabel nd force-label?))
							 | 
						||
| 
								 | 
							
									     (else (block-autolabel nd force-label?)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; Returns the element label as a sosofo
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								(define (element-label-sosofo nd #!optional (force-label? #f))
							 | 
						||
| 
								 | 
							
								  (if (string=? (element-label nd force-label?) "")
							 | 
						||
| 
								 | 
							
								      (empty-sosofo)
							 | 
						||
| 
								 | 
							
								      (make sequence
							 | 
						||
| 
								 | 
							
									(literal (element-label nd force-label?)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (set-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((setinfo (select-elements (children nd) (normalize "setinfo")))
							 | 
						||
| 
								 | 
							
									 (sititles (select-elements  
							 | 
						||
| 
								 | 
							
										    (expand-children (children setinfo) 
							 | 
						||
| 
								 | 
							
												     (list (normalize "bookbiblio") 
							 | 
						||
| 
								 | 
							
													    (normalize "bibliomisc")
							 | 
						||
| 
								 | 
							
													    (normalize "biblioset")))
							 | 
						||
| 
								 | 
							
										    (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (settitles (select-elements (children nd) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles   (if (node-list-empty? settitles)
							 | 
						||
| 
								 | 
							
										       sititles
							 | 
						||
| 
								 | 
							
										       settitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (book-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((bookinfo (select-elements (children nd) (normalize "bookinfo")))
							 | 
						||
| 
								 | 
							
									 (bititles (select-elements  
							 | 
						||
| 
								 | 
							
										    (expand-children (children bookinfo) 
							 | 
						||
| 
								 | 
							
												     (list (normalize "bookbiblio") 
							 | 
						||
| 
								 | 
							
													   (normalize "bibliomisc")
							 | 
						||
| 
								 | 
							
													   (normalize "biblioset")))
							 | 
						||
| 
								 | 
							
										    (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (chtitles (select-elements (children nd) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles   (if (node-list-empty? chtitles)
							 | 
						||
| 
								 | 
							
										       bititles
							 | 
						||
| 
								 | 
							
										       chtitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (part-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((docinfo  (select-elements (children nd) (normalize "docinfo")))
							 | 
						||
| 
								 | 
							
									 (dititles (select-elements  
							 | 
						||
| 
								 | 
							
										    (expand-children (children docinfo) 
							 | 
						||
| 
								 | 
							
												     (list (normalize "bookbiblio") 
							 | 
						||
| 
								 | 
							
													   (normalize "bibliomisc")
							 | 
						||
| 
								 | 
							
													   (normalize "biblioset")))
							 | 
						||
| 
								 | 
							
										    (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (chtitles (select-elements (children nd) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles   (if (node-list-empty? chtitles)
							 | 
						||
| 
								 | 
							
										       dititles
							 | 
						||
| 
								 | 
							
										       chtitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (article-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((artchild  (children nd))
							 | 
						||
| 
								 | 
							
									 (artheader (select-elements artchild (normalize "artheader")))
							 | 
						||
| 
								 | 
							
									 (ahtitles  (select-elements (children artheader) 
							 | 
						||
| 
								 | 
							
												     (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (artitles  (select-elements artchild (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles    (if (node-list-empty? artitles)
							 | 
						||
| 
								 | 
							
											ahtitles
							 | 
						||
| 
								 | 
							
											artitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (preface-title nd)
							 | 
						||
| 
								 | 
							
								  (chapter-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (chapter-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((docinfo  (select-elements (children nd) (normalize "docinfo")))
							 | 
						||
| 
								 | 
							
									 (dititles (select-elements  
							 | 
						||
| 
								 | 
							
										    (expand-children (children docinfo) 
							 | 
						||
| 
								 | 
							
												     (list (normalize "bookbiblio") 
							 | 
						||
| 
								 | 
							
													   (normalize "bibliomisc")
							 | 
						||
| 
								 | 
							
													   (normalize "biblioset")))
							 | 
						||
| 
								 | 
							
										    (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (chtitles (select-elements (children nd) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles   (if (node-list-empty? chtitles)
							 | 
						||
| 
								 | 
							
										       dititles
							 | 
						||
| 
								 | 
							
										       chtitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (appendix-title nd)
							 | 
						||
| 
								 | 
							
								  (chapter-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (reference-title nd)
							 | 
						||
| 
								 | 
							
								  (chapter-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (refsynopsisdiv-title nd)
							 | 
						||
| 
								 | 
							
								  (optional-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; Returns either the REFENTRYTITLE or the first REFNAME.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								(define (refentry-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((refmeta (select-elements (descendants nd) (normalize "refmeta")))
							 | 
						||
| 
								 | 
							
									 (refttl  (select-elements (descendants refmeta) (normalize "refentrytitle")))
							 | 
						||
| 
								 | 
							
									 (refndiv (select-elements (descendants nd) (normalize "refnamediv")))
							 | 
						||
| 
								 | 
							
									 (refname (select-elements (descendants refndiv) (normalize "refname"))))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? refttl)
							 | 
						||
| 
								 | 
							
									(if (node-list-empty? refname)
							 | 
						||
| 
								 | 
							
									    ""
							 | 
						||
| 
								 | 
							
									    (node-list-first refname))
							 | 
						||
| 
								 | 
							
									(node-list-first refttl))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (optional-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((docinfo  (select-elements (children nd) (normalize "docinfo")))
							 | 
						||
| 
								 | 
							
									 (dititles (select-elements (children docinfo) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (chtitles (select-elements (children nd) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles   (if (node-list-empty? chtitles)
							 | 
						||
| 
								 | 
							
										       dititles
							 | 
						||
| 
								 | 
							
										       chtitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									(gentext-element-name nd)
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (glossary-title nd)
							 | 
						||
| 
								 | 
							
								  (optional-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (bibliography-title nd)
							 | 
						||
| 
								 | 
							
								  (optional-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (index-title nd)
							 | 
						||
| 
								 | 
							
								  (optional-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (setindex-title nd)
							 | 
						||
| 
								 | 
							
								  (optional-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (dedication-title nd)
							 | 
						||
| 
								 | 
							
								  (optional-title nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (colophon-title nd)
							 | 
						||
| 
								 | 
							
								  (gentext-element-name nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (section-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((info     (select-elements (children nd) 
							 | 
						||
| 
								 | 
							
												    (list (normalize "sect1info")
							 | 
						||
| 
								 | 
							
													  (normalize "sect2info")
							 | 
						||
| 
								 | 
							
													  (normalize "sect3info")
							 | 
						||
| 
								 | 
							
													  (normalize "sect4info")
							 | 
						||
| 
								 | 
							
													  (normalize "sect5info")
							 | 
						||
| 
								 | 
							
													  (normalize "section"))))
							 | 
						||
| 
								 | 
							
									 (ititles  (select-elements (children info) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (ctitles  (select-elements (children nd) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles   (if (node-list-empty? ctitles)
							 | 
						||
| 
								 | 
							
										       ititles
							 | 
						||
| 
								 | 
							
										       ctitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (refsection-title nd)
							 | 
						||
| 
								 | 
							
								  (let* ((info     (select-elements (children nd) 
							 | 
						||
| 
								 | 
							
												    (list (normalize "refsect1info")
							 | 
						||
| 
								 | 
							
													  (normalize "refsect2info") 
							 | 
						||
| 
								 | 
							
													  (normalize "refsect3info"))))
							 | 
						||
| 
								 | 
							
									 (ititles  (select-elements (children info) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (ctitles  (select-elements (children nd) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (titles   (if (node-list-empty? ctitles)
							 | 
						||
| 
								 | 
							
										       ititles
							 | 
						||
| 
								 | 
							
										       ctitles)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (block-title nd)
							 | 
						||
| 
								 | 
							
								  (let ((titles (select-elements (children nd) (normalize "title"))))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? titles)
							 | 
						||
| 
								 | 
							
									""
							 | 
						||
| 
								 | 
							
									(node-list-first titles))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (set-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (set-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (book-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (book-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (part-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (part-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (article-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (article-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (preface-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (preface-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (chapter-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (chapter-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (appendix-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (appendix-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (reference-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (reference-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (refsynopsisdiv-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (optional-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (refentry-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (refentry-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (optional-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (optional-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(literal title)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (glossary-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (optional-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (bibliography-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (optional-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (index-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (optional-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (setindex-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (optional-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (dedication-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (optional-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (colophon-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (literal (gentext-element-name nd)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (section-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (section-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (refsection-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (refsection-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (block-title-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (block-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									(empty-sosofo)
							 | 
						||
| 
								 | 
							
									(with-mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
									  (process-node-list title)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(mode title-sosofo-mode
							 | 
						||
| 
								 | 
							
								  (element title
							 | 
						||
| 
								 | 
							
								    (process-children-trim))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (element citetitle
							 | 
						||
| 
								 | 
							
								    (process-children-trim))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (element refname
							 | 
						||
| 
								 | 
							
								    (process-children-trim))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (element refentrytitle
							 | 
						||
| 
								 | 
							
								    (process-children-trim)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; Returns the title of the element as a sosofo.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								(define (element-title-sosofo #!optional (nd (current-node)))
							 | 
						||
| 
								 | 
							
								  (if (node-list-empty? nd)
							 | 
						||
| 
								 | 
							
								      (empty-sosofo)
							 | 
						||
| 
								 | 
							
								      (cond
							 | 
						||
| 
								 | 
							
								       ;; Use a seperately defined assoc list?
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "appendix")) (appendix-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "article")) (article-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "bibliography")) (bibliography-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "book")) (book-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "chapter")) (chapter-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "dedication")) (dedication-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "glossary")) (glossary-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "index")) (index-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "colophon")) (colophon-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "setindex")) (index-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "part")) (part-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "preface")) (preface-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refentry")) (refentry-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "reference")) (reference-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsect1")) (refsection-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsect2")) (refsection-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsect3")) (refsection-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsynopsisdiv")) (refsynopsisdiv-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect1")) (section-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect2")) (section-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect3")) (section-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect4")) (section-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect5")) (section-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "set")) (set-title-sosofo nd))
							 | 
						||
| 
								 | 
							
								       (else (block-title-sosofo nd)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; Returns the title of the element; returns a node if possible, or a string
							 | 
						||
| 
								 | 
							
								(define (element-title nd)
							 | 
						||
| 
								 | 
							
								  (if (node-list-empty? nd)
							 | 
						||
| 
								 | 
							
								      ""
							 | 
						||
| 
								 | 
							
								      (cond
							 | 
						||
| 
								 | 
							
								       ;; Use a seperately defined assoc list?
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "appendix")) (appendix-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "article")) (article-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "bibliography")) (bibliography-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "book")) (book-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "chapter")) (chapter-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "dedication")) (dedication-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "glossary")) (glossary-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "index")) (index-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "colophon")) (colophon-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "setindex")) (setindex-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "part")) (part-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "preface")) (preface-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refentry")) (refentry-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "reference")) (reference-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsect1")) (refsection-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsect2")) (refsection-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsect3")) (refsection-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "refsynopsisdiv")) (refsynopsisdiv-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect1")) (section-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect2")) (section-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect3")) (section-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect4")) (section-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "sect5")) (section-title nd))
							 | 
						||
| 
								 | 
							
								       ((equal? (gi nd) (normalize "set")) (set-title nd))
							 | 
						||
| 
								 | 
							
								       (else (block-title nd)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								;; Returns the data of a node, carefully excising INDEXTERMs from 
							 | 
						||
| 
								 | 
							
								;; the data content
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (data-of node)
							 | 
						||
| 
								 | 
							
								  ;; return the data characters of a node, except for the content of
							 | 
						||
| 
								 | 
							
								  ;; indexterms which are suppressed.
							 | 
						||
| 
								 | 
							
								  (let loop ((nl (children node)) (result ""))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
									result
							 | 
						||
| 
								 | 
							
									(if (equal? (node-property 'class-name (node-list-first nl)) 'element)
							 | 
						||
| 
								 | 
							
									    (if (or (equal? (gi (node-list-first nl)) (normalize "indexterm"))
							 | 
						||
| 
								 | 
							
										    (equal? (gi (node-list-first nl)) (normalize "comment"))
							 | 
						||
| 
								 | 
							
										    (equal? (gi (node-list-first nl)) (normalize "remark")))
							 | 
						||
| 
								 | 
							
										(loop (node-list-rest nl) result)
							 | 
						||
| 
								 | 
							
										(loop (node-list-rest nl)
							 | 
						||
| 
								 | 
							
										      (string-append result (data-of (node-list-first nl)))))
							 | 
						||
| 
								 | 
							
									    (if (or (equal? (node-property 'class-name (node-list-first nl))
							 | 
						||
| 
								 | 
							
											    'data-char)
							 | 
						||
| 
								 | 
							
										    (equal? (node-property 'class-name (node-list-first nl))
							 | 
						||
| 
								 | 
							
											    'sdata))
							 | 
						||
| 
								 | 
							
										(loop (node-list-rest nl)
							 | 
						||
| 
								 | 
							
										      (string-append result (data (node-list-first nl))))
							 | 
						||
| 
								 | 
							
										(loop (node-list-rest nl) result))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								;; Returns the element title data of nd
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								(define (element-title-string nd)
							 | 
						||
| 
								 | 
							
								  (let ((title (element-title nd)))
							 | 
						||
| 
								 | 
							
								    (if (string? title)
							 | 
						||
| 
								 | 
							
									title
							 | 
						||
| 
								 | 
							
									(data-of title))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								;; Returns the element gi as a sosofo
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								(define (element-gi-sosofo nd)
							 | 
						||
| 
								 | 
							
								  (if (node-list-empty? nd)
							 | 
						||
| 
								 | 
							
								      (empty-sosofo)
							 | 
						||
| 
								 | 
							
								      (make sequence
							 | 
						||
| 
								 | 
							
									(literal (gentext-element-name nd)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (titlepage-info-elements node info #!optional (intro (empty-node-list)))
							 | 
						||
| 
								 | 
							
								  ;; Returns a node-list of the elements that might appear on a title
							 | 
						||
| 
								 | 
							
								  ;; page.  This node-list is constructed as follows:
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  ;; 1. The "title" child of node is considered as a possibility
							 | 
						||
| 
								 | 
							
								  ;; 2. If info is not empty, then node-list starts as the children
							 | 
						||
| 
								 | 
							
								  ;;    of info.  If the children of info don't include a title, then
							 | 
						||
| 
								 | 
							
								  ;;    the title from the node is added.
							 | 
						||
| 
								 | 
							
								  ;; 3. If info is empty, then node-list starts as the children of node,
							 | 
						||
| 
								 | 
							
								  ;;    but with "partintro" filtered out.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (let* ((title (select-elements (children node) (normalize "title")))
							 | 
						||
| 
								 | 
							
									 (nl    (if (node-list-empty? info)
							 | 
						||
| 
								 | 
							
										    (node-list-filter-by-not-gi (children node) 
							 | 
						||
| 
								 | 
							
														(list (normalize "partintro")))
							 | 
						||
| 
								 | 
							
										    (children info)))
							 | 
						||
| 
								 | 
							
									 (nltitle (node-list-filter-by-gi nl (list (normalize "title")))))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? info)
							 | 
						||
| 
								 | 
							
									(node-list nl
							 | 
						||
| 
								 | 
							
										   intro)
							 | 
						||
| 
								 | 
							
									(node-list (if (node-list-empty? nltitle)
							 | 
						||
| 
								 | 
							
										       title
							 | 
						||
| 
								 | 
							
										       (empty-node-list))
							 | 
						||
| 
								 | 
							
										   nl
							 | 
						||
| 
								 | 
							
										   intro))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (info-element #!optional (nd (current-node)))
							 | 
						||
| 
								 | 
							
								  ;; Returns the *INFO element for the nd or (empty-node-list) if no
							 | 
						||
| 
								 | 
							
								  ;; such node exists...
							 | 
						||
| 
								 | 
							
								  (cond
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "set"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "setinfo")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "book"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "bookinfo")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "section"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "sectioninfo")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "sect1"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "sect1info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "sect2"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "sect2info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "sect3"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "sect3info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "sect4"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "sect4info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "sect5"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "sect5info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "refsect1"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "refsect1info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "refsect2"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "refsect2info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "refsect3"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "refsect3info")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "refsynopsisdiv"))
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "refsynopsisdivinfo")))
							 | 
						||
| 
								 | 
							
								   ((equal? (gi nd) (normalize "article"))
							 | 
						||
| 
								 | 
							
								    (node-list-filter-by-gi (children nd) (list
							 | 
						||
| 
								 | 
							
													   (normalize "artheader")
							 | 
						||
| 
								 | 
							
													   (normalize "articleinfo"))))
							 | 
						||
| 
								 | 
							
								   (else ;; BIBLIODIV, GLOSSDIV, INDEXDIV, PARTINTRO, SIMPLESECT
							 | 
						||
| 
								 | 
							
								    (select-elements (children nd) (normalize "docinfo")))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; Bibliography filtering...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (biblio-filter allentries)
							 | 
						||
| 
								 | 
							
								  (let* ((all  (descendants (sgml-root-element)))
							 | 
						||
| 
								 | 
							
									 (link (select-elements all (normalize "link")))
							 | 
						||
| 
								 | 
							
									 (xref (select-elements all (normalize "xref")))
							 | 
						||
| 
								 | 
							
									 (cite (select-elements all (normalize "citation")))
							 | 
						||
| 
								 | 
							
									 (xref-elements (node-list link xref)))
							 | 
						||
| 
								 | 
							
								    (let loop ((entries allentries) (used (empty-node-list)))
							 | 
						||
| 
								 | 
							
								      (if (node-list-empty? entries)
							 | 
						||
| 
								 | 
							
									  used
							 | 
						||
| 
								 | 
							
									  (if (or (cited-by-xref (node-list-first entries) xref-elements)
							 | 
						||
| 
								 | 
							
										  (cited-by-citation (node-list-first entries) cite))
							 | 
						||
| 
								 | 
							
									      (loop (node-list-rest entries) 
							 | 
						||
| 
								 | 
							
										    (node-list used (node-list-first entries)))
							 | 
						||
| 
								 | 
							
									      (loop (node-list-rest entries) used))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (cited-by-xref bib xref-elements)
							 | 
						||
| 
								 | 
							
								  (let* ((id (attribute-string (normalize "id") bib)))
							 | 
						||
| 
								 | 
							
								    (if id
							 | 
						||
| 
								 | 
							
									(let loop ((links xref-elements))
							 | 
						||
| 
								 | 
							
									  (if (node-list-empty? links)
							 | 
						||
| 
								 | 
							
									      #f
							 | 
						||
| 
								 | 
							
									      (if (equal? (attribute-string (normalize "linkend") 
							 | 
						||
| 
								 | 
							
													    (node-list-first links)) id)
							 | 
						||
| 
								 | 
							
										  #t
							 | 
						||
| 
								 | 
							
										  (loop (node-list-rest links)))))
							 | 
						||
| 
								 | 
							
									#f)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (cited-by-citation bib citations)
							 | 
						||
| 
								 | 
							
								  (let loop ((links citations))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? links)
							 | 
						||
| 
								 | 
							
									#f
							 | 
						||
| 
								 | 
							
									(if (citation-matches-target? (node-list-first links) bib)
							 | 
						||
| 
								 | 
							
									    #t
							 | 
						||
| 
								 | 
							
									    (loop (node-list-rest links))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (citation-matches-target? citation target)
							 | 
						||
| 
								 | 
							
								  (let* ((fchild (node-list-first 
							 | 
						||
| 
								 | 
							
										  (node-list-filter-out-pis 
							 | 
						||
| 
								 | 
							
										   (children target))))
							 | 
						||
| 
								 | 
							
									 (abbrev (if (equal? (gi fchild) (normalize "abbrev"))
							 | 
						||
| 
								 | 
							
										     fchild
							 | 
						||
| 
								 | 
							
										     (empty-node-list)))
							 | 
						||
| 
								 | 
							
									 (cite   (data-of citation)))
							 | 
						||
| 
								 | 
							
								    (or (equal? (attribute-string "id" target) (normalize cite))
							 | 
						||
| 
								 | 
							
									(equal? (attribute-string "xreflabel" target) (normalize cite))
							 | 
						||
| 
								 | 
							
									(equal? (normalize cite) (normalize (data-of abbrev))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (bibentry-number bibentry)
							 | 
						||
| 
								 | 
							
								  (let* ((bgraphy (ancestor-member bibentry 
							 | 
						||
| 
								 | 
							
												   (list (normalize "bibliography"))))
							 | 
						||
| 
								 | 
							
									 (comps   (expand-children (children bgraphy) 
							 | 
						||
| 
								 | 
							
												   (list (normalize "bibliodiv")))))
							 | 
						||
| 
								 | 
							
								    (let loop ((nl comps) (count 1))
							 | 
						||
| 
								 | 
							
								      (if (node-list-empty? nl) 
							 | 
						||
| 
								 | 
							
									  0
							 | 
						||
| 
								 | 
							
									  (if (node-list=? (node-list-first nl) bibentry)
							 | 
						||
| 
								 | 
							
									      count
							 | 
						||
| 
								 | 
							
									      (if (or (equal? (gi (node-list-first nl))
							 | 
						||
| 
								 | 
							
											      (normalize "biblioentry"))
							 | 
						||
| 
								 | 
							
										      (equal? (gi (node-list-first nl))
							 | 
						||
| 
								 | 
							
											      (normalize "bibliomixed")))
							 | 
						||
| 
								 | 
							
										  (loop (node-list-rest nl) (+ count 1))
							 | 
						||
| 
								 | 
							
										  (loop (node-list-rest nl) count)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (olink-resource-title pubid sysid)
							 | 
						||
| 
								 | 
							
								  ;; This version of olink-resource-title expects public identifiers
							 | 
						||
| 
								 | 
							
								  ;; with the following format:
							 | 
						||
| 
								 | 
							
								  ;;
							 | 
						||
| 
								 | 
							
								  ;;   -//owner//TEXT title Vx.x//EN
							 | 
						||
| 
								 | 
							
								  ;; 
							 | 
						||
| 
								 | 
							
								  ;; Specifically the title is the description field of the public
							 | 
						||
| 
								 | 
							
								  ;; identifier minus the first word (TEXT, the type) and the last
							 | 
						||
| 
								 | 
							
								  ;; word, in my case a version string.  Words are blank delimited.
							 | 
						||
| 
								 | 
							
								  ;; The parsing will fail if a "/" appears anywhere in any field.
							 | 
						||
| 
								 | 
							
								  ;; The system identifier is ignored
							 | 
						||
| 
								 | 
							
								  ;; 
							 | 
						||
| 
								 | 
							
								  (let* ((pubidparts   (if pubid
							 | 
						||
| 
								 | 
							
											   (split pubid '(#\/))
							 | 
						||
| 
								 | 
							
											   (split "-//none//type version//la" '(#\/))))
							 | 
						||
| 
								 | 
							
									 (description  (car (cdr (cdr pubidparts))))
							 | 
						||
| 
								 | 
							
									 (descparts    (split description))
							 | 
						||
| 
								 | 
							
									 (titleparts   (list-head (cdr descparts) (- (length descparts) 2))))
							 | 
						||
| 
								 | 
							
								    (join titleparts)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (orderedlist-listitem-number listitem)
							 | 
						||
| 
								 | 
							
								  ;; return the number of listitem, taking continuation into account
							 | 
						||
| 
								 | 
							
								  (let* ((orderedlist (parent listitem))
							 | 
						||
| 
								 | 
							
									 (listitems (select-elements (children orderedlist)
							 | 
						||
| 
								 | 
							
												     (normalize "listitem")))
							 | 
						||
| 
								 | 
							
									 (continue? (equal? (attribute-string (normalize "continuation")
							 | 
						||
| 
								 | 
							
													      orderedlist)
							 | 
						||
| 
								 | 
							
											    (normalize "continues")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; If a list is the continuation of a previous list, we must find the
							 | 
						||
| 
								 | 
							
								;; list that is continued in order to calculate the starting
							 | 
						||
| 
								 | 
							
								;; item number of this list.
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; Of all the lists in this component, only the following are candidates:
							 | 
						||
| 
								 | 
							
								;; 1. Lists which precede this list
							 | 
						||
| 
								 | 
							
								;; 2. Lists which are not ancestors of this list
							 | 
						||
| 
								 | 
							
								;; 3. Lists that do not have ancestors that are lists which precede this one
							 | 
						||
| 
								 | 
							
								;;
							 | 
						||
| 
								 | 
							
								;; Of the candidates, the last one, in document order, is the preceding
							 | 
						||
| 
								 | 
							
								;; list
							 | 
						||
| 
								 | 
							
									 (all-lists (select-elements
							 | 
						||
| 
								 | 
							
										     (descendants (ancestor-member orderedlist
							 | 
						||
| 
								 | 
							
														   (component-element-list)))
							 | 
						||
| 
								 | 
							
										     (normalize "orderedlist")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 (cand1     (if continue?
							 | 
						||
| 
								 | 
							
											(let loop ((nl all-lists)
							 | 
						||
| 
								 | 
							
												   (prec (empty-node-list)))
							 | 
						||
| 
								 | 
							
											  (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
											      prec
							 | 
						||
| 
								 | 
							
											      (if (node-list=? (node-list-first nl)
							 | 
						||
| 
								 | 
							
													       orderedlist)
							 | 
						||
| 
								 | 
							
												  prec
							 | 
						||
| 
								 | 
							
												  (loop (node-list-rest nl)
							 | 
						||
| 
								 | 
							
													(node-list prec
							 | 
						||
| 
								 | 
							
														   (node-list-first nl))))))
							 | 
						||
| 
								 | 
							
											(empty-node-list)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 (cand2     (let loop ((nl cand1)
							 | 
						||
| 
								 | 
							
											       (cand2lists (empty-node-list)))
							 | 
						||
| 
								 | 
							
										      (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
											  cand2lists
							 | 
						||
| 
								 | 
							
											  (loop (node-list-rest nl)
							 | 
						||
| 
								 | 
							
												(if (descendant-of? (node-list-first nl)
							 | 
						||
| 
								 | 
							
														    orderedlist)
							 | 
						||
| 
								 | 
							
												    cand2lists
							 | 
						||
| 
								 | 
							
												    (node-list cand2lists
							 | 
						||
| 
								 | 
							
													       (node-list-first nl)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 ;; now find the last item of cand2 that is not a descendant
							 | 
						||
| 
								 | 
							
									 ;; of some other element of the cand2 list.
							 | 
						||
| 
								 | 
							
									 (preclist  (let loop ((nl (node-list-reverse cand2)))
							 | 
						||
| 
								 | 
							
										      (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
											  (empty-node-list)
							 | 
						||
| 
								 | 
							
											  (if (descendant-member-of?
							 | 
						||
| 
								 | 
							
											       (node-list-first nl)
							 | 
						||
| 
								 | 
							
											       (node-list-rest nl))
							 | 
						||
| 
								 | 
							
											      (loop (node-list-rest nl))
							 | 
						||
| 
								 | 
							
											      (node-list-first nl)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 (precitem (if (node-list-empty? preclist)
							 | 
						||
| 
								 | 
							
										       (empty-node-list)
							 | 
						||
| 
								 | 
							
										       (node-list-last (children preclist))))
							 | 
						||
| 
								 | 
							
									 (precitem-number (if (and continue? (not (node-list-empty? precitem)))
							 | 
						||
| 
								 | 
							
											      (orderedlist-listitem-number precitem)
							 | 
						||
| 
								 | 
							
											      0)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    (+ precitem-number (child-number listitem))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (descendant-member-of? node node-list)
							 | 
						||
| 
								 | 
							
								  ;; return true if node is a descedant of any member of node-list
							 | 
						||
| 
								 | 
							
								  (let loop ((nl node-list))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
									#f
							 | 
						||
| 
								 | 
							
									(if (descendant-of? (node-list-first nl) node)
							 | 
						||
| 
								 | 
							
									    #t
							 | 
						||
| 
								 | 
							
									    (loop (node-list-rest nl))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (orderedlist-listitem-label listitem)
							 | 
						||
| 
								 | 
							
								  ;; return the formatted number of listitem
							 | 
						||
| 
								 | 
							
								  (let* ((number  (orderedlist-listitem-number listitem))
							 | 
						||
| 
								 | 
							
									 (depth   (length (hierarchical-number-recursive
							 | 
						||
| 
								 | 
							
											   (normalize "orderedlist")
							 | 
						||
| 
								 | 
							
											   listitem)))
							 | 
						||
| 
								 | 
							
									 (numeration (inherited-attribute-string (normalize "numeration")
							 | 
						||
| 
								 | 
							
														 listitem))
							 | 
						||
| 
								 | 
							
									 ;; rawnum allows for numbering to alternate
							 | 
						||
| 
								 | 
							
									 (rawnum (cond
							 | 
						||
| 
								 | 
							
										  ((equal? numeration (normalize "arabic")) 1)
							 | 
						||
| 
								 | 
							
										  ((equal? numeration (normalize "loweralpha")) 2)
							 | 
						||
| 
								 | 
							
										  ((equal? numeration (normalize "lowerroman")) 3)
							 | 
						||
| 
								 | 
							
										  ((equal? numeration (normalize "upperalpha")) 4)
							 | 
						||
| 
								 | 
							
										  ((equal? numeration (normalize "upperroman")) 0)
							 | 
						||
| 
								 | 
							
										  (else (modulo depth 5)))))
							 | 
						||
| 
								 | 
							
								    (case rawnum
							 | 
						||
| 
								 | 
							
								      ((1) (format-number number "1"))
							 | 
						||
| 
								 | 
							
								      ((2) (format-number number "a"))
							 | 
						||
| 
								 | 
							
								      ((3) (format-number number "i"))
							 | 
						||
| 
								 | 
							
								      ((4) (format-number number "A"))
							 | 
						||
| 
								 | 
							
								      ((0) (format-number number "I")))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (orderedlist-listitem-label-recursive listitem)
							 | 
						||
| 
								 | 
							
								  ;; return the recursively formatted number of the listitem.
							 | 
						||
| 
								 | 
							
								  ;; In other words, something of the form 1.2.3 for a third level
							 | 
						||
| 
								 | 
							
								  ;; nested ordered list
							 | 
						||
| 
								 | 
							
								  (let loop ((li (parent listitem)) 
							 | 
						||
| 
								 | 
							
									     (label (orderedlist-listitem-label listitem)))
							 | 
						||
| 
								 | 
							
								    (if (or (node-list-empty? li)
							 | 
						||
| 
								 | 
							
									    (node-list-empty? (ancestor (normalize "orderedlist") li)))
							 | 
						||
| 
								 | 
							
									label
							 | 
						||
| 
								 | 
							
									(if (and (equal? (gi li) (normalize "listitem"))
							 | 
						||
| 
								 | 
							
										 (equal? (gi (parent li)) (normalize "orderedlist")))
							 | 
						||
| 
								 | 
							
									    (loop (parent li)
							 | 
						||
| 
								 | 
							
										  (string-append 
							 | 
						||
| 
								 | 
							
										   (orderedlist-listitem-label li)
							 | 
						||
| 
								 | 
							
										   (gentext-intra-label-sep li)
							 | 
						||
| 
								 | 
							
										   label))
							 | 
						||
| 
								 | 
							
									    (loop (parent li) label)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (question-answer-label #!optional (node (current-node)))
							 | 
						||
| 
								 | 
							
								  (let* ((inhlabel (inherited-attribute-string (normalize "defaultlabel")
							 | 
						||
| 
								 | 
							
													       node))
							 | 
						||
| 
								 | 
							
									 (deflabel (if inhlabel inhlabel (qanda-defaultlabel)))
							 | 
						||
| 
								 | 
							
									 (label    (attribute-string (normalize "label") node))
							 | 
						||
| 
								 | 
							
									 (hnr      (hierarchical-number-recursive (normalize "qandadiv")
							 | 
						||
| 
								 | 
							
														  node))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 (parsect  (ancestor-member node (section-element-list)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 (defnum   (if (and %qanda-inherit-numeration% 
							 | 
						||
| 
								 | 
							
											    %section-autolabel%)
							 | 
						||
| 
								 | 
							
										       (if (node-list-empty? parsect)
							 | 
						||
| 
								 | 
							
											   (section-autolabel-prefix node)
							 | 
						||
| 
								 | 
							
											   (section-autolabel parsect))
							 | 
						||
| 
								 | 
							
										       ""))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									 (hnumber  (let loop ((numlist hnr) (number defnum) 
							 | 
						||
| 
								 | 
							
											      (sep (if (equal? defnum "") "" ".")))
							 | 
						||
| 
								 | 
							
										     (if (null? numlist)
							 | 
						||
| 
								 | 
							
											 number
							 | 
						||
| 
								 | 
							
											 (loop (cdr numlist) 
							 | 
						||
| 
								 | 
							
											       (string-append number
							 | 
						||
| 
								 | 
							
													      sep
							 | 
						||
| 
								 | 
							
													      (number->string (car numlist)))
							 | 
						||
| 
								 | 
							
											       "."))))
							 | 
						||
| 
								 | 
							
									 (cnumber  (child-number (parent node)))
							 | 
						||
| 
								 | 
							
									 (number   (string-append hnumber 
							 | 
						||
| 
								 | 
							
												  (if (equal? hnumber "")
							 | 
						||
| 
								 | 
							
												      ""
							 | 
						||
| 
								 | 
							
												      ".")
							 | 
						||
| 
								 | 
							
												  (number->string cnumber))))
							 | 
						||
| 
								 | 
							
								    (cond
							 | 
						||
| 
								 | 
							
								     ((equal? deflabel (normalize "qanda"))
							 | 
						||
| 
								 | 
							
								      (gentext-element-name node))
							 | 
						||
| 
								 | 
							
								     ((equal? deflabel (normalize "label"))
							 | 
						||
| 
								 | 
							
								      label)
							 | 
						||
| 
								 | 
							
								     ;; Note: only questions are numbered...
							 | 
						||
| 
								 | 
							
								     ((and (equal? deflabel (normalize "number"))
							 | 
						||
| 
								 | 
							
									   (equal? (gi node) (normalize "question")))
							 | 
						||
| 
								 | 
							
								      (string-append number "."))
							 | 
						||
| 
								 | 
							
								     (else ""))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								;; Calculate term lengths...
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (varlistentry-term-too-long? vle termlength)
							 | 
						||
| 
								 | 
							
								  (let loop ((nl (select-elements (children vle) (normalize "term")))
							 | 
						||
| 
								 | 
							
									     (too-long? #f))
							 | 
						||
| 
								 | 
							
								    (if (or too-long? (node-list-empty? nl))
							 | 
						||
| 
								 | 
							
									too-long?
							 | 
						||
| 
								 | 
							
									(loop (node-list-rest nl)
							 | 
						||
| 
								 | 
							
									      (> (string-length (data (node-list-first nl)))
							 | 
						||
| 
								 | 
							
										 termlength)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (variablelist-term-too-long? termlength)
							 | 
						||
| 
								 | 
							
								  (let loop ((nl (select-elements (children (current-node))
							 | 
						||
| 
								 | 
							
												  (normalize "varlistentry")))
							 | 
						||
| 
								 | 
							
									     (too-long? #f))
							 | 
						||
| 
								 | 
							
								    (if (or too-long? (node-list-empty? nl))
							 | 
						||
| 
								 | 
							
									too-long?
							 | 
						||
| 
								 | 
							
									(loop (node-list-rest nl)
							 | 
						||
| 
								 | 
							
									      (varlistentry-term-too-long? (node-list-first nl) termlength)))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 | 
						||
| 
								 | 
							
								;; bibliography elements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (biblioentry-inline-elements)
							 | 
						||
| 
								 | 
							
								  (list (normalize "abbrev")
							 | 
						||
| 
								 | 
							
									(normalize "affiliation")
							 | 
						||
| 
								 | 
							
									(normalize "artpagenums")
							 | 
						||
| 
								 | 
							
									(normalize "author")
							 | 
						||
| 
								 | 
							
									(normalize "authorgroup")
							 | 
						||
| 
								 | 
							
									(normalize "authorinitials")
							 | 
						||
| 
								 | 
							
									(normalize "citetitle")
							 | 
						||
| 
								 | 
							
									(normalize "collab")
							 | 
						||
| 
								 | 
							
									(normalize "confgroup")
							 | 
						||
| 
								 | 
							
									(normalize "contractnum")
							 | 
						||
| 
								 | 
							
									(normalize "contractsponsor")
							 | 
						||
| 
								 | 
							
									(normalize "contrib")
							 | 
						||
| 
								 | 
							
									(normalize "copyright")
							 | 
						||
| 
								 | 
							
									(normalize "corpauthor")
							 | 
						||
| 
								 | 
							
									(normalize "corpname")
							 | 
						||
| 
								 | 
							
									(normalize "date")
							 | 
						||
| 
								 | 
							
									(normalize "edition")
							 | 
						||
| 
								 | 
							
									(normalize "editor")
							 | 
						||
| 
								 | 
							
									(normalize "firstname")
							 | 
						||
| 
								 | 
							
									(normalize "honorific")
							 | 
						||
| 
								 | 
							
									(normalize "invpartnumber")
							 | 
						||
| 
								 | 
							
									(normalize "isbn")
							 | 
						||
| 
								 | 
							
									(normalize "issn")
							 | 
						||
| 
								 | 
							
									(normalize "issuenum")
							 | 
						||
| 
								 | 
							
									(normalize "lineage")
							 | 
						||
| 
								 | 
							
									(normalize "orgname")
							 | 
						||
| 
								 | 
							
									(normalize "othercredit")
							 | 
						||
| 
								 | 
							
									(normalize "othername")
							 | 
						||
| 
								 | 
							
									(normalize "pagenums")
							 | 
						||
| 
								 | 
							
									(normalize "productname")
							 | 
						||
| 
								 | 
							
									(normalize "productnumber")
							 | 
						||
| 
								 | 
							
									(normalize "pubdate")
							 | 
						||
| 
								 | 
							
									(normalize "publisher")
							 | 
						||
| 
								 | 
							
									(normalize "publishername")
							 | 
						||
| 
								 | 
							
									(normalize "pubsnumber")
							 | 
						||
| 
								 | 
							
									(normalize "releaseinfo")
							 | 
						||
| 
								 | 
							
									(normalize "seriesvolnums")
							 | 
						||
| 
								 | 
							
									(normalize "subtitle")
							 | 
						||
| 
								 | 
							
									(normalize "surname")
							 | 
						||
| 
								 | 
							
									(normalize "title")
							 | 
						||
| 
								 | 
							
									(normalize "titleabbrev")
							 | 
						||
| 
								 | 
							
									(normalize "volumenum")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (biblioentry-block-elements)
							 | 
						||
| 
								 | 
							
								  (list (normalize "abstract")
							 | 
						||
| 
								 | 
							
									(normalize "address")
							 | 
						||
| 
								 | 
							
									(normalize "authorblurb")
							 | 
						||
| 
								 | 
							
									(normalize "printhistory")
							 | 
						||
| 
								 | 
							
									(normalize "revhistory")
							 | 
						||
| 
								 | 
							
									(normalize "seriesinfo")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (biblioentry-flatten-elements)
							 | 
						||
| 
								 | 
							
								  (list (normalize "artheader")
							 | 
						||
| 
								 | 
							
									(normalize "biblioset")
							 | 
						||
| 
								 | 
							
									(normalize "bookbiblio")))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; === db31 common ======================================================
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (data-filename dataobj)
							 | 
						||
| 
								 | 
							
								  (let* ((entityref (attribute-string (normalize "entityref") dataobj))
							 | 
						||
| 
								 | 
							
									 (fileref   (attribute-string (normalize "fileref") dataobj))
							 | 
						||
| 
								 | 
							
									 (filename  (if fileref
							 | 
						||
| 
								 | 
							
											fileref
							 | 
						||
| 
								 | 
							
											(system-id-filename entityref)))
							 | 
						||
| 
								 | 
							
									 (ext       (file-extension filename)))
							 | 
						||
| 
								 | 
							
								    (if (or (not filename)
							 | 
						||
| 
								 | 
							
									    (not %graphic-default-extension%)
							 | 
						||
| 
								 | 
							
									    (member ext %graphic-extensions%))
							 | 
						||
| 
								 | 
							
									filename
							 | 
						||
| 
								 | 
							
									(string-append filename "." %graphic-default-extension%))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (normalized-member string string-list)
							 | 
						||
| 
								 | 
							
								  (if (string? string)
							 | 
						||
| 
								 | 
							
								      (let loop ((sl string-list))
							 | 
						||
| 
								 | 
							
									(if (null? sl)
							 | 
						||
| 
								 | 
							
									    #f
							 | 
						||
| 
								 | 
							
									    (if (string=? (normalize string) (normalize (car sl)))
							 | 
						||
| 
								 | 
							
										#t
							 | 
						||
| 
								 | 
							
										(loop (cdr sl)))))
							 | 
						||
| 
								 | 
							
								      #f))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (find-displayable-object objlist notlist extlist)
							 | 
						||
| 
								 | 
							
								  (let loop ((nl objlist))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? nl)
							 | 
						||
| 
								 | 
							
									(empty-node-list)
							 | 
						||
| 
								 | 
							
									(let* ((objdata  (node-list-filter-by-gi
							 | 
						||
| 
								 | 
							
											  (children (node-list-first nl))
							 | 
						||
| 
								 | 
							
											  (list (normalize "videodata")
							 | 
						||
| 
								 | 
							
												(normalize "audiodata")
							 | 
						||
| 
								 | 
							
												(normalize "imagedata"))))
							 | 
						||
| 
								 | 
							
									       (filename  (data-filename objdata))
							 | 
						||
| 
								 | 
							
									       (extension (file-extension filename))
							 | 
						||
| 
								 | 
							
									       (notation  (attribute-string (normalize "format") objdata)))
							 | 
						||
| 
								 | 
							
									  (if (or (normalized-member notation notlist)
							 | 
						||
| 
								 | 
							
										  (normalized-member extension extlist)
							 | 
						||
| 
								 | 
							
										  (and notation
							 | 
						||
| 
								 | 
							
										       (string=? notation (normalize "linespecific"))))
							 | 
						||
| 
								 | 
							
									      (node-list-first nl)
							 | 
						||
| 
								 | 
							
									      (loop (node-list-rest nl)))))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define (select-displayable-object objlist)
							 | 
						||
| 
								 | 
							
								  (let ((pref (find-displayable-object objlist
							 | 
						||
| 
								 | 
							
												       preferred-mediaobject-notations
							 | 
						||
| 
								 | 
							
												       preferred-mediaobject-extensions))
							 | 
						||
| 
								 | 
							
									(ok   (find-displayable-object objlist
							 | 
						||
| 
								 | 
							
												       acceptable-mediaobject-notations
							 | 
						||
| 
								 | 
							
												       acceptable-mediaobject-extensions)))
							 | 
						||
| 
								 | 
							
								    (if (node-list-empty? pref)
							 | 
						||
| 
								 | 
							
									ok
							 | 
						||
| 
								 | 
							
									pref)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								(define ($mediaobject$)
							 | 
						||
| 
								 | 
							
								  (let* ((objects (node-list-filter-by-gi
							 | 
						||
| 
								 | 
							
										   (children (current-node))
							 | 
						||
| 
								 | 
							
										   (list (normalize "videoobject")
							 | 
						||
| 
								 | 
							
											 (normalize "imageobject")
							 | 
						||
| 
								 | 
							
											 (normalize "audioobject"))))
							 | 
						||
| 
								 | 
							
									 (dobject (select-displayable-object objects))
							 | 
						||
| 
								 | 
							
									 (textobj (select-elements (children (current-node))
							 | 
						||
| 
								 | 
							
												   (normalize "textobject")))
							 | 
						||
| 
								 | 
							
									 (caption (select-elements (children (current-node))
							 | 
						||
| 
								 | 
							
												   (normalize "caption"))))
							 | 
						||
| 
								 | 
							
								    (make sequence
							 | 
						||
| 
								 | 
							
								      (if (node-list-empty? dobject)
							 | 
						||
| 
								 | 
							
									  (if (node-list-empty? textobj)
							 | 
						||
| 
								 | 
							
									      (empty-sosofo)
							 | 
						||
| 
								 | 
							
									      (process-node-list (node-list-first textobj)))
							 | 
						||
| 
								 | 
							
									  (process-node-list dobject))
							 | 
						||
| 
								 | 
							
								      (process-node-list caption))))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;; ======================================================================
							 |