hyper-literate/scribble-lib/scriblib/footnote.rkt
Benjamin Greenman 60b0cd100c add 'unnumbered' style to footnote parts
The function bound to `make-my-notes` by `define-footnote` (as in:

```
  (define-footnote my-note make-my-notes)
```

) now produces a part with the `unnumbered` style.

This way, footnote sections can go between any two sections on a page
 without upsetting the section numbers.
2017-03-03 09:52:12 -05:00

87 lines
2.9 KiB
Racket

#lang scheme/base
(require scribble/core
scribble/decode
scribble/html-properties
scribble/latex-properties
racket/promise
setup/main-collects
"private/counter.rkt")
(provide note
define-footnote)
(define footnote-style-extras
(let ([abs (lambda (s)
(path->main-collects-relative
(collection-file-path s "scriblib")))])
(list (make-css-addition (abs "footnote.css"))
(make-tex-addition (abs "footnote.tex")))))
(define note-box-style (make-style "NoteBox" footnote-style-extras))
(define note-content-style (make-style "NoteContent" footnote-style-extras))
(define (note . text)
(make-element
note-box-style
(make-element note-content-style
(decode-content text))))
(define footnote-style (make-style "Footnote" footnote-style-extras))
(define footnote-ref-style (make-style "FootnoteRef" footnote-style-extras))
(define footnote-content-style (make-style "FootnoteContent" footnote-style-extras))
(define footnote-target-style (make-style "FootnoteTarget" footnote-style-extras))
(define footnote-block-style (make-style "FootnoteBlock" footnote-style-extras))
(define footnote-block-content-style (make-style "FootnoteBlockContent" footnote-style-extras))
(define-syntax-rule (define-footnote footnote footnote-part)
(begin
(define footnotes (new-counter "footnote"))
(define id (gensym))
(define (footnote . text) (do-footnote footnotes id text))
(define (footnote-part . text) (do-footnote-part footnotes id))))
(define (do-footnote footnotes id text)
(let ([tag (generated-tag)]
[content (decode-content text)])
(make-traverse-element
(lambda (get set)
(set id (cons (cons
(make-element footnote-target-style
(make-element
'superscript
(counter-target footnotes tag #f)))
content)
(get id null)))
(make-element footnote-style
(list
(make-element
footnote-ref-style
(make-element
'superscript
(counter-ref footnotes tag #f)))
(make-element
footnote-content-style
content)))))))
(define (do-footnote-part footnotes id)
(make-part
#f
(list `(part ,(generated-tag)))
#f
(make-style #f '(unnumbered hidden toc-hidden))
null
(list
(make-traverse-block
(lambda (get set)
(make-compound-paragraph
footnote-block-style
(map (lambda (content)
(make-paragraph
footnote-block-content-style
content))
(reverse (get id null)))))))
null))