4.2.1 Typesetting Code

On this page:
4.2.1.2Racket Code
var
top
up

4.2.1Typesetting CodeπŸ”— i

The codeblock and code forms (see #lang-Specified Code) typeset code verbatim, adding a layer of color to the code based on the same syntax-coloring parsers that are used by DrRacket. Input that is parsed as an identifier is further given a lexical context and hyperlinked via for-label imports.

The racketblock and racket forms (see Racket Code) typeset S-expression code roughly verbatim, but roughly by quoting the source term with syntax . Identifiers in the quoted S-expression are hyperlinked via for-label imports.

The two different approaches to typesetting code—codeblock and code versus racketblock and racket —have different advantages and disadvantages:

  • The codeblock and code forms work with non-S-expression syntax, and they give authors more control over output (e.g., the literal number 2/4 is not normalized to 1/2). The codeblock and code forms do not yet support escapes to Scribble element mode, and they cannot adapt spacing based on the width of elements in escapes.

  • The racketblock and racket forms are more efficient and allow escapes to Scribble element mode. The racketblock and racket forms are tied to S-expression syntax, however, and they are based on a syntax representation that tends to normalize source terms (e.g., the literal number 2/4 is normalized to 1/2).

4.2.1.1#lang-Specified CodeπŸ”— i

syntax

( codeblock option...str-expr...+)

option = #:keep-lang-line?keep-expr
| #:indentindent-expr
| #:expandexpand-expr
| #:contextcontext-expr
| #:line-numbersline-number-expr
| #:line-number-sepline-number-sep-expr
keep-expr : any/c
expand-expr : (or/c #f(syntax? . -> .syntax? ))
context-expr : (or/c #fsyntax? )
line-number-expr : (or/c #fexact-nonnegative-integer? )
line-number-sep-expr : exact-nonnegative-integer?
Parses the code formed by the strings produced by the str-exprs as a Racket module (roughly) and produces a block that typesets the code inset via nested with the style 'code-inset. See also typeset-code .

The str-exprs should normally start with #lang to determine the reader syntax for the module, but the resulting “module” need not expand or compile—except as needed by expand-expr. If expand-expr is omitted or produces false, then the input formed by str-expr is read until an end-of-file is encountered, otherwise a single form is read from the input.

When keep-expr produces a true value (the default), the first line in the input (which is typically #lang) is preserved in the typeset output, otherwise the first line is dropped. The typeset code is indented by the amount specified by indent-expr, which defaults to 0.

When expand-expr produces #f (which is the default), identifiers in the typeset code are colored and linked based on for-label bindings in the lexical environment of the syntax object provided by context-expr. The default context-expr has the same lexical context as the first str-expr. When line-number-expr is true, line number is enabled starting from line-number-expr, and line-number-sep-expr controls the separation (in spaces; defaults to 1) between the line numbers and code.

When expand-expr produces a procedure, it is used to macro-expand the parsed program, and syntax coloring is based on the parsed program.

For example,

#langscribble/manual
@codeblock{
#langscribble/manual
@title{Hello}
}
}|

produces the typeset result

#langscribble/manual
@title {Hello}
}

syntax

( codeblock0 option...str-expr...+)

Like codeblock , but without the 'code-inset nested wrapper.

syntax

( code option...str-expr...+)

option = #:langlang-line-expr
| #:expandexpand-expr
| #:contextcontext-expr
lang-line-expr : (or/c #fstring? )
expand-expr : (or/c #f(syntax? . -> .syntax? ))
context-expr : (or/c #fsyntax? )
Like codeblock , but produces content instead of a block. No #lang line should appear in the string content; instead, it should be provided #:lang (as a string without "#lang ") if needed, and the #lang line is always stripped from the output when provided. Also, each newline in str-exprs is collapsed along with all surrounding whitespace to a single space.

For example,

Thisis@code [#:lang"at-expracket"]|{@bold{Hi}}|'sresult:
@bold {Hi}.

produces the typeset result

This is @bold {Hi}’s result: Hi.

procedure

( typeset-code [ #:contextcontext
#:expandexpand
#:indentindent
#:keep-lang-line?keep?
#:line-numbersline-numbers
#:line-number-sepline-number-sep
#:block?return-block?]
strs...)
(if return-block?block? element? )
context:(or/c #fsyntax? )=#f
expand:(or/c #f(syntax? . -> .syntax? ))=#f
keep?:any/c =#t
line-numbers:(or/c #fexact-nonnegative-integer? )=#f
line-number-sep:exact-nonnegative-integer? =1
return-block?:any/c =#t
strs:string?
A function-based version of codeblock , allowing you to compute the strs arguments.

Unlike codeblock , the default context argument (#f) implies that the context is untouched and the return-block? argument determines the result structure. The other arguments are treated the same way as codeblock .

4.2.1.2Racket CodeπŸ”— i

syntax

( racketblock maybe-escapedatum...)

maybe-escape =
| #:escapeescape-id
Typesets the datum sequence as a table of Racket code inset via nested with the style 'code-inset. The source locations of the datums determine the generated layout. For example,

(define (loopx)
(loop(not x))))

produces the output

(define (loopx)
(loop(not x)))

with the (loop(not x)) indented under define , because that’s the way it is idented the use of racketblock . Source-location span information is used to preserve #true versus #t and #false versus #f; span information is also used heuristically to add #i to the start of an inexact number if its printed form would otherwise be two characters shorter than the source; syntax-object properties are used to preserve square brackets and curly braces versus parentheses; otherwise, using syntax objects tends to normalize the form of S-expression elements, such as rendering 2/4 as 1/2. When source-location information is not available, such as when it is lost by bytecode-compiled macros, spacing is inserted in the same style (within a single line) as the racket form.

See also quote-syntax/keep-srcloc for use in a macro to preserve source-location information in a template.

In the above example, define is typeset as a keyword (in black) and as a hyperlink to define ’s definition in the reference manual, because this document was built using a for-label binding of define (in the source) that matches a definition in the reference manual. Similarly, not is a hyperlink to its definition in the reference manual.

Like other forms defined via define-code , racketblock expands identifiers that are bound as element transformers.

An #:escape clause specifies an identifier to escape back to an expression that produces an element . By default, the escape identifier is unsyntax . For example,

(+ 1#,(elem (racket x)(subscript "2"))))

produces

(+ 1x2)

The escape-id that defaults to unsyntax is recognized via free-identifier=? , so a binding can hide the escape behavior:

(let ([unsyntax #f])
#'(+ 1#,x))))

The RACKETBLOCK form’s default escape is UNSYNTAX instead of unsyntax .

A few other escapes are recognized symbolically:

  • ( code:linedatum... ) typesets as the sequence of datums (i.e., without the code:line wrapper).

  • ( code:commentcontent) typesets like content, but colored as a comment and prefixed with a semi-colon. A typical content escapes from Racket-typesetting mode using unsyntax and produces a string, an element using elem , or a paragraph using t :

    (code:comment @#,elem{this is a comment})

    (Note that @#,foo{...} reads as #,(foo"...").)

  • ( code:comment2content) is like code:comment, but uses two semi-colons to prefix the comment.

  • ( code:comment#content) is like code:comment, but uses #; to prefix the comment.

  • ( code:contractdatum... ) typesets like the sequence of datums (including its coloring), but prefixed with a semi-colon.

  • ( code:contract#datum) is like code:contract, but uses #; to prefix the contract.

  • code:blank typesets as a blank space.

  • ( code:hilitedatum) typesets like datum, but with a background highlight.

  • ( code:quotedatum) typesets like (quotedatum), but without rendering the quote as '.

  • _id typesets as id, but colored as a variable (like racketvarfont ); this escape applies only if _id has no for-label binding and is not specifically colored as a subform non-terminal via defform , a variable via defproc , etc.

See also scribble/comment-reader.

Changed in version 1.9 of package scribble-lib: Added heuristic for adding #i to inexact numbers.

syntax

( RACKETBLOCK maybe-escapedatum...)

Like racketblock , but with the default expression escape UNSYNTAX instead of unsyntax .

syntax

( racketblock0 maybe-escapedatum...)

Like racketblock , but without insetting the code via nested .

syntax

( RACKETBLOCK0 maybe-escapedatum...)

Like RACKETBLOCK , but without insetting the code via nested .

syntax

( racketresultblock maybe-escapedatum...)

syntax

( racketresultblock0 maybe-escapedatum...)

syntax

( RACKETRESULTBLOCK maybe-escapedatum...)

syntax

( RACKETRESULTBLOCK0 maybe-escapedatum...)

Like racketblock , etc., but colors the typeset text as a result (i.e., a single color with no hyperlinks) instead of code.

Unlike racketblock , racketresultblock and RACKETRESULTBLOCK implement indentation by adding an (hspace 2) to the start of each line, instead of using nested with the 'code-inset style. To get formatting more like racketblock and racketinput , use (nested #:style'code-inset(racketresultblock0 datum... )) instead of (racketresultblock datum... ).

syntax

( racketinput maybe-escapedatum...)

syntax

( RACKETINPUT maybe-escapedatum...)

Like racketblock and RACKETBLOCK , but the datums are typeset after a prompt representing a REPL.

syntax

( racketinput0 maybe-escapedatum...)

syntax

( RACKETINPUT0 maybe-escapedatum...)

Like racketinput and RACKETINPUT , but without insetting the code via nested .

syntax

( racketmod maybe-filemaybe-escapelangdatum...)

maybe-file =
| #:filefilename-expr
maybe-escape =
| #:escapeescape-id
Like racketblock , but the datum are typeset inside a #lang-form module whose language is lang.

The source location of lang (relative to the body datums) determines the relative positioning of the #lang line in the typeset output. So, line up lang with the left end of the content code.

If #:file is provided, then the code block is typeset using filebox with filename-expr as the filename argument.

syntax

( racketmod0 maybe-filemaybe-escapelangdatum...)

Like racketmod , but without insetting the code via nested .

syntax

( racket maybe-escapedatum...)

Like racketblock , but typeset on a single line and wrapped with its enclosing paragraph, independent of the formatting of datum.

syntax

( RACKET maybe-escapedatum...)

Like racket , but with the UNSYNTAX escape like racketblock .

syntax

( racketresult maybe-escapedatum...)

Like racket , but typeset as a result (i.e., a single color with no hyperlinks).

syntax

( racketid maybe-escapedatum...)

Like racket , but typeset as an unbound identifier (i.e., no coloring or hyperlinks).

syntax

( schemeblock maybe-escapedatum...)

syntax

( SCHEMEBLOCK maybe-escapedatum...)

syntax

( schemeblock0 maybe-escapedatum...)

syntax

( SCHEMEBLOCK0 maybe-escapedatum...)

syntax

( schemeinput maybe-escapedatum...)

syntax

( schememod langmaybe-escapedatum...)

syntax

( scheme maybe-escapedatum...)

syntax

( SCHEME maybe-escapedatum...)

syntax

( schemeresult maybe-escapedatum...)

syntax

( schemeid maybe-escapedatum...)

Compatibility aliases. Each scheme... name is an alias for the corresponding racket... binding.

4.2.1.3Preserving CommentsπŸ”— i

As a reader module, scribble/comment-reader reads a single S-expression that contains ;-based comment lines, and it wraps the comments with code:comment for use with forms like racketblock . More precisely, scribble/comment-reader extends the current reader to adjust the parsing of ;.

For example, within a Scribble document that imports scribble/manual,

@#reader scribble/comment-reader

(racketblock

;; This is not a pipe

(make-pipe)

)

generates

;This is not a pipe

The initial @ is needed above to shift into S-expression mode, so that #reader is recognized as a reader declaration instead of literal text. Also, the example uses (racketblock ....) instead of @racketblock [....] because the @-reader would drop comments within the racketblock before giving scribble/comment-reader a chance to convert them.

The implementation of scribble/comment-reader uses unsyntax to typeset comments. When using scribble/comment-reader with, for instance, RACKETBLOCK , unsyntax does not escape, since RACKETBLOCK uses UNSYNTAX as its escape form. You can declare an escape identifier for scribble/comment-reader with #:escape-id. For example,

@#reader scribble/comment-reader #:escape-id UNSYNTAX

(RACKETBLOCK

(define-syntax (m stx)

(syntax-case stx ()

[(_ x)

;; Well this was silly

#`(#,x)]))

)

generates

(define-syntax (mstx)
(syntax-case stx()
[(_ x)
;Well this was silly
#`(#,x)]))
4.2.1.4Code Fonts and StylesπŸ”— i

syntax

( racketmodname datummaybe-indirect)

(racketmodname (unsyntax expr)maybe-indirect)
maybe-indirect =
| #:indirect
Like racket , but typeset as a module path and without special treatment of identifiers (such as code:blank or identifiers that start with _). If datum is an identifier or expr produces a symbol, then it is hyperlinked to the module path’s definition as created by defmodule .

If #:indirect is specified, then the hyperlink is given the 'indirect-link style property, which makes the hyperlink’s resolution in HTML potentially delayed; see 'indirect-link for link-element .

Changed in version 1.21 of package scribble-lib: Disabled racket -style special treatment of identifiers.

syntax

( racketmodlink datumpre-content-expr...)

Like racketmodname , but separating the module path to link from the content to be linked. The datum module path is always linked, even if it is not an identifier.

procedure

( litchar str...)element?

str:string?
Typesets strs as a representation of literal text. Use this when you have to talk about the individual characters in a stream of text, as when documenting a reader extension.

procedure

( racketfont pre-content...)element?

pre-content:pre-content?
The same as (tt pre-content... ), which applies the 'tt style to immediate strings and symbols among the pre-content arguments. Beware that pre-content is decode d as usual, making racketfont a poor choice for typesetting literal code.

procedure

( racketplainfont pre-content...)element?

pre-content:pre-content?
Applies the 'tt style to pre-content. Beware that pre-content is decode d as usual, making racketplainfont a poor choice for typesetting literal code directly but useful for implementing code-formatting functions.

Added in version 1.6 of package scribble-lib.

procedure

( racketvalfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as a value.

procedure

( racketresultfont [ #:decode?decode?]
pre-content...)element?
decode?:boolean? =#t
pre-content:pre-content?
Like racketplainfont , but colored as a REPL result. When decode? is #f, then unlike racketplainfont , racketresultfont avoids decode ing its argument.

procedure

( racketidfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as an identifier.

procedure

( racketvarfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as a variable (i.e., an argument or sub-form in a procedure being documented).

procedure

( racketkeywordfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as a syntactic form name.

procedure

( racketparenfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored like parentheses.

procedure

( racketoptionalfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as optional.

Added in version 1.36 of package scribble-lib.

procedure

( racketmetafont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as meta-syntax, such as backquote or unquote.

procedure

( racketcommentfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as a comment.

procedure

( racketerror pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as error-message text.

procedure

( racketmodfont pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as module name.

procedure

( racketoutput pre-content...)element?

pre-content:pre-content?
Like racketplainfont , but colored as output.

procedure

( procedure pre-content...)element?

pre-content:pre-content?
Typesets decoded pre-content as a procedure name in a REPL result (e.g., in typewriter font with a #<procedure: prefix and > suffix.).

syntax

( var datum)

Typesets datum as an identifier that is an argument or sub-form in a procedure being documented. Normally, the defproc and defform arrange for racket to format such identifiers automatically in the description of the procedure, but use var if that cannot work for some reason.

syntax

( svar datum)

Like var , but for subform non-terminals in a form definition.

syntax

( schememodname datum)

syntax

( schememodlink datumpre-content-expr...)

procedure

( schemefont pre-content...)element?

pre-content:pre-content?

procedure

( schemevalfont pre-content...)element?

pre-content:pre-content?

procedure

( schemeresultfont pre-content...)element?

pre-content:pre-content?

procedure

( schemeidfont pre-content...)element?

pre-content:pre-content?

procedure

( schemevarfont pre-content...)element?

pre-content:pre-content?

procedure

( schemekeywordfont pre-content...)element?

pre-content:pre-content?

procedure

( schemeparenfont pre-content...)element?

pre-content:pre-content?

procedure

( schemeoptionalfont pre-content...)element?

pre-content:pre-content?

procedure

( schememetafont pre-content...)element?

pre-content:pre-content?

procedure

( schemeerror pre-content...)element?

pre-content:pre-content?

procedure

( schememodfont pre-content...)element?

pre-content:pre-content?

procedure

( schemeoutput pre-content...)element?

pre-content:pre-content?
Compatibility aliases. Each scheme... name is an alias for the corresponding racket... binding.

top
up

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /