sphinx-typst-render
Compile Typst sources during a Sphinx or Jupyter Book build. Each source becomes a PDF students can download, plus an optional inline preview image that follows the page theme.
Typst ships inside the typst wheel as a
statically linked extension module, so there is no typst CLI to install and no
Rust toolchain on the build machine.
Install
pip install sphinx-typst-render
Enable
In a Jupyter Book _config.yml:
sphinx:
extra_extensions:
- sphinx_typst_render
In a plain Sphinx conf.py:
extensions = ["sphinx_typst_render"]
Use
```{typst} worksheets/week3.typ
:label: Week 3 worksheet
```
The block renders nothing into the page. It compiles worksheets/week3.typ
and adds the resulting PDF to the theme's download menu, beside the page's own
.ipynb and .pdf entries, under a heading you configure.
Pass :inline: to also show a preview image and a download link in the body.
Options
| Option | Default | Meaning |
|---|---|---|
:preview: |
none, or svg with :inline: |
svg, png, or none. |
:page: |
1 |
Which page to preview in a multi page document. |
:height: |
unset | Height of the preview image, e.g. 420px. |
:alt: |
generated | Alt text for the preview image. |
:label: |
generated | Text of the download link. |
:ppi: |
144 |
Resolution of a png preview. |
:class: |
none | Extra CSS classes on the wrapper. |
:inline: |
off | Also show a preview and link in the page body. |
:fillable: |
off | Add interactive form fields. See below. |
Configuration
| Value | Default | Meaning |
|---|---|---|
typst_render_preview |
"svg" |
Default for :preview:. |
typst_render_ppi |
144.0 |
Default for :ppi:. |
typst_render_stage_field_library |
True |
Stage capture_field.typ into the source root. |
typst_render_source_label |
"Source" |
Heading above the page's own downloads. |
typst_render_downloads_label |
"Worksheets" |
Heading above the rendered PDFs. |
The download menu
Rendered PDFs are added to the download dropdown that sphinx-book-theme puts in the article header, so students find them where they already look for the page source. Two headings separate the groups, and both are configurable because what the page is differs per project:
sphinx:
config:
typst_render_source_label: Manual # or Chapter, Page, Book
typst_render_downloads_label: Worksheets
That renders as:
Manual
.ipynb
.pdf
Worksheets
Organizer 1.1 (fillable)
Set either to an empty string to leave that group unlabelled.
The headings are inserted by a small stylesheet and script shipped with this
package. They are not built server side because the theme's button macro
dispatches on a fixed set of item types and forces its own CSS class, so a
non-link entry cannot be expressed through the header_buttons context.
Without a theme that provides such a menu, the PDFs are still written and
copied, and a warning names the page whose downloads are unreachable. Use
:inline: in that case.
Why SVG previews
With :inline:, an SVG preview is line art, so a theme that inverts diagrams for dark mode
handles it correctly, and it stays sharp at any zoom. Use :preview: png for a
worksheet that contains photographs, and pair it with whatever class your theme
uses to opt out of inversion:
```{typst} worksheets/week5.typ
:preview: png
:class: no-invert
```
Fillable PDFs
Typst cannot emit interactive form fields on its own. Support is requested in
typst/typst#1765 and is still
open. This package therefore delegates to
typst-fillable, which reads
field geometry back out of the compiled document with typst.query(), draws a
transparent AcroForm overlay with ReportLab, and merges it with pypdf.
Mark fields in the Typst source with the helper, then add :fillable::
#import "/_typst_lib/capture_field.typ": text_field, checkbox_field, textarea_field
Measured $U_(i n)$: #text_field("u_in", width: 80pt)
Did the output clip? #checkbox_field("clipped")
Explain the discrepancy:
#textarea_field("discussion", height: 60pt)
capture_field.typ is staged into _typst_lib/ at the root of your Sphinx
source directory on every build, so the import path above is stable wherever the
worksheet lives. Set typst_render_stage_field_library = False to manage it
yourself.
Available helpers are text_field, textarea_field, checkbox_field, and
radio_field, plus the lower level capture_field.
Caching
Output is written beside the source and skipped when nothing relevant changed.
The cache key covers the source, every other .typ file in the same folder, the
staged helper, and the render options.
Imports that reach outside the source folder are not tracked. Keep shared partials next to the worksheets that use them, or touch the importing file to force a rebuild.
Add the generated artefacts to .gitignore:
*.typst-stamp
Commit the PDFs if you want the book to build without recompiling, or ignore them too and let CI regenerate them.
Licence
MIT
Metadata
Release files for sphinx-typst-render 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sphinx_typst_render-0.2.0.tar.gz | 12.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sphinx_typst_render-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 27.5 kB
Release files / sphinx_typst_render-0.2.0.tar.gz
| Download URL | sphinx_typst_render-0.2.0.tar.gz |
|---|---|
| Size | 12.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
67c3bdcd46a222a2a5ff152b7b880f9fbcb432adb5c8082ce41943d22261d17c
|
|
BLAKE2b-256 checksum How to use checksums |
d3c53e09bc6c7be45dac4cc1155ccceb75080a68349d3098d48c66017f688211
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / sphinx_typst_render-0.2.0-py3-none-any.whl
| Download URL | sphinx_typst_render-0.2.0-py3-none-any.whl |
|---|---|
| Size | 15.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
75f7b200eadad2fddc76b1c55aee3fef5ded7fb0646c34b769557f0d24a74e59
|
|
BLAKE2b-256 checksum How to use checksums |
df8e031fe52a32cbf30f034a0d2d3353540a603a66d3ec7feb10306b66c838e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|