Manual
The document
OverviewGrammarDocument headerSyntax cheatsheet Scene Step
Content
Text blocks
Paragraph Heading 1 Heading 2 Heading 3 Heading 4 List
Maths
Equation Maths
Tables & images
Table Image
Formatting
Bold Italics Inline Code Highlight
Text colours
Links & references
Link Footnote Icon Internote Reference
ValueWhere inline content works
Narrative only
Note Definition Example Task Divider
Graph pane
Graph
Curves & areas
Curve Integral
Data marks
Scatter Histogram
Fits
Fit Residuals
Surfaces
Contour Heatmap
Marks
Line Segment Vector Point Polygon Text
Shapes
Circle Square Rectangle Triangle Star Diamond Hexagon
Axis furniture
Axis label Axis Brace
Expressions
Code pane
Code Lines
Animation & interaction
Cues that wrap content
Cue Draw cue Trace cue Highlight cue Spotlight cue Type cue
Cues on a value
Value cue Zoom cue
Anchors & timing Parameter
Advanced features
Data Let Define Preset Include If For Ignore
Reference
All constructs A–ZAttribute types
Concepts
IdentifiersBody & detailDerived attributes
Guidance
The narrative contractWhat earns a place on the canvasParameter or cueHonest numbersCode demonstrates, never computesAuthor-attached data only
?
  1. Reference
  2. Guidance
  3. Honest numbers

Honest numbers

Never type a number the canvas computes. Read it live, so the prose cannot disagree with the picture.

#The rule

Never type a number the canvas computes. If a fit, an integral, a curve or a parameter produces it, read it live.

A typed number is correct exactly once — at the moment the author read it off the screen. After that, any edit to the data, any change to the model, any reader who moves a slider, and the sentence is asserting something the picture beside it contradicts. The reader cannot tell which one to believe, and they are looking at both.

#Reading a value instead of typing it

In prose, !value takes the reference as its implicit attribute and formats the result: digits for decimal places, format for the presentation, maths to set it in maths type so it matches the surrounding notation.

Right now $k$ = !value:#k.value(maths), and the band holds
!value:#band.value(digits: 3; format: percent) of the distribution.

In attribute position the binding is written bare — text(label: slope = #f.slope) — because an attribute already has a declared type to resolve it against. Derived attributes lists what each construct publishes.

#Why substitution refuses live values

{{#fit.slope}} does not fail because the machinery is missing. It fails because a substitution splices text into the source before parsing — a compile-time snapshot of a number that moves at render time is precisely the disagreement this rule exists to prevent, so the compiler refuses it rather than letting it look like it worked.

Dataset columns are substitutable, and the difference is instructive: a dataset is immutable by construction, so its snapshot can never go stale.

#Rounding and formatting

  • Choose digits deliberately. An unrounded value reads as spurious precision; too few digits can make two different quantities print identically.
  • Set maths: true when the number sits in mathematical prose, so it matches the surrounding $…$ rather than sitting in body type beside it.
  • Do not restate a live value in the same sentence as a typed approximation. "about 0.34" beside !value is the same disagreement, written more politely.
On this page
The ruleReading a value instead of typing itWhy substitution refuses live valuesRounding and formatting
PrivacyTermsContact Support
Honest numbers · Internote