Typstyle Docs

Markup Formatting

Lists and Enumerations

List Indentation

List indentation is automatically corrected and standardized:

Example
Before
 -   Fruit
      - Apple
  -     Banana
- Vegetable
      -    Carrot
      - Tomato
 -   Fruit
      - Apple
  -     Banana
- Vegetable
      -    Carrot
      - Tomato
After
- Fruit
  - Apple
  - Banana
- Vegetable
  - Carrot
  - Tomato
- Fruit
  - Apple
  - Banana
- Vegetable
  - Carrot
  - Tomato

Lists in Content Blocks

Lists within content blocks are properly formatted with surrounding linebreaks:

Example
Before
#{
  [- single]
  [- indented
  - less
  ]
  [- indented
   - same
  - then less
   - then same
  ]
  [- indented
    - more
   - then same
  - then less
  ]
}
#{
  [- single]
  [- indented
  - less
  ]
  [- indented
   - same
  - then less
   - then same
  ]
  [- indented
    - more
   - then same
  - then less
  ]
}
After
#{
  [- single]
  [
    - indented
    - less
  ]
  [
    - indented
    - same
    - then less
      - then same
  ]
  [
    - indented
      - more
    - then same
    - then less
  ]
}
#{
  [- single]
  [
    - indented
    - less
  ]
  [
    - indented
    - same
    - then less
      - then same
  ]
  [
    - indented
      - more
    - then same
    - then less
  ]
}

Text Wrapping

When text wrapping is enabled with --wrap-text--wrap-text, typstyle intelligently wraps long lines while preserving important formatting and semantic structure:

Example wrap_text: true, max_width: 30
Before
Let's say you have a long text that needs to be wrapped in the markup. This is a very long sentence.
Let's say you have a long text that needs to be wrapped in the markup. This is a very long sentence.
After
Let's say you have a long text
that needs to be wrapped in
the markup. This is a very
long sentence.
Let's say you have a long text
that needs to be wrapped in
the markup. This is a very
long sentence.

Wrapping Rules

typstyle applies specific wrapping logic based on node types:

  • Cannot break before: Markup markers (==, ++, --, //) and labels to prevent misinterpretation
  • Force hard breaks: Around block equations to keep them on exclusive lines
  • Preserve breaks after: Block elements, line comments, and structural nodes (code blocks, conditionals, loops)
  • Exclusive lines: Single non-text nodes or hash-prefixed expressions (e.g., #figure()#figure())
  • Soft breaks: Regular spaces become flexible break points unless restricted by above rules
Example wrap_text: true, max_width: 30
Before
Some pieces should be exclusion except $"inline equation"$ and `raw`:
- This is a list
$ "block equation" $
#figure([Figures])
#figure([Labeled figures]) <label>
That's all! Wait, a linebreak \
should be \ kept at the end
\ of the line. \
But \ / never \ = break \ + before \ - markers
#[Never \ / Give \ = You \ + Up \
]
#([Man!\ ], [\ What\ can\ I\ say\ ?])

#let fig = (..) => []
#fig("image1")[Caption] <label1>
#fig("image2")[Caption] <label2>

This is a code block: #{
  // code block!
}
I don't want to eat the linebreak.
A blocky node should not stick #[

]
the content after it.
Not #if true { }
Not #while false { }
Not #for i in range(5) {}
Not #context 1
And block equations: $ eq $
And
also ``` block
  raw ```
but not ``` non-block raw ```
End
...
Some pieces should be exclusion except $"inline equation"$ and `raw`:
- This is a list
$ "block equation" $
#figure([Figures])
#figure([Labeled figures]) <label>
That's all! Wait, a linebreak \
should be \ kept at the end
\ of the line. \
But \ / never \ = break \ + before \ - markers
#[Never \ / Give \ = You \ + Up \
]
#([Man!\ ], [\ What\ can\ I\ say\ ?])

#let fig = (..) => []
#fig("image1")[Caption] <label1>
#fig("image2")[Caption] <label2>

This is a code block: #{
  // code block!
}
I don't want to eat the linebreak.
A blocky node should not stick #[

]
the content after it.
Not #if true { }
Not #while false { }
Not #for i in range(5) {}
Not #context 1
And block equations: $ eq $
And
also ``` block
  raw ```
but not ``` non-block raw ```
End
...
After
Some pieces should be
exclusion except
$"inline equation"$ and `raw`:
- This is a list
$ "block equation" $
#figure([Figures])
#figure([Labeled
  figures]) <label>
That's all! Wait, a linebreak
\
should be \ kept at the end \
of the line. \
But \ / never \ = break \ +
before \ - markers
#[Never \ / Give \ = You \ +
  Up \
]
#(
  [Man!\ ],
  [\ What\ can\ I\ say\ ?],
)

#let fig = (..) => []
#fig(
  "image1",
)[Caption] <label1>
#fig(
  "image2",
)[Caption] <label2>

This is a code block: #{
  // code block!
}
I don't want to eat the
linebreak. A blocky node
should not stick #[

]
the content after it. Not
#if true {}
Not #while false {}
Not #for i in range(5) {}
Not #context 1
And block equations:
$ eq $
And also
``` block
raw ```
but not ``` non-block raw ```
End
...
Some pieces should be
exclusion except
$"inline equation"$ and `raw`:
- This is a list
$ "block equation" $
#figure([Figures])
#figure([Labeled
  figures]) <label>
That's all! Wait, a linebreak
\
should be \ kept at the end \
of the line. \
But \ / never \ = break \ +
before \ - markers
#[Never \ / Give \ = You \ +
  Up \
]
#(
  [Man!\ ],
  [\ What\ can\ I\ say\ ?],
)

#let fig = (..) => []
#fig(
  "image1",
)[Caption] <label1>
#fig(
  "image2",
)[Caption] <label2>

This is a code block: #{
  // code block!
}
I don't want to eat the
linebreak. A blocky node
should not stick #[

]
the content after it. Not
#if true {}
Not #while false {}
Not #for i in range(5) {}
Not #context 1
And block equations:
$ eq $
And also
``` block
raw ```
but not ``` non-block raw ```
End
...

Multilingual Text Support

typstyle measures Unicode width and will not break between words if no space exists in the original text.

Example wrap_text: true, max_width: 40
Before
这是一个中文段落,包含链接 https://typst.app/*强调文本*。
続いて`コード要素`と https://docs.typst.app/ を含む日本語の段落です。

Mixed CJK and Latin: Visit 访问 https://example.com/文档 for documentation.
한글과 URL: https://한글.kr/ contains Korean text mixed with $alpha + beta$.

Multiple scripts: أهلاً بك في *타이프스트* เอกสาร with `inline code`.
这是一个中文段落,包含链接 https://typst.app/ 和*强调文本*。
続いて`コード要素`と https://docs.typst.app/ を含む日本語の段落です。

Mixed CJK and Latin: Visit 访问 https://example.com/文档 for documentation.
한글과 URL: https://한글.kr/ contains Korean text mixed with $alpha + beta$.

Multiple scripts: أهلاً بك في *타이프스트* เอกสาร with `inline code`.
After
这是一个中文段落,包含链接
https://typst.app/*强调文本*。
続いて`コード要素`と
https://docs.typst.app/
を含む日本語の段落です。

Mixed CJK and Latin: Visit 访问
https://example.com/文档 for
documentation. 한글과 URL:
https://한글.kr/ contains Korean text
mixed with $alpha + beta$.

Multiple scripts: أهلاً بك في *타이프스트*
เอกสาร with `inline code`.
这是一个中文段落,包含链接
https://typst.app/ 和*强调文本*。
続いて`コード要素`と
https://docs.typst.app/
を含む日本語の段落です。

Mixed CJK and Latin: Visit 访问
https://example.com/文档 for
documentation. 한글과 URL:
https://한글.kr/ contains Korean text
mixed with $alpha + beta$.

Multiple scripts: أهلاً بك في *타이프스트*
เอกสาร with `inline code`.