Compare commits
16 Commits
main
...
fix-note-v
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dfbf5f1cda | ||
![]() |
a69f6c6982 | ||
![]() |
cce1eff495 | ||
![]() |
525b72ca4c | ||
![]() |
78a517a34d | ||
![]() |
267fd52984 | ||
![]() |
3e1c63c93a | ||
![]() |
495630e001 | ||
![]() |
f488ed28f3 | ||
![]() |
5b37a3ac72 | ||
![]() |
aca15dcc85 | ||
![]() |
f4f3354466 | ||
![]() |
7836b78809 | ||
![]() |
2b972d9cc9 | ||
![]() |
5505a5557a | ||
![]() |
06e254f169 |
|
@ -605,7 +605,7 @@ Inserts a reference to the section tagged @racket[tag].
|
|||
|
||||
If @racket[#:doc module-path] is provided, the @racket[tag] refers to
|
||||
a tag with a prefix determined by @racket[module-path]. When
|
||||
@exec{setup-plt} renders documentation, it automatically adds a tag
|
||||
@exec{raco setup} renders documentation, it automatically adds a tag
|
||||
prefix to the document based on the source module. Thus, for example,
|
||||
to refer to a section of the Racket reference,
|
||||
@racket[module-path] would be @racket['(lib
|
||||
|
|
|
@ -172,7 +172,7 @@ configurable in the former way, since a document class determines a
|
|||
set of page-layout and font properties that are used by other
|
||||
commands. The style-replacement kind of configuration corresponds to
|
||||
re-defining Latex macros or overriding CSS class attributes. When
|
||||
@exec{setup-plt} builds PDF documentation, it uses both kinds of
|
||||
@exec{raco setup} builds PDF documentation, it uses both kinds of
|
||||
configuration to produce a standard layout for Racket manuals;
|
||||
that is, it selects a particular page layout, and it replaces some
|
||||
@racketmodname[racket/base] styles.
|
||||
|
|
|
@ -463,7 +463,7 @@ The recognized @tech{style properties} are as follows:
|
|||
be set separately for parts that start different HTML pages,
|
||||
otherwise it is effectively inherited by sub-parts; the
|
||||
default is @racket["scribble-racket-lang.org"], but
|
||||
@exec{setup-plt} installs @racket["doc-racket-lang.org"] as the
|
||||
@exec{raco setup} installs @racket["doc-racket-lang.org"] as the
|
||||
@tt{id} for any document that it builds.}
|
||||
|
||||
@item{@racket[attributes] structure --- Provides additional HTML
|
||||
|
@ -1772,7 +1772,7 @@ The @racket[path] field can be a result of
|
|||
Used as a @tech{style property} on the main @racket[part] of a document
|
||||
to set a default prefix file, style file, and extra files (see
|
||||
@secref["config-style"]). The defaults are used by the
|
||||
@exec{scribble} command-line tool for and @DFlag{latex} or @DFlag{pdf}
|
||||
@exec{scribble} command-line tool for @DFlag{latex} or @DFlag{pdf}
|
||||
mode if none are supplied via @DFlag{prefix} and @DFlag{style} (where
|
||||
@racket[extra-files] are used only when @racket[prefix] is used). A
|
||||
byte-string value is used directly like file content, and a path can
|
||||
|
|
|
@ -55,3 +55,19 @@ If different authors have different affiliations, use
|
|||
use @racket[affiliation-mark] before each different affiliation within
|
||||
a single @racket[affiliation], using @racket[(affiliation-sep)] to
|
||||
separate affiliations.}
|
||||
|
||||
Examples:
|
||||
@codeblock|{
|
||||
#lang scribble/jfp
|
||||
|
||||
@title{My First Love Story}
|
||||
|
||||
@((author/short "Romeo M. and Juliet C.")
|
||||
"ROMEO" (affiliation-mark "1")
|
||||
" and "
|
||||
"JULIET" (affiliation-mark "2")
|
||||
@affiliation[
|
||||
"House Montague" (affiliation-mark "1")
|
||||
(affiliation-sep)
|
||||
"House Capulet" (affiliation-mark "2")])
|
||||
}|
|
||||
|
|
|
@ -1949,6 +1949,28 @@ produced by @racket[content-expr] should normally start with a capital
|
|||
letter and end with a period, but it can be a sentence fragment such
|
||||
as ``Added a @racket[#:changed] form.''
|
||||
|
||||
Examples:
|
||||
@codeblock[#:keep-lang-line? #f]|{
|
||||
#lang scribble/manual
|
||||
@defthing[tasty-burrito burrito?]{
|
||||
Compatible with the API of a sandwich, but not legally a
|
||||
sandwich in Massachusetts.
|
||||
|
||||
@history[#:added "1.0"
|
||||
#:changed "1.1" "Refactored tortilla."
|
||||
#:changed "1.2" @elem{Now includes @emph{guacamole}.}]
|
||||
}
|
||||
}|
|
||||
@doc-render-examples[
|
||||
@defthing[tasty-burrito burrito?]{
|
||||
Compatible with the API of a sandwich, but not legally a
|
||||
sandwich in Massachusetts.
|
||||
|
||||
@history[#:added "1.0"
|
||||
#:changed "1.1" "Refactored tortilla."
|
||||
#:changed "1.2" @elem{Now includes @emph{guacamole}.}]
|
||||
}]
|
||||
|
||||
@history[#:added "1.1"]}
|
||||
|
||||
@; ------------------------------------------------------------------------
|
||||
|
@ -2049,6 +2071,16 @@ rendered document.}
|
|||
Indicates that the index entry corresponds to a module definition via
|
||||
@racket[defmodule] and company.}
|
||||
|
||||
@deftogether[(
|
||||
@defstruct[(language-index-desc module-path-index-desc) ()]{}
|
||||
@defstruct[(reader-index-desc module-path-index-desc) ()]{}
|
||||
)]{
|
||||
Indicates that the index entry corresponds to a module definition via
|
||||
@racket[defmodule] with the @racket[#:lang] or @racket[#:reader] option.
|
||||
For example, a module definition via @racket[defmodulelang] has a
|
||||
@racket[language-index-desc] index entry and a module definition via
|
||||
@racket[defmodulereader] has a @racket[reader-index-desc] index entry.}
|
||||
|
||||
@defstruct[exported-index-desc ([name symbol?]
|
||||
[from-libs (listof module-path?)])]{
|
||||
|
||||
|
|
|
@ -396,6 +396,16 @@ are own their own pages. A value of @racket[0] is treated the same as
|
|||
|
||||
Specializes a @racket[render<%>] class for generating Latex input.}}
|
||||
|
||||
@defparam[extra-character-conversions convs (-> char? (or/c string? #f))]{
|
||||
Function that maps (special) characters to strings corresponding to the Latex
|
||||
code that should be used to render them. This function should return false for
|
||||
any character it does not know how to handle.
|
||||
|
||||
Scribble already converts many special characters to the proper Latex
|
||||
commands. This parameter should be used in case you need characters it does not
|
||||
support yet.
|
||||
}
|
||||
|
||||
@; ----------------------------------------
|
||||
|
||||
@section{PDF Renderer}
|
||||
|
|
|
@ -72,35 +72,41 @@
|
|||
#f)
|
||||
|
||||
(define/public (format-number number sep [keep-separator? #f])
|
||||
(if (or (null? number)
|
||||
(andmap (lambda (x) (or (not x) (equal? x "")))
|
||||
number)
|
||||
(and (not (car number))
|
||||
(not (ormap number? number))))
|
||||
null
|
||||
(cons (let ([s (string-append
|
||||
(apply
|
||||
string-append
|
||||
(map (lambda (n)
|
||||
(cond
|
||||
[(number? n) (format "~a." n)]
|
||||
[(or (not n) (string? n)) ""]
|
||||
[(pair? n) (string-append (car n) (cadr n))]))
|
||||
(reverse (cdr number))))
|
||||
(if (and (car number)
|
||||
(not (equal? "" (car number))))
|
||||
(if (pair? (car number))
|
||||
(if keep-separator?
|
||||
(string-append (caar number)
|
||||
(cadar number))
|
||||
(caar number))
|
||||
(format "~a." (car number)))
|
||||
""))])
|
||||
(if (or keep-separator?
|
||||
(pair? (car number)))
|
||||
s
|
||||
(substring s 0 (sub1 (string-length s)))))
|
||||
sep)))
|
||||
(cond
|
||||
[(or (null? number)
|
||||
(andmap (lambda (x) (or (not x) (equal? x "")))
|
||||
number)
|
||||
(and (not (car number))
|
||||
(not (ormap number? number))))
|
||||
null]
|
||||
[else
|
||||
(define result-s
|
||||
(let ([s (string-append
|
||||
(apply
|
||||
string-append
|
||||
(map (lambda (n)
|
||||
(cond
|
||||
[(number? n) (format "~a." n)]
|
||||
[(or (not n) (string? n)) ""]
|
||||
[(pair? n) (string-append (car n) (cadr n))]))
|
||||
(reverse (cdr number))))
|
||||
(if (and (car number)
|
||||
(not (equal? "" (car number))))
|
||||
(if (pair? (car number))
|
||||
(if keep-separator?
|
||||
(string-append (caar number)
|
||||
(cadar number))
|
||||
(caar number))
|
||||
(format "~a." (car number)))
|
||||
""))])
|
||||
(if (or keep-separator?
|
||||
(pair? (car number))
|
||||
(equal? s ""))
|
||||
s
|
||||
(substring s 0 (sub1 (string-length s))))))
|
||||
(if (equal? result-s "")
|
||||
null
|
||||
(cons result-s sep))]))
|
||||
|
||||
(define/public (number-depth number)
|
||||
(if (null? number)
|
||||
|
|
2
scribble-lib/scribble/elsarticle/.gitignore
vendored
Normal file
2
scribble-lib/scribble/elsarticle/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
# to avoid committing it by accident, since we can't distribute it
|
||||
/elsarticle.cls
|
5
scribble-lib/scribble/elsarticle/elsarticle.tex
Normal file
5
scribble-lib/scribble/elsarticle/elsarticle.tex
Normal file
|
@ -0,0 +1,5 @@
|
|||
\newcommand{\ELSauthor}[1]{\author{#1}}
|
||||
\newcommand{\ELSaddress}[1]{\address{#1}}
|
||||
\newcommand{\ELSemail}[1]{\ead{#1}}
|
||||
|
||||
\newcommand{\ELSabstract}[1]{\begin{abstract}#1\end{abstract}}
|
68
scribble-lib/scribble/elsarticle/lang.rkt
Normal file
68
scribble-lib/scribble/elsarticle/lang.rkt
Normal file
|
@ -0,0 +1,68 @@
|
|||
#lang racket/base
|
||||
(require scribble/doclang
|
||||
scribble/core
|
||||
racket/file
|
||||
(except-in scribble/base author)
|
||||
(prefix-in s/b: scribble/base)
|
||||
scribble/decode
|
||||
"../private/defaults.rkt"
|
||||
setup/collects
|
||||
scribble/html-properties
|
||||
scribble/latex-properties
|
||||
scribble/latex-prefix
|
||||
racket/stxparam
|
||||
net/ftp
|
||||
file/gunzip
|
||||
(for-syntax racket/base
|
||||
racket/list
|
||||
racket/stxparam-exptime))
|
||||
|
||||
(module test racket/base)
|
||||
|
||||
(provide (except-out (all-from-out scribble/doclang) #%module-begin)
|
||||
(all-from-out scribble/base)
|
||||
(rename-out [module-begin #%module-begin])
|
||||
frontmatter
|
||||
abstract author email address)
|
||||
|
||||
(define-syntax (module-begin stx)
|
||||
;; No options, currently, but keep in case we want to support some:
|
||||
(syntax-case* stx () (lambda (a b) (eq? (syntax-e a) (syntax-e b)))
|
||||
[(_ id ws . body)
|
||||
;; Skip intraline whitespace to find options:
|
||||
(and (string? (syntax-e #'ws))
|
||||
(regexp-match? #rx"^ *$" (syntax-e #'ws)))
|
||||
#'(module-begin id . body)]
|
||||
[(_ id . body)
|
||||
#'(#%module-begin id (post-process) () . body)]))
|
||||
|
||||
(define ((post-process) doc)
|
||||
(add-defaults doc
|
||||
(string->bytes/utf-8 (string-append "\\documentclass{elsarticle}\n"
|
||||
unicode-encoding-packages))
|
||||
(scribble-file "elsarticle/style.tex")
|
||||
'()
|
||||
#f))
|
||||
|
||||
(define elsarticle-extras
|
||||
(let ([abs (lambda (s)
|
||||
(path->collects-relative
|
||||
(collection-file-path s "scribble" "elsarticle")))])
|
||||
(list
|
||||
(make-tex-addition (abs "elsarticle.tex")))))
|
||||
|
||||
(define (LaTeX-element i)
|
||||
(λ strs
|
||||
(make-element (style i elsarticle-extras)
|
||||
;; XXX maybe decode-content
|
||||
(decode-content strs))))
|
||||
|
||||
(define abstract (LaTeX-element "ELSabstract"))
|
||||
(define author (LaTeX-element "ELSauthor"))
|
||||
(define address (LaTeX-element "ELSaddress"))
|
||||
(define email (LaTeX-element "ELSemail"))
|
||||
|
||||
(define (frontmatter #:authors as
|
||||
#:abstract a)
|
||||
(paragraph (style 'author '())
|
||||
(append as (list a))))
|
3
scribble-lib/scribble/elsarticle/lang/reader.rkt
Normal file
3
scribble-lib/scribble/elsarticle/lang/reader.rkt
Normal file
|
@ -0,0 +1,3 @@
|
|||
#lang s-exp scribble/base/reader
|
||||
scribble/elsarticle/lang
|
||||
#:wrapper1 (lambda (t) (cons 'doc (t)))
|
3
scribble-lib/scribble/elsarticle/style.tex
Normal file
3
scribble-lib/scribble/elsarticle/style.tex
Normal file
|
@ -0,0 +1,3 @@
|
|||
|
||||
\renewcommand{\titleAndVersionAndAuthors}[3]{\begin{frontmatter}\title{#1}#3\end{frontmatter}}
|
||||
\renewcommand{\titleAndEmptyVersionAndAuthors}[3]{\titleAndVersionAndAuthors{#1}{#1}{#3}}
|
|
@ -99,13 +99,15 @@
|
|||
[(eof-object? v)
|
||||
(let* ([line-accum (add-string string-accum line-accum)]
|
||||
[flow-accum (add-line line-accum flow-accum)])
|
||||
(list
|
||||
(list.flow.list
|
||||
(if (= 1 (length flow-accum))
|
||||
(car flow-accum)
|
||||
(make-table
|
||||
#f
|
||||
(map list.flow.list (reverse flow-accum)))))))]
|
||||
(if (null? flow-accum)
|
||||
null
|
||||
(list
|
||||
(list.flow.list
|
||||
(if (= 1 (length flow-accum))
|
||||
(car flow-accum)
|
||||
(make-table
|
||||
#f
|
||||
(map list.flow.list (reverse flow-accum))))))))]
|
||||
[(equal? #\newline v)
|
||||
(loop #f #f (add-line (add-string string-accum line-accum)
|
||||
flow-accum))]
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
setup/collects
|
||||
file/convertible)
|
||||
(provide render-mixin
|
||||
make-render-part-mixin)
|
||||
make-render-part-mixin
|
||||
extra-character-conversions)
|
||||
|
||||
(define current-table-mode (make-parameter #f))
|
||||
(define rendering-tt (make-parameter #f))
|
||||
|
@ -47,6 +48,8 @@
|
|||
(define-runtime-path skull-tex "scribble-skull.tex")
|
||||
(define skull-style (make-style #f (list (tex-addition skull-tex))))
|
||||
|
||||
(define extra-character-conversions (make-parameter (λ (c) #f)))
|
||||
|
||||
(define (render-mixin % #:image-mode [image-mode #f])
|
||||
(class %
|
||||
(super-new)
|
||||
|
@ -941,7 +944,8 @@
|
|||
[else ses])))
|
||||
|
||||
(define/private (display-protected s)
|
||||
(define rtt (rendering-tt))
|
||||
(define rtt (rendering-tt))
|
||||
(define convs (extra-character-conversions))
|
||||
(cond
|
||||
[(eq? rtt 'exact)
|
||||
(display s)]
|
||||
|
@ -995,242 +999,244 @@
|
|||
[(#\uDF) "{\\ss}"]
|
||||
[else
|
||||
(if ((char->integer c) . > . 127)
|
||||
;; latex-prefix.rkt enables utf8 input, but this does not work for
|
||||
;; all the characters below (e.g. ∞). Some parts of the table
|
||||
;; below are therefore necessary, but some parts probably are not.
|
||||
;; Which parts are necessary may depend on the latex version,
|
||||
;; though, so we keep this table around to avoid regressions.
|
||||
(case c
|
||||
[(#\╔ #\═ #\╗ #\║ #\╚ #\╝ #\╦ #\╠ #\╣ #\╬ #\╩) (box-character c)]
|
||||
[(#\┌ #\─ #\┐ #\│ #\└ #\┘ #\┬ #\├ #\┤ #\┼ #\┴) (box-character c)]
|
||||
[(#\┏ #\━ #\┓ #\┃ #\┗ #\┛ #\┳ #\┣ #\┫ #\╋ #\┻) (box-character c 2)]
|
||||
[(#\u2011) "\\mbox{-}"] ; non-breaking hyphen
|
||||
[(#\uB0) "$^{\\circ}$"] ; degree
|
||||
[(#\uB2) "$^2$"]
|
||||
[(#\u039A) "K"] ; kappa
|
||||
[(#\u0391) "A"] ; alpha
|
||||
[(#\u039F) "O"] ; omicron
|
||||
[(#\u03A3) "$\\Sigma$"]
|
||||
[(#\u03BA) "$\\kappa$"]
|
||||
[(#\u03B1) "$\\alpha$"]
|
||||
[(#\u03B2) "$\\beta$"]
|
||||
[(#\u03B3) "$\\gamma$"]
|
||||
[(#\u03BF) "o"] ; omicron
|
||||
[(#\u03C3) "$\\sigma$"]
|
||||
[(#\u03C2) "$\\varsigma$"]
|
||||
[(#\u03BB) "$\\lambda$"]
|
||||
[(#\u039B) "$\\Lambda$"]
|
||||
[(#\u03BC) "$\\mu$"]
|
||||
[(#\u03C0) "$\\pi$"]
|
||||
[(#\ϖ) "$\\varpi$"]
|
||||
[(#\‘) "{`}"]
|
||||
[(#\’) "{'}"]
|
||||
[(#\“) "{``}"]
|
||||
[(#\”) "{''}"]
|
||||
[(#\u2013) "{--}"]
|
||||
[(#\u2014) "{---}"]
|
||||
[(#\⟨ #\〈) "$\\langle$"] ; [MATHEMATICAL] LEFT ANGLE BRACKET
|
||||
[(#\⟩ #\〉) "$\\rangle$"] ; [MATHEMATICAL] RIGHT ANGLE BRACKET
|
||||
[(#\∞) "$\\infty$"]
|
||||
[(#\⇓) "$\\Downarrow$"]
|
||||
[(#\↖) "$\\nwarrow$"]
|
||||
[(#\↓) "$\\downarrow$"]
|
||||
[(#\⇒) "$\\Rightarrow$"]
|
||||
[(#\→) "$\\rightarrow$"]
|
||||
[(#\↘) "$\\searrow$"]
|
||||
[(#\↙) "$\\swarrow$"]
|
||||
[(#\←) "$\\leftarrow$"]
|
||||
[(#\↑) "$\\uparrow$"]
|
||||
[(#\⇐) "$\\Leftarrow$"]
|
||||
[(#\−) "$\\longrightarrow$"]
|
||||
[(#\⇑) "$\\Uparrow$"]
|
||||
[(#\⇔) "$\\Leftrightarrow$"]
|
||||
[(#\↕) "$\\updownarrow$"]
|
||||
[(#\↔) "$\\leftrightarrow$"]
|
||||
[(#\↗) "$\\nearrow$"]
|
||||
[(#\⇕) "$\\Updownarrow$"]
|
||||
[(#\א) "$\\aleph$"]
|
||||
[(#\′) "$\\prime$"]
|
||||
[(#\∅) "$\\emptyset$"]
|
||||
[(#\∇) "$\\nabla$"]
|
||||
[(#\♦) "$\\diamondsuit$"]
|
||||
[(#\♠) "$\\spadesuit$"]
|
||||
[(#\♣) "$\\clubsuit$"]
|
||||
[(#\♥) "$\\heartsuit$"]
|
||||
[(#\♯) "$\\sharp$"]
|
||||
[(#\♭) "$\\flat$"]
|
||||
[(#\♮) "$\\natural$"]
|
||||
[(#\√) "$\\surd$"]
|
||||
[(#\∆) "$\\Delta$"] ; no better mapping for than \Delta for "increment"
|
||||
[(#\u2211) "$\\sum$"] ; better than \Sigma, right?
|
||||
[(#\u220F) "$\\prod$"] ; better than \Pi, right?
|
||||
[(#\u2210) "$\\coprod$"]
|
||||
[(#\u222B) "$\\int$"]
|
||||
[(#\u222E) "$\\oint$"]
|
||||
[(#\¬) "$\\neg$"]
|
||||
[(#\△) "$\\triangle$"]
|
||||
[(#\∀) "$\\forall$"]
|
||||
[(#\∃) "$\\exists$"]
|
||||
[(#\∘) "$\\circ$"]
|
||||
[(#\θ) "$\\theta$"]
|
||||
[(#\ϑ) "$\\vartheta$"]
|
||||
[(#\τ) "$\\tau$"]
|
||||
[(#\υ) "$\\upsilon$"]
|
||||
[(#\φ) "$\\phi$"]
|
||||
[(#\ϕ) "$\\varphi$"]
|
||||
[(#\δ) "$\\delta$"]
|
||||
[(#\ρ) "$\\rho$"]
|
||||
[(#\ϱ) "$\\varrho$"]
|
||||
[(#\ϵ) "$\\epsilon$"]
|
||||
[(#\ε) "$\\varepsilon$"]
|
||||
[(#\χ) "$\\chi$"]
|
||||
[(#\ψ) "$\\psi$"]
|
||||
[(#\ζ) "$\\zeta$"]
|
||||
[(#\ν) "$\\nu$"]
|
||||
[(#\ω) "$\\omega$"]
|
||||
[(#\η) "$\\eta$"]
|
||||
[(#\ι) "$\\iota$"]
|
||||
[(#\ξ) "$\\xi$"]
|
||||
[(#\Γ) "$\\Gamma$"]
|
||||
[(#\Ψ) "$\\Psi$"]
|
||||
[(#\Δ) "$\\Delta$"]
|
||||
[(#\Ξ) "$\\Xi$"]
|
||||
[(#\Υ) "$\\Upsilon$"]
|
||||
[(#\Ω) "$\\Omega$"]
|
||||
[(#\Θ) "$\\Theta$"]
|
||||
[(#\Π) "$\\Pi$"]
|
||||
[(#\Φ) "$\\Phi$"]
|
||||
[(#\±) "$\\pm$"]
|
||||
[(#\∩) "$\\cap$"]
|
||||
[(#\◇) "$\\diamond$"]
|
||||
[(#\⊕) "$\\oplus$"]
|
||||
[(#\∓) "$\\mp$"]
|
||||
[(#\∪) "$\\cup$"]
|
||||
[(#\△) "$\\bigtriangleup$"]
|
||||
[(#\⊖) "$\\ominus$"]
|
||||
[(#\×) "$\\times$"]
|
||||
[(#\⊎) "$\\uplus$"]
|
||||
[(#\▽) "$\\bigtriangledown$"]
|
||||
[(#\⊗) "$\\otimes$"]
|
||||
[(#\÷) "$\\div$"]
|
||||
[(#\⊓) "$\\sqcap$"]
|
||||
[(#\▹) "$\\triangleleft$"]
|
||||
[(#\⊘) "$\\oslash$"]
|
||||
[(#\∗) "$\\ast$"]
|
||||
[(#\⊔) "$\\sqcup$"]
|
||||
[(#\∨) "$\\vee$"]
|
||||
[(#\∧) "$\\wedge$"]
|
||||
[(#\◃) "$\\triangleright$"]
|
||||
[(#\⊙) "$\\odot$"]
|
||||
[(#\★) "$\\star$"]
|
||||
[(#\†) "$\\dagger$"]
|
||||
[(#\•) "$\\bullet$"]
|
||||
[(#\‡) "$\\ddagger$"]
|
||||
[(#\≀) "$\\wr$"]
|
||||
[(#\⨿) "$\\amalg$"]
|
||||
[(#\≤) "$\\leq$"]
|
||||
[(#\≥) "$\\geq$"]
|
||||
[(#\≡) "$\\equiv$"]
|
||||
[(#\⊨) "$\\models$"]
|
||||
[(#\≺) "$\\prec$"]
|
||||
[(#\≻) "$\\succ$"]
|
||||
[(#\∼) "$\\sim$"]
|
||||
[(#\⊥) "$\\perp$"]
|
||||
[(#\≼) "$\\preceq$"]
|
||||
[(#\≽) "$\\succeq$"]
|
||||
[(#\≃) "$\\simeq$"]
|
||||
[(#\≪) "$\\ll$"]
|
||||
[(#\≫) "$\\gg$"]
|
||||
[(#\≍) "$\\asymp$"]
|
||||
[(#\∥) "$\\parallel$"]
|
||||
[(#\⊂) "$\\subset$"]
|
||||
[(#\⊃) "$\\supset$"]
|
||||
[(#\≈) "$\\approx$"]
|
||||
[(#\⋈) "$\\bowtie$"]
|
||||
[(#\⊆) "$\\subseteq$"]
|
||||
[(#\⊇) "$\\supseteq$"]
|
||||
[(#\≌) "$\\cong$"]
|
||||
[(#\⊏) "$\\sqsubset$"]
|
||||
[(#\⊐) "$\\sqsupset$"]
|
||||
[(#\≠) "$\\neq$"]
|
||||
[(#\⌣) "$\\smile$"]
|
||||
[(#\⊑) "$\\sqsubseteq$"]
|
||||
[(#\⊒) "$\\sqsupseteq$"]
|
||||
[(#\≐) "$\\doteq$"]
|
||||
[(#\⌢) "$\\frown$"]
|
||||
[(#\∈) "$\\in$"]
|
||||
[(#\∉) "$\\not\\in$"]
|
||||
[(#\∋) "$\\ni$"]
|
||||
[(#\∝) "$\\propto$"]
|
||||
[(#\⊢) "$\\vdash$"]
|
||||
[(#\⊣) "$\\dashv$"]
|
||||
[(#\☠) "$\\skull$"]
|
||||
[(#\☺) "$\\smiley$"]
|
||||
[(#\☻) "$\\blacksmiley$"]
|
||||
[(#\☹) "$\\frownie$"]
|
||||
[(#\ø) "{\\o}"]
|
||||
[(#\Ø) "{\\O}"]
|
||||
[(#\ł) "{\\l}"]
|
||||
[(#\Ł) "{\\L}"]
|
||||
[(#\uA7) "{\\S}"]
|
||||
[(#\⟦ #\〚) "$[\\![$"]
|
||||
[(#\⟧ #\〛) "$]\\!]$"]
|
||||
[(#\↦) "$\\mapsto$"]
|
||||
[(#\⊤) "$\\top$"]
|
||||
[(#\¥) "{\\textyen}"]
|
||||
[(#\™) "{\\texttrademark}"]
|
||||
[(#\®) "{\\textregistered}"]
|
||||
[(#\©) "{\\textcopyright}"]
|
||||
[(#\u2070) "$^0$"]
|
||||
[(#\u00b9) "$^1$"]
|
||||
[(#\u00b2) "$^2$"]
|
||||
[(#\u00b3) "$^3$"]
|
||||
[(#\u2074) "$^4$"]
|
||||
[(#\u2075) "$^5$"]
|
||||
[(#\u2076) "$^6$"]
|
||||
[(#\u2077) "$^7$"]
|
||||
[(#\u2078) "$^8$"]
|
||||
[(#\u2079) "$^9$"]
|
||||
[(#\u207a) "$^+$"]
|
||||
[(#\u207b) "$^-$"]
|
||||
[(#\⋖) "$\\precdot$"]
|
||||
[(#\⋗) "$\\succdot$"]
|
||||
[(#\⋮) "\\vdots"]
|
||||
[(#\⋱) "$\\ddots$"]
|
||||
[(#\⋯) "$\\cdots$"]
|
||||
[(#\⋯) "\\hdots"]
|
||||
[else
|
||||
(cond
|
||||
[(char<=? #\uAC00 c #\uD7AF) ; Korean Hangul
|
||||
(format "\\begin{CJK}{UTF8}{mj}~a\\end{CJK}" c)]
|
||||
[else
|
||||
;; Detect characters that can be formed with combining characters
|
||||
;; and translate them to Latex combinations:
|
||||
(define s (string-normalize-nfd (string c)))
|
||||
(define len (string-length s))
|
||||
(cond
|
||||
[(len . > . 1)
|
||||
(define combiner (case (string-ref s (sub1 len))
|
||||
[(#\u300) "\\`{~a}"]
|
||||
[(#\u301) "\\'{~a}"]
|
||||
[(#\u302) "\\^{~a}"]
|
||||
[(#\u303) "\\~~{~a}"]
|
||||
[(#\u304) "\\={~a}"]
|
||||
[(#\u306) "\\u{~a}"]
|
||||
[(#\u307) "\\.{~a}"]
|
||||
[(#\u308) "\\\"{~a}"]
|
||||
[(#\u30a) "\\r{~a}"]
|
||||
[(#\u30b) "\\H{~a}"]
|
||||
[(#\u30c) "\\v{~a}"]
|
||||
[(#\u327) "\\c{~a}"]
|
||||
[(#\u328) "\\k{~a}"]
|
||||
[else #f]))
|
||||
(define base (string-normalize-nfc (substring s 0 (sub1 len))))
|
||||
(if (and combiner
|
||||
(= 1 (string-length base)))
|
||||
(format combiner (char-loop (string-ref base 0)))
|
||||
c)]
|
||||
[else c])])])
|
||||
;; first, try user-defined conversions
|
||||
(or (convs c)
|
||||
;; latex-prefix.rkt enables utf8 input, but this does not work for
|
||||
;; all the characters below (e.g. ∞). Some parts of the table
|
||||
;; below are therefore necessary, but some parts probably are not.
|
||||
;; Which parts are necessary may depend on the latex version,
|
||||
;; though, so we keep this table around to avoid regressions.
|
||||
(case c
|
||||
[(#\╔ #\═ #\╗ #\║ #\╚ #\╝ #\╦ #\╠ #\╣ #\╬ #\╩) (box-character c)]
|
||||
[(#\┌ #\─ #\┐ #\│ #\└ #\┘ #\┬ #\├ #\┤ #\┼ #\┴) (box-character c)]
|
||||
[(#\┏ #\━ #\┓ #\┃ #\┗ #\┛ #\┳ #\┣ #\┫ #\╋ #\┻) (box-character c 2)]
|
||||
[(#\u2011) "\\mbox{-}"] ; non-breaking hyphen
|
||||
[(#\uB0) "$^{\\circ}$"] ; degree
|
||||
[(#\uB2) "$^2$"]
|
||||
[(#\u039A) "K"] ; kappa
|
||||
[(#\u0391) "A"] ; alpha
|
||||
[(#\u039F) "O"] ; omicron
|
||||
[(#\u03A3) "$\\Sigma$"]
|
||||
[(#\u03BA) "$\\kappa$"]
|
||||
[(#\u03B1) "$\\alpha$"]
|
||||
[(#\u03B2) "$\\beta$"]
|
||||
[(#\u03B3) "$\\gamma$"]
|
||||
[(#\u03BF) "o"] ; omicron
|
||||
[(#\u03C3) "$\\sigma$"]
|
||||
[(#\u03C2) "$\\varsigma$"]
|
||||
[(#\u03BB) "$\\lambda$"]
|
||||
[(#\u039B) "$\\Lambda$"]
|
||||
[(#\u03BC) "$\\mu$"]
|
||||
[(#\u03C0) "$\\pi$"]
|
||||
[(#\‘) "{`}"]
|
||||
[(#\’) "{'}"]
|
||||
[(#\“) "{``}"]
|
||||
[(#\”) "{''}"]
|
||||
[(#\u2013) "{--}"]
|
||||
[(#\u2014) "{---}"]
|
||||
[(#\⟨ #\〈) "$\\langle$"] ; [MATHEMATICAL] LEFT ANGLE BRACKET
|
||||
[(#\⟩ #\〉) "$\\rangle$"] ; [MATHEMATICAL] RIGHT ANGLE BRACKET
|
||||
[(#\∞) "$\\infty$"]
|
||||
[(#\⇓) "$\\Downarrow$"]
|
||||
[(#\↖) "$\\nwarrow$"]
|
||||
[(#\↓) "$\\downarrow$"]
|
||||
[(#\⇒) "$\\Rightarrow$"]
|
||||
[(#\→) "$\\rightarrow$"]
|
||||
[(#\↘) "$\\searrow$"]
|
||||
[(#\↙) "$\\swarrow$"]
|
||||
[(#\←) "$\\leftarrow$"]
|
||||
[(#\↑) "$\\uparrow$"]
|
||||
[(#\⇐) "$\\Leftarrow$"]
|
||||
[(#\−) "$\\longrightarrow$"]
|
||||
[(#\⇑) "$\\Uparrow$"]
|
||||
[(#\⇔) "$\\Leftrightarrow$"]
|
||||
[(#\↕) "$\\updownarrow$"]
|
||||
[(#\↔) "$\\leftrightarrow$"]
|
||||
[(#\↗) "$\\nearrow$"]
|
||||
[(#\⇕) "$\\Updownarrow$"]
|
||||
[(#\א) "$\\aleph$"]
|
||||
[(#\′) "$\\prime$"]
|
||||
[(#\∅) "$\\emptyset$"]
|
||||
[(#\∇) "$\\nabla$"]
|
||||
[(#\♦) "$\\diamondsuit$"]
|
||||
[(#\♠) "$\\spadesuit$"]
|
||||
[(#\♣) "$\\clubsuit$"]
|
||||
[(#\♥) "$\\heartsuit$"]
|
||||
[(#\♯) "$\\sharp$"]
|
||||
[(#\♭) "$\\flat$"]
|
||||
[(#\♮) "$\\natural$"]
|
||||
[(#\√) "$\\surd$"]
|
||||
[(#\∆) "$\\Delta$"] ; no better mapping for than \Delta for "increment"
|
||||
[(#\u2211) "$\\sum$"] ; better than \Sigma, right?
|
||||
[(#\u220F) "$\\prod$"] ; better than \Pi, right?
|
||||
[(#\u2210) "$\\coprod$"]
|
||||
[(#\u222B) "$\\int$"]
|
||||
[(#\u222E) "$\\oint$"]
|
||||
[(#\¬) "$\\neg$"]
|
||||
[(#\△) "$\\triangle$"]
|
||||
[(#\∀) "$\\forall$"]
|
||||
[(#\∃) "$\\exists$"]
|
||||
[(#\∘) "$\\circ$"]
|
||||
[(#\θ) "$\\theta$"]
|
||||
[(#\ϑ) "$\\vartheta$"]
|
||||
[(#\τ) "$\\tau$"]
|
||||
[(#\υ) "$\\upsilon$"]
|
||||
[(#\φ) "$\\phi$"]
|
||||
[(#\ϕ) "$\\varphi$"]
|
||||
[(#\δ) "$\\delta$"]
|
||||
[(#\ρ) "$\\rho$"]
|
||||
[(#\ϱ) "$\\varrho$"]
|
||||
[(#\ϵ) "$\\epsilon$"]
|
||||
[(#\ε) "$\\varepsilon$"]
|
||||
[(#\ϖ) "$\\varpi$"]
|
||||
[(#\χ) "$\\chi$"]
|
||||
[(#\ψ) "$\\psi$"]
|
||||
[(#\ζ) "$\\zeta$"]
|
||||
[(#\ν) "$\\nu$"]
|
||||
[(#\ω) "$\\omega$"]
|
||||
[(#\η) "$\\eta$"]
|
||||
[(#\ι) "$\\iota$"]
|
||||
[(#\ξ) "$\\xi$"]
|
||||
[(#\Γ) "$\\Gamma$"]
|
||||
[(#\Ψ) "$\\Psi$"]
|
||||
[(#\Δ) "$\\Delta$"]
|
||||
[(#\Ξ) "$\\Xi$"]
|
||||
[(#\Υ) "$\\Upsilon$"]
|
||||
[(#\Ω) "$\\Omega$"]
|
||||
[(#\Θ) "$\\Theta$"]
|
||||
[(#\Π) "$\\Pi$"]
|
||||
[(#\Φ) "$\\Phi$"]
|
||||
[(#\±) "$\\pm$"]
|
||||
[(#\∩) "$\\cap$"]
|
||||
[(#\◇) "$\\diamond$"]
|
||||
[(#\⊕) "$\\oplus$"]
|
||||
[(#\∓) "$\\mp$"]
|
||||
[(#\∪) "$\\cup$"]
|
||||
[(#\△) "$\\bigtriangleup$"]
|
||||
[(#\⊖) "$\\ominus$"]
|
||||
[(#\×) "$\\times$"]
|
||||
[(#\⊎) "$\\uplus$"]
|
||||
[(#\▽) "$\\bigtriangledown$"]
|
||||
[(#\⊗) "$\\otimes$"]
|
||||
[(#\÷) "$\\div$"]
|
||||
[(#\⊓) "$\\sqcap$"]
|
||||
[(#\▹) "$\\triangleleft$"]
|
||||
[(#\⊘) "$\\oslash$"]
|
||||
[(#\∗) "$\\ast$"]
|
||||
[(#\⊔) "$\\sqcup$"]
|
||||
[(#\∨) "$\\vee$"]
|
||||
[(#\∧) "$\\wedge$"]
|
||||
[(#\◃) "$\\triangleright$"]
|
||||
[(#\⊙) "$\\odot$"]
|
||||
[(#\★) "$\\star$"]
|
||||
[(#\†) "$\\dagger$"]
|
||||
[(#\•) "$\\bullet$"]
|
||||
[(#\‡) "$\\ddagger$"]
|
||||
[(#\≀) "$\\wr$"]
|
||||
[(#\⨿) "$\\amalg$"]
|
||||
[(#\≤) "$\\leq$"]
|
||||
[(#\≥) "$\\geq$"]
|
||||
[(#\≡) "$\\equiv$"]
|
||||
[(#\⊨) "$\\models$"]
|
||||
[(#\≺) "$\\prec$"]
|
||||
[(#\≻) "$\\succ$"]
|
||||
[(#\∼) "$\\sim$"]
|
||||
[(#\⊥) "$\\perp$"]
|
||||
[(#\≼) "$\\preceq$"]
|
||||
[(#\≽) "$\\succeq$"]
|
||||
[(#\≃) "$\\simeq$"]
|
||||
[(#\≪) "$\\ll$"]
|
||||
[(#\≫) "$\\gg$"]
|
||||
[(#\≍) "$\\asymp$"]
|
||||
[(#\∥) "$\\parallel$"]
|
||||
[(#\⊂) "$\\subset$"]
|
||||
[(#\⊃) "$\\supset$"]
|
||||
[(#\≈) "$\\approx$"]
|
||||
[(#\⋈) "$\\bowtie$"]
|
||||
[(#\⊆) "$\\subseteq$"]
|
||||
[(#\⊇) "$\\supseteq$"]
|
||||
[(#\≌) "$\\cong$"]
|
||||
[(#\⊏) "$\\sqsubset$"]
|
||||
[(#\⊐) "$\\sqsupset$"]
|
||||
[(#\≠) "$\\neq$"]
|
||||
[(#\⌣) "$\\smile$"]
|
||||
[(#\⊑) "$\\sqsubseteq$"]
|
||||
[(#\⊒) "$\\sqsupseteq$"]
|
||||
[(#\≐) "$\\doteq$"]
|
||||
[(#\⌢) "$\\frown$"]
|
||||
[(#\∈) "$\\in$"]
|
||||
[(#\∉) "$\\not\\in$"]
|
||||
[(#\∋) "$\\ni$"]
|
||||
[(#\∝) "$\\propto$"]
|
||||
[(#\⊢) "$\\vdash$"]
|
||||
[(#\⊣) "$\\dashv$"]
|
||||
[(#\☠) "$\\skull$"]
|
||||
[(#\☺) "$\\smiley$"]
|
||||
[(#\☻) "$\\blacksmiley$"]
|
||||
[(#\☹) "$\\frownie$"]
|
||||
[(#\ø) "{\\o}"]
|
||||
[(#\Ø) "{\\O}"]
|
||||
[(#\ł) "{\\l}"]
|
||||
[(#\Ł) "{\\L}"]
|
||||
[(#\uA7) "{\\S}"]
|
||||
[(#\⟦ #\〚) "$[\\![$"]
|
||||
[(#\⟧ #\〛) "$]\\!]$"]
|
||||
[(#\↦) "$\\mapsto$"]
|
||||
[(#\⊤) "$\\top$"]
|
||||
[(#\¥) "{\\textyen}"]
|
||||
[(#\™) "{\\texttrademark}"]
|
||||
[(#\®) "{\\textregistered}"]
|
||||
[(#\©) "{\\textcopyright}"]
|
||||
[(#\u2070) "$^0$"]
|
||||
[(#\u00b9) "$^1$"]
|
||||
[(#\u00b2) "$^2$"]
|
||||
[(#\u00b3) "$^3$"]
|
||||
[(#\u2074) "$^4$"]
|
||||
[(#\u2075) "$^5$"]
|
||||
[(#\u2076) "$^6$"]
|
||||
[(#\u2077) "$^7$"]
|
||||
[(#\u2078) "$^8$"]
|
||||
[(#\u2079) "$^9$"]
|
||||
[(#\u207a) "$^+$"]
|
||||
[(#\u207b) "$^-$"]
|
||||
[(#\⋖) "$\\precdot$"]
|
||||
[(#\⋗) "$\\succdot$"]
|
||||
[(#\⋮) "\\vdots"]
|
||||
[(#\⋱) "$\\ddots$"]
|
||||
[(#\⋯) "$\\cdots$"]
|
||||
[(#\⋯) "\\hdots"]
|
||||
[else
|
||||
(cond
|
||||
[(char<=? #\uAC00 c #\uD7AF) ; Korean Hangul
|
||||
(format "\\begin{CJK}{UTF8}{mj}~a\\end{CJK}" c)]
|
||||
[else
|
||||
;; Detect characters that can be formed with combining characters
|
||||
;; and translate them to Latex combinations:
|
||||
(define s (string-normalize-nfd (string c)))
|
||||
(define len (string-length s))
|
||||
(cond
|
||||
[(len . > . 1)
|
||||
(define combiner (case (string-ref s (sub1 len))
|
||||
[(#\u300) "\\`{~a}"]
|
||||
[(#\u301) "\\'{~a}"]
|
||||
[(#\u302) "\\^{~a}"]
|
||||
[(#\u303) "\\~~{~a}"]
|
||||
[(#\u304) "\\={~a}"]
|
||||
[(#\u306) "\\u{~a}"]
|
||||
[(#\u307) "\\.{~a}"]
|
||||
[(#\u308) "\\\"{~a}"]
|
||||
[(#\u30a) "\\r{~a}"]
|
||||
[(#\u30b) "\\H{~a}"]
|
||||
[(#\u30c) "\\v{~a}"]
|
||||
[(#\u327) "\\c{~a}"]
|
||||
[(#\u328) "\\k{~a}"]
|
||||
[else #f]))
|
||||
(define base (string-normalize-nfc (substring s 0 (sub1 len))))
|
||||
(if (and combiner
|
||||
(= 1 (string-length base)))
|
||||
(format combiner (char-loop (string-ref base 0)))
|
||||
c)]
|
||||
[else c])])]))
|
||||
c)])))
|
||||
(loop (add1 i))))))]))
|
||||
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
|
||||
(provide-structs
|
||||
[module-path-index-desc ()]
|
||||
[(language-index-desc module-path-index-desc) ()]
|
||||
[(reader-index-desc module-path-index-desc) ()]
|
||||
[exported-index-desc ([name symbol?]
|
||||
[from-libs (listof module-path?)])]
|
||||
[(method-index-desc exported-index-desc) ([method-name symbol?]
|
||||
|
|
|
@ -356,7 +356,10 @@ a:hover {
|
|||
.refcolumn {
|
||||
position: absolute;
|
||||
left: 66rem; right: 3em;
|
||||
margin: 0;
|
||||
margin-top: -1.2em;
|
||||
margin-right: 0;
|
||||
margin-bottom: 0;
|
||||
margin-left: 0;
|
||||
float: right;
|
||||
max-width: 18rem;
|
||||
}
|
||||
|
|
|
@ -114,7 +114,15 @@
|
|||
(let ([ns-id
|
||||
(let ([ns (make-base-empty-namespace)])
|
||||
(parameterize ([current-namespace ns])
|
||||
(namespace-require `(for-label ,lib))
|
||||
;; A `(namespace-require `(for-label ,lib))` can
|
||||
;; fail if `lib` provides different bindings of the
|
||||
;; same name at different phases. We can require phases
|
||||
;; 1 and 0 separately, in which case the phase-0
|
||||
;; binding shadows the phase-1 one in that case.
|
||||
;; This strategy only works for documenting bindings
|
||||
;; at phases 0 and 1, though.
|
||||
(namespace-require `(just-meta 1 (for-label ,lib)))
|
||||
(namespace-require `(just-meta 0 (for-label ,lib)))
|
||||
(namespace-syntax-introduce (datum->syntax #f 'x))))])
|
||||
(let ([checker
|
||||
(lambda (id)
|
||||
|
|
|
@ -221,30 +221,36 @@
|
|||
(add-between (map tt pkgs) ", "))))))))))
|
||||
(define (flow-width f) (apply max (map block-width f)))
|
||||
(define libs-specs
|
||||
;; make-desc : element -> flow
|
||||
;; index-desc : module-path-index-desc
|
||||
(let-values ([(make-desc index-desc)
|
||||
(case lang
|
||||
[(#f)
|
||||
(values (lambda (modname) (list (racket (#,req #,modname))))
|
||||
the-module-path-index-desc)]
|
||||
[(#t)
|
||||
(values (lambda (modname) (list (hash-lang) spacer modname))
|
||||
the-language-index-desc)]
|
||||
[(reader)
|
||||
(values (lambda (modname) (list (racketmetafont "#reader") spacer modname))
|
||||
the-reader-index-desc)]
|
||||
[(just-lang)
|
||||
(values (lambda (modname) (list (hash-lang) spacer modname))
|
||||
the-language-index-desc)]
|
||||
[else (error 'defmodule "unknown mode: ~e" lang)])])
|
||||
(map
|
||||
(lambda (name modpath)
|
||||
(define modname (if link-target?
|
||||
(make-defracketmodname name modpath)
|
||||
(make-defracketmodname name modpath index-desc)
|
||||
name))
|
||||
(list
|
||||
(make-flow
|
||||
(list
|
||||
(make-omitable-paragraph
|
||||
(cons
|
||||
spacer
|
||||
(case lang
|
||||
[(#f)
|
||||
(list (racket (#,req #,modname)))]
|
||||
[(#t)
|
||||
(list (hash-lang) spacer modname)]
|
||||
[(reader)
|
||||
(list (racketmetafont "#reader") spacer modname)]
|
||||
[(just-lang)
|
||||
(list (hash-lang) spacer modname)]
|
||||
[else (error 'defmodule "unknown mode: ~e" lang)])))))
|
||||
(cons spacer (make-desc modname)))))
|
||||
'cont))
|
||||
names
|
||||
modpaths))
|
||||
modpaths)))
|
||||
|
||||
(make-splice
|
||||
(cons
|
||||
|
@ -278,8 +284,10 @@
|
|||
(flow-paragraphs (decode-flow content)))))))
|
||||
|
||||
(define the-module-path-index-desc (make-module-path-index-desc))
|
||||
(define the-language-index-desc (make-language-index-desc))
|
||||
(define the-reader-index-desc (make-reader-index-desc))
|
||||
|
||||
(define (make-defracketmodname mn mp)
|
||||
(define (make-defracketmodname mn mp index-desc)
|
||||
(let ([name-str (datum-intern-literal (element->string mn))]
|
||||
[path-str (datum-intern-literal (element->string mp))])
|
||||
(make-index-element #f
|
||||
|
@ -287,7 +295,7 @@
|
|||
(intern-taglet `(mod-path ,path-str))
|
||||
(list name-str)
|
||||
(list mn)
|
||||
the-module-path-index-desc)))
|
||||
index-desc)))
|
||||
|
||||
(define-syntax (declare-exporting stx)
|
||||
(syntax-parse stx
|
||||
|
|
|
@ -81,17 +81,14 @@ Examples:
|
|||
|
||||
```racket
|
||||
> (define x 0)
|
||||
|
||||
> (displayln x)
|
||||
0
|
||||
|
||||
```
|
||||
|
||||
Example of Scribble `interaction`:
|
||||
|
||||
```racket
|
||||
> (define x 0)
|
||||
|
||||
> x
|
||||
0
|
||||
```
|
||||
|
|
Loading…
Reference in New Issue
Block a user