4 Typesetting Racket Code

▼ |  | Slideshow: Figure and Presentation Tools

1 | Creating Slide Presentations
2 | Making Pictures
3 | Making Slides
4 | Typesetting Racket Code
5 | Animations
| Bibliography
| Index

On this page:

typeset-code
code
current-code-font
current-code-tt
get-current-code-font-size
current-code-line-sep
current-comment-color
current-keyword-color
current-id-color
current-literal-color
current-const-color
current-base-color
current-reader-forms
code-align
current-keyword-list
current-const-list
current-literal-list
racket/ base-const-list
mzscheme-const-list
code-colorize-enabled
code-colorize-quote-enabled
code-italic-underscore-enabled
code-scripts-enabled
define-code
make-code-transformer
prop: code-transformer
code-transformer?
define-exec-code
define-exec-code/ scale
comment-color
keyword-color
id-color
literal-color
code-pict-bottom-line-pict
pict->code-pict

top ← prev up next →

### 4`` Typesetting Racket Code

(require slideshow/code-pict)
(require slideshow/code)

The slideshow/code-pict library provides utilities for typesetting Racket code as a pict. The slideshow/code library initializes get-current-code-font-size to current-font-size.

> procedure (typeset-code stx) → pict?
> stx : syntax?

Produces a pict for code in the given syntax object. The source-location information of the syntax object determines the line breaks, line indenting, and space within a row. Empty rows are ignored.

Beware that if you use read-syntax on a file port, you may have to turn on line counting via port-count-lines! for the code to typeset properly. Also beware that when a source file containing a syntax or quote-syntax form is compiled, source location information is omitted from the compiled syntax object.

Normally, typeset-code is used through the code syntactic form, which works properly with compilation, and that escapes to pict-producing code via unsyntax. See also define-code.

Embedded picts within stx are used directly. Row elements are combined using and operator like htl-append, so use code-align (see below) as necessary to add an ascent to ascentless picts. More precisely, creation of a line of code uses pict-last to determine the end point of the element most recently added to a line; the main effect is that closing parentheses are attached in the right place when a multi-line pict is embedded in stx.

An identifier that starts with _ is italicized in the pict, and the _ is dropped, unless the code-italic-underscore-enabled parameter is set to #f. Also, unless code-scripts-enabled is set to #f, _ and ^ in the middle of a word create superscripts and subscripts, respectively (like TeX); for example foo^4_ok is displayed as the identifier foo with a 4 superscript and an ok subscript.

Further, uses of certain identifiers in stx typeset specially:

- code:blank — produces a space.

- (code:comment s ...) — produces a comment block, with each s on its own line, where each s must be a string or a pict.

- (code:line datum ...) — typesets the datum sequence, which is mostly useful for the top-level sequence, since typeset-code accepts only one argument.

- (code:contract datum ...) — like code:line, but every datum is colored as a comment, and a ; is prefixed to every line.

- (code:template datum ...) — like code:line, but a ; is prefixed to every line.

- $ — typesets as a vertical bar (for no particularly good reason).

> syntax (code datum ...)

The macro form of typeset-code. Within a datum, unsyntax can be used to escape to an expression, and identifiers bound as syntax to code transformers trigger transformations.

For more information, see typeset-code and define-code, since code is defined as

> (define-code code typeset-code)

Examples:
> > (code (+ 1 2))
> > (code (+ 1 #,(+ 1 1)))
> > (code (+ 1 #,(frame (code 2))))
> > (define-syntax two (make-code-transformer #'(code 2)))
> > (code (+ 1 two))

> parameter (current-code-font) → text-style/c
> (current-code-font style) → void?
> style : text-style/c

Parameter for a base font used to typeset text. The default is `(bold . modern). For even more control, see current-code-tt.

> parameter (current-code-tt) → (string? . -> . pict?)
> (current-code-tt proc) → void?
> proc : (string? . -> . pict?)

Parameter for a one-argument procedure to turn a string into a pict, used to typeset text. The default is

> (lambda (s) (text s (current-code-font) ((get-current-code-font-size))))

This procedure is not used to typeset subscripts or other items that require font changes, where current-code-font is used directly.

> parameter (get-current-code-font-size) → (-> exact-nonnegative-integer?)
> (get-current-code-font-size proc) → void?
> proc : (-> exact-nonnegative-integer?)

A parameter used to access the default font size. The slideshow/code library initializes this parameter to current-font-size.

> parameter (current-code-line-sep) → real?
> (current-code-line-sep amt) → void?
> amt : real?

A parameter that determines the spacing between lines of typeset code. The default is 2.

> parameter (current-comment-color) → (or/c string? (is-a?/c color%))
> (current-comment-color color) → void?
> color : (or/c string? (is-a?/c color%))

A parameter for the color of comments.

> parameter (current-keyword-color) → (or/c string? (is-a?/c color%))
> (current-keyword-color color) → void?
> color : (or/c string? (is-a?/c color%))

A parameter for the color of syntactic-form names. See current-keyword-list.

> parameter (current-id-color) → (or/c string? (is-a?/c color%))
> (current-id-color color) → void?
> color : (or/c string? (is-a?/c color%))

A parameter for the color of identifiers that are not syntactic form names or constants.

> parameter (current-literal-color) → (or/c string? (is-a?/c color%))
> (current-literal-color color) → void?
> color : (or/c string? (is-a?/c color%))

A parameter for the color of literal values, such as strings and numbers. See also current-literal-list

> parameter (current-const-color) → (or/c string? (is-a?/c color%))
> (current-const-color color) → void?
> color : (or/c string? (is-a?/c color%))

A parameter for the color of constant names. See current-const-list.

> parameter (current-base-color) → (or/c string? (is-a?/c color%))
> (current-base-color color) → void?
> color : (or/c string? (is-a?/c color%))

A parameter for the color of everything else.

> parameter (current-reader-forms) → (listof symbol?)
> (current-reader-forms syms) → void?
> syms : (listof symbol?)

Parameter for a list of symbols indicating which built-in reader forms should be used. The default is ''quasiquote. Remove a symbol to suppress the corresponding reader output.

> procedure (code-align pict) → pict?
> pict : pict?

Adjusts the ascent of pict so that its bottom aligns with the baseline for text; use this function when pict has no ascent.

> parameter (current-keyword-list) → (listof string?)
> (current-keyword-list names) → void?
> names : (listof string?)

A list of strings to color as syntactic-form names. The default includes all of the forms provided by racket/base and all of the forms provided by mzscheme.

> parameter (current-const-list) → (listof string?)
> (current-const-list names) → void?
> names : (listof string?)

A list of strings to color as constant names. The default is null.

> parameter (current-literal-list) → (listof string?)
> (current-literal-list names) → void?
> names : (listof string?)

A list of strings to color as literals, in addition to literals such as strings. The default is null.

> value racket/base-const-list : (listof string?)

A list of strings that could be used to initialize the current-const-list parameter.

> value mzscheme-const-list : (listof string?)

A list of strings that could be used to initialize the current-const-list parameter.

> parameter (code-colorize-enabled) → boolean?
> (code-colorize-enabled on?) → void?
> on? : any/c

A parameter to enable or disable all code coloring. The default is #t.

> parameter (code-colorize-quote-enabled) → boolean?
> (code-colorize-quote-enabled on?) → void?
> on? : any/c

A parameter to control whether under a quote is colorized as a literal (as in this documentation). The default is #t.

> parameter (code-italic-underscore-enabled) → boolean?
> (code-italic-underscore-enabled on?) → void?
> on? : any/c

A parameter to control whether _-prefixed identifiers are italicized (dropping the _). The default is #t.

> parameter (code-scripts-enabled) → boolean?
> (code-scripts-enabled on?) → void?
> on? : any/c

A parameter to control whether TeX-style subscripts and subscripts are recognized in an identifier.

> syntax (define-code code-id typeset-code-id)
> (define-code code-id typeset-code-id escape-id)

Defines code-id as a macro that uses typeset-code-id, which is a function with the same input as typeset-code. The escape-id form defaults to unsyntax.

The resulting code-id syntactic form takes a sequence of datums:

> (code-id datum ...)

It produces a pict that typesets the sequence. Source-location information for the datum determines the layout of code in the resulting pict. The code-id is expanded in such a way that source location is preserved during compilation (so typeset-code-id receives a syntax object with source locations intact).

If a datum contains (escape-id expr)—perhaps as #,expr when escape-id is unsyntax—then the expr is evaluated and the result datum is spliced in place of the escape-id form in datum. If the result is not a syntax object, it is given the source location of the escape-id form. A pict value intected this way as a datum is rendered as itself.

If a datum contains (transform-id datum ...) or transform-id for a transform-id that is bound as syntax to a code transformer, then the (transform-id datum ...) or transform-id may be replaced with an escaped expression, depending on the code transformer’s result.

> procedure (make-code-transformer proc-or-stx) → code-transformer?
> | proc-or-stx |  | : |  |
> (or/c (syntax? . -> . (or/c syntax? #f))
> syntax?)
> value prop:code-transformer : struct-type-property?
> procedure (code-transformer? v) → boolean?
> v : any/c

Exported for-syntax for creating code transformers.

For code transformer created with (make-code-transformer proc), proc takes a syntax object representing the use of an identifier bound to the transformer, and it produces an expression whose value replaces the identifier use within a code form or a form defined via define-code. Like a macro transformer, a code transformer is triggered either by a use of the bound identifier in an “application” position, in which case the transformer receives the entire “application” form, or the identifier by itself can also trigger the transformer. The code transformer’s proc can return #f, in which case the use of the identifier is left untransformed; if the identifier was used in an “application” position, the transformer proc will be called again for the identifier use by itself.

A code transformer produced by (make-code-transformer stx) is equivalent to

> (make-code-transformer (lambda (use-stx)
> (if (identifier? use-stx)
> stx
> #f)))

A structure type with the prop:code-transformer property implements a code transformer. The property value must be a procedure of one argument, which receives the structure and returns a procedure that is like a proc passed to make-code-transformer, except that the property value takes the structure instance as an argument before the syntax object to transform.

The code-transformer? predicate returns #t for a value produced by make-code-transformer or for an instance of a structure type with the prop:code-transformer property, #f otherwise.

Example:
> > (let-syntax ([bag (make-code-transformer #'(code hat))]
> [copy (make-code-transformer (syntax-rules ()
> [(_ c) (code (* 2 c))]))])
> (inset (frame (code ((copy cat) in the bag))) 2))

> > syntax
> > (define-exec-code (pict-id runnable-id string-id)
> > datum ...)

Binds pict-id to the result of (code datum ...), except that if an identifier _ appears anywhere in a datum, then the identifier and the following expression are not included for code.

Meanwhile, runnable-id is bound to a syntax object that wraps the datums in a begin. In this case, _s are removed from the datums, but not the following expression. Thus, an _ identifier is used to comment out an expression from the pict, but have it present in the syntax object for evaluation.

The string-id is bound to a string representation of the code that is in the pict. This string is useful for copying to the clipboard with (send the-clipboard set-clipboard-string string-id 0).

> > syntax
> > (define-exec-code/scale scale-expr (pict-id runnable-id string-id)
> > datum ...)

Like define-exec-code, but with a scale to use via scale/improve-new-text when generating the pict.

> value comment-color : (or/c string? (is-a?/c color%))
> value keyword-color : (or/c string? (is-a?/c color%))
> value id-color : (or/c string? (is-a?/c color%))
> value literal-color : (or/c string? (is-a?/c color%))

For backward compatibility, the default values for current-comment-color, etc.

> procedure (code-pict-bottom-line-pict pict) → (or/c pict? #f)
> pict : pict?

The same as pict-last, provided for backward compatibility.

> procedure (pict->code-pict pict bl-pict) → pict?
> pict : pict?
> bl-pict : (or/c pict? #f)

Mainly for backward compatibility: returns (if bl-pict (use-last pict (or (pict-last bl-pict) bl-pict))).
top ← prev up next →