---
title: Typst property output
author: Gordon Woodhull
---
Pandoc Typst property output
============================
In addition to the output of structural properties built into Pandoc's Typst Writer, the Writer can also output non-structural Typst properties. This is enabled by setting attributes with keys of the form `typst:prop` or `typst:text:prop` on supported elements.
Typst properties
----------------
[Typst](https://typst.app/) allows specification of visual and layout properties as parameters to elements
```typst
#block(fill=orange)[Hello]
```
and set-rules
```typst
#set text(fill=blue); Hello
```
The parameter values are [Typst code](https://typst.app/docs/reference/syntax/#modes) that can use any features of the Typst language.
Pandoc Typst property output
----------------------------
For the set of supported Pandoc elements, the Pandoc Typst Writer will output attributes as parameters to corresponding Typst elements or set-text rules.
The Typst Writer looks for attributes with keys of the form `typst:prop` or `typst:text:prop` and assumes the values are raw Typst code.
`prop` is the name of the property to set.
For example, `pandoc -f html -t typst` with HTML input
```html
foo
```
produces Typst output
```typst
#block(inset: 10pt)[
foo
]
```
and with HTML input
```html
foo
```
it produces Typst output
```typst
#block[
#set text(fill: purple); foo
]
```
The Typst Writer does not check the validity of `prop` or the value. Since Typst is a statically typed language, improper property names or values usually result in compilation failure.
Supported elements
------------------
The following Pandoc AST elements are currently supported. More may be supported in the future.
- [Span](https://pandoc.org/lua-filters.html#type-span)
`typst:text:prop`
: The content is wrapped in a Typst [text element](https://typst.app/docs/reference/text/text/) with the specified properties set.
- [Div](https://pandoc.org/lua-filters.html#type-div)
`typst:prop`
: The `prop` is output as a parameter to the Typst [block element](https://typst.app/docs/reference/layout/block/).
`typst:text:prop`
: The `prop` is output as a parameter to a set-text rule at the start of the block content.
- [Table](https://pandoc.org/lua-filters.html#type-table)
`typst:prop`
: The `prop` is output as a parameter to the Typst [table element](https://typst.app/docs/reference/model/table/).
`typst:text:prop`
: The table is wrapped in a Typst [text element](https://typst.app/docs/reference/text/text/) with `prop` as one of its parameters.
`typst:no-figure` (class)
: By default, Pandoc will wrap the table in a Typst [figure element](https://typst.app/docs/reference/model/figure/). If the table has this class, only the table element itself will be emitted. This avoids Typst's crossreference counter of kind `table` from being incremented.
`typst:figure:kind`
: If this attribute is set, Pandoc will wrap the table in a Typst [figure element](https://typst.app/docs/reference/model/figure/) with the specified `kind` attribute. This is useful for tables that should be cross-referenced as something other than `Table ...` in the document. Typst will use the `kind` attribute to increment the corresponding counter: `raw` and `image`.
- Table [Cell](https://pandoc.org/lua-filters.html#type-cell)
`typst:prop`
: The `prop` is output as a parameter to the Typst table [cell element](https://typst.app/docs/reference/model/table/#definitions-cell).
`typst:text:prop`
: The `prop` is output as a parameter to a set-text rule at the start of the cell content.
Lua filter example
------------------
Here is a minimal example of a Lua filter which translates the CSS [color property](https://developer.mozilla.org/en-US/docs/Web/CSS/color) on a span element to the equivalent [fill parameter](https://typst.app/docs/reference/text/text/#parameters-fill) on a Typst text element.
```lua
function styleToTable(style)
if not style then return nil end
local ret = {}
for clause in style:gmatch('([^;]+)') do
k,v = clause:match("([%w-]+)%s*:%s*(.*)$")
ret[k] = v
end
return ret
end
function Span(span)
local style = styleToTable(span.attributes['style'])
if not style then return end
if style['color'] then
span.attributes['typst:text:fill'] = style['color']
end
return span
end
```
Given the HTML input
```html
Here is some orange text.
```
the command
```sh
pandoc -f html -t typst --lua-filter ./typst-property-example.lua
```
will produce the Typst output
```typst
Here is some #text(fill: orange)[orange text].
```
Of course, this simple filter will only work for Typst's [predefined colors](https://typst.app/docs/reference/visualize/color/#predefined-colors). A more complete filter would need to translate the value as well.