Parsing and evaluating typst syntax.

Version on this page:
LTS Haskell 22.17:
Stackage Nightly 2024-04-14:
Latest on Hackage:

See all snapshots typst appears in

BSD-3-Clause licensed by John MacFarlane
Maintained by [email protected]
This version can be pinned in stack with:typst-,3907

Module documentation for

A library for parsing and evaluating typst syntax. Typst (https://typst.app) is a document layout and formatting language. This library targets typst 0.10 and currently offers only partial support.


Revision history for typst-hs

  • Set evalPackageRoot to working dir to start, even if the file to be converted is somewhere else. This seems to be what the test suite expects.

  • Make file loading relative to package root if present (#39).

  • Parser: remove pBindExpr from pBaseExpr. It does not seem to be necessary, and it causes problems with things like $#x = $y$ (#34).

  • Fix assignment of module name in package imports (#30).

  • Don’t allow container.at to insert new values (#26).

  • Handle dict.at(variable) = expression (#25).

  • Remove dependency on the unmaintained digits library (#24). We just copy the code for the function we need (with attribution): it is BSD3-licensed.


  • Support “as” keyword in imports (#21). [API change] In Typst.Syntax, the Imports type now contains fields for an optional “as” identifier.

  • Support version type (#21). [API change] Add VVersion constructor to Val, TVersion to ValType. Support the version constructor function and the at method (#21).

  • Parser: Ensure that set rule doesn’t pick up if on next line (#23).

  • Parser: Allow multiline strings (#20).

  • Allow function applications in dictionary key construction (#19). [API change]: in Typst.Syntax, the Dict constructor for Expr now takes type [Spreadable (Expr, Expr)] instead of [Spreadable (Identifier, Expr)]. This is because the key identifiers sometimes are not known at parse time and must be computed in Evaluate.


  • evaluateTypst now returns a single Content instead of a sequence (breaking API change). The Content is a “document” element that wraps the other contents. (This is added automatically in typst: https://typst.app/docs/reference/model/document/#parameters-title.)

  • Improve math parser.

  • Add sys module and sys.version.

  • Math: add sech and csch operators, math.mid.

  • math.op is no longer limited to string argument.

  • Remove automatic matching for |..| in math (typst 0.8 breaking change).

  • Fix in so it works with a type.

  • repr label with angle brackets.

  • cite now just takes one positional element, a label instead of strings (typst 0.9 breaing change).

  • Add quote element.

  • Add first-class types. type() function now returns a ValType instead of a string. Allow ValTypes to == strings for compatibility, as in typst.

  • highlight element for text.

  • Allow array zip method to take any number of arguments.

  • Add calc.tau.

  • Add array intersperse method.

  • Add string rev method.

  • Fix search path for typst packages, from cache/typst/packages/preview/packagename-major.minor.patch to cache/typst/packages/preview/packagename-major/minor.patch (#18).

  • Add support of ‘wide’ spacing character.

  • Fix precedence for numerical attachments (#17). Typst makes a subtle distinction between $a_1(x)$, in which the _ groups more tightly than the (..), and $a_f(x)$, in which the (..) groups more tightly than the _. This patch implements the distinction. This fixes conversion of, e.g., $n(a)^(b)$.

  • Use typst-symbols 0.1.5.

  • Fix resolution of symbols (#15). Symbols like dot, which only have variants, were not being properly resolved: we were getting the last matching variant rather than the first.

  • Avoid text’s readFile in cli app (#13). Instead read as bytestring and force interpretation as UTF-8.

  • Fix some parser edge cases involving emphasis after ' (#12).

  • Add metadata element.

  • Add dedup method for vector.

  • Add math.class

  • Make MAttach on symbols include limits if symbol is relation. This is a 0.7 change: “Changed relations to show attachments as limits by default (e.g. in $a ->^x b$).”

  • Add Typst.MathClass.

  • Add im, id, tr text operators.

  • Parse math symbol shorthands as identifiers.

  • Use typst-symbols 0.1.4 so we get all of the defined shorthands.

  • Fix tests because of breaking symbol change ident -> equiv.

  • Depend on dev texmath.

  • Allow multiplying a ratio by a length.

  • Use symModule and mathModule directly when evaluating Equation instead of looking up sym and math.

  • Fix parsing of escapes in string literals. Symbols in general can’t be escaped. There is just a small list of valid escapes.

  • Fix bugs in converting typst regexes to TDFA’s format.

  • Allow Symbol to be regex replacement text.

  • Allow VString and VSymbol to be +’d.

  • Update for toml-parser- API changes (#9, Eric Mertens).

  • Derive the decoder for typst.toml (#7, Eric Mertens)

  • Implement typst’s toml() function (#8, Eric Mertens).

  • We now target typst 0.6.

  • joinVals - fall back on repr when as a fallback in joining values.

  • Fix a spacing issue in parsing code inside equations (#6).

  • Fix #include. It wasn’t including content!

  • Fix issue with math parsing of factorial (#5).

  • Handle “style” by evaluating it immediately, rather than passing it through as an element in content (#4).

  • Add outline.entry.

  • Allow identifiers to start with _.

  • Fix bug in parsing consecutive ‘#’ expressions in math function (#2).

  • Fix bugs in makeLiteralRE.

  • Give namedArg an argument for a default value. This avoids spurious parse error messages.

  • Change return value of dictionary insert method to none.

  • Improve #panic output.

  • [API change]: Add Spreadable type in Typst.Syntax. Use this for Dict and Array values.

  • Handle package lookup, assuming packages are either local or cached.

  • API change: combine IO operations into Operations structure. evaluateTypst now takes a single Operations dictionary instead of separate loadBytes and currentUTCTime functions. And Operations now also includes functions to query environment variables and check directories. This will be needed for package lookup.

  • Depend on typst-symbols 0.1.2.

  • Make factorial take priority over fraction.

  • We now target typst 0.5.

  • Implement methods for datetime.

  • Implement base parameter on str.

  • Add datetime constructor.

  • Implement datetime.today.

  • Add VDateTime type.

  • Implement fields method on content.

  • Add display, inline, script, sscript to math module.

  • Add str.to-unicode, str.from-unicode.

  • Add calc.ln and calc.exp.

  • Remove deprecated calc.mod.

  • Depend on typst-symbols 0.1.1.

  • First version. Released on an unsuspecting world.