A simple Resource for generating rasterized textures (Handle<Image>) out of either standalone .typ files or structured, zipped typst projects, built on typst-as-lib.
To use this crate, add the TypstTexturesPlugin to your bevy app then request textures through TypstTextureServer:
use bevy::prelude::*;
use bevy_typst_textures::{TypstJobOptions, TypstTextureServer, TypstTexturesPlugin};
fn main() {
App::new()
.add_plugins((DefaultPlugins, TypstTexturesPlugin::default()))
.add_systems(Startup, start)
.run();
}
fn start(mut commands: Commands, mut typst_server: ResMut<TypstTextureServer>) {
commands.spawn(Camera2d);
commands.spawn(Sprite {
image: typst_server.add_job("my_zip_in_the_asset_folder.zip".into(), TypstJobOptions::default()),
..default()
});
commands.spawn(Sprite {
image: typst_server.add_job_with_dict_input("my_zip_in_the_asset_folder.zip".into(), typst::foundations::Dict::new(), TypstJobOptions::default()),
..default()
});
}Standalone .typ files can be loaded, but they will not have access to the bevy asset/ folder or any other .typ files and if you want to display text then either the typst-search-system-fonts or typst-asset-fonts features must be enabled.
For complex typst projects that need access to guaranteed, specific fonts as well as other assets, you'll need to create a .zip archive containing:
- a
main.typfile. - an optional
package.tomlfile:- This doesn't need to be populated with anything right now.
- That said, it expects:
- a name field
- a list of author strings
- a list of bevy
asset/folder asset requests (doesn't do anything right now) - a list of typst "universe" package requests (doesn't do anything right now)
- Any .otf fonts needed (they can exist anywhere, but a
fonts/folder is a good idea)- unless either of the
typst-search-system-fontsortypst-asset-fontscrate features are enabled, which will enable use of system fonts or the "default" typst fonts as embedded assets, respectively. This does still put the onus on you and your users to have these fonts either installed or bundled.
- unless either of the
- Typst modules, assets, images, SVGs, data, etc.
This project is built on top of the typst-as-lib crate, which provides a nice wrapper over the internals of typst for standalone projects. The limitations of typst-as-lib are inherited by this crate.
This package expects typst assets as zip archives to simplify the asset-fetching process (as outlined above).
Packages are supported, but not on web. This may change in the future, but for now this does not work.
The archive unzipping is a bit fragile right now. Lots of unwraps and assumptions about how different OSs handle zip archives, and some ad-hoc dealing with how they pollute filesystems with metadata (__MACOS/ delenda est). Because zipping manually is a pain, I'd suggest setting up something to create zips of your typst assets folders in a build.rs script or as part of a watch command on your project.
All these features are pass-through features to typst-as-lib features. typst-asset-fonts is the only default feature.
typst-packages: Enable access to Universe packages. Package fetching is blocking, doesn't work on web, and relies on you also enabling one of the following:typst-resolve-ureq: Useureqto resolve packages.typst-resolve-reqwest: Usereqwestto resolve packages.
typst-search-system-fonts: Allow access to system fonts from Typst.typst-asset-fonts: Embed the "default" fonts of typst, embedding them directly in the program's executable.
Remember to set appropriate getrandom build configuration if you try to run this on web.
Why not Velyst?
This crate sits in the niche of needing rasterized textures rather than full & interactive typst integration. Velyst is much more powerful than this crate, but also exists in a different niche.
Planned features:
- Move typst compilation & rasterization to the async compute pool completely.
- Support for loading of .tar.gz archives.
- If/when
typst-as-libsupports packages in the browser, support packages in the browser. - Optional resizing of rasterized Typst output before adding it to Bevy's asset management.
- Optionally rasterize multi-page output to a texture atlas.
- Trim down dependencies, or at least feature gate more of them.
bevy_typst_textures |
Typst | Bevy |
|---|---|---|
| 0.3.0 | 0.14 | 0.17 |
| 0.2.0 | 0.13 | 0.17 |
| 0.1.1 | 0.13 | 0.16 |
This is published under a dual MIT & Apache 2.0 licence, as is generally kosher for the bevy ecosystem.
