The only downside of typst is that there is no libtypst, which would make it easy to embed.
I know of a few Rust crates that offer something like this - Minijinja, off the top of my head.
[1]: https://doc.rust-lang.org/nomicon/ffi.html#calling-rust-code...
https://github.com/messense/typst-py