12个版本 (7个破坏性版本)
0.8.0 | 2024年7月22日 |
---|---|
0.7.2 | 2024年7月22日 |
0.6.1 | 2024年7月20日 |
0.5.1 | 2024年7月17日 |
0.1.4 | 2024年7月13日 |
33 in 模板引擎
1,805 每月下载量
38KB
760 行
Typst as lib
围绕Typst的小型封装,使其更容易作为模板引擎使用。虽然我尽量在尽可能少更改API的情况下实现功能,但此API目前并不完全稳定。
使用方法
Rust代码
// main.rs
static TEMPLATE_FILE: &str = include_str!("./templates/template.typ");
static FONT: &[u8] = include_bytes!("./fonts/texgyrecursor-regular.otf");
static OUTPUT: &str = "./examples/output.pdf";
static IMAGE: &[u8] = include_bytes!("./templates/images/typst.png");
fn main() {
let font = Font::new(Bytes::from(FONT), 0).expect("Could not parse font!");
// Read in fonts and the main source file.
// We can use this template more than once, if needed (Possibly
// with different input each time).
let template = TypstTemplate::new(vec![font], TEMPLATE_FILE);
let mut tracer = Tracer::new();
// Run it
// Run `template.compile(&mut tracer)` to run typst script
// without any input.
let doc = template
.compile_with_input(&mut tracer, dummy_data())
.expect("typst::compile() returned an error!");
// Create pdf
let pdf = typst_pdf::pdf(&doc, Smart::Auto, None);
fs::write(OUTPUT, pdf).expect("Could not write pdf.");
}
Typst代码
// template.typ
#import sys: inputs
#set page(paper: "a4")
#set text(font: "TeX Gyre Cursor", 11pt)
#let content = inputs.v
#let last_index = content.len() - 1
#for (i, elem) in content.enumerate() [
== #elem.heading
Text: #elem.text \
Num1: #elem.num1 \
Num2: #elem.num2 \
#if elem.image != none [#image.decode(elem.image, height: 40pt)]
#if i < last_index [
#pagebreak()
]
]
运行示例
cargo r --example=small_example
解析文件
二进制文件
使用TypstTemplate::with_static_file_resolver
并将二进制文件作为键值对添加((file_name, &[u8])
)。
源代码
使用TypstTemplate::with_static_source_file_resolver
并将源代码作为键值对添加((file_name, String)
)。
本地文件
使用TypstTemplate::with_file_system_resolver
可以启用解析本地文件。根目录应该是模板文件夹。如果文件不在根目录之外,则无法解析文件。
远程包
使用TypstTemplate::with_package_file_resolver
可以启用解析包。需要启用package
功能。
示例
静态二进制文件和源代码
请参阅示例,它使用静态文件解析器。
cargo r --example=resolve_static
本地文件和远程包
请参阅示例,它使用文件和包解析器。
cargo r --example=resolve_files --features=package
自定义文件解析器
您还可以编写自己的文件解析器。您需要实现 FileResolver
特性,并将其传递给 TypstTemplate::add_file_resolver
函数。
TypstTemplateCollection
如果您想编译多个 typst(主要)源文件,您可能想使用 TypstTemplateCollection
,这允许您在调用 TypstTemplateCollection::compile
时指定源文件,而不是将其传递给 new。源文件必须首先使用 TypstTemplateCollection::add_static_file_resolver
添加。TypstTemplate
是 TypstTemplateCollection
的包装,同时还保存了主源文件的 FileId
。
加载字体
加载字体(目前)不在本库的范围内。如果您对此感兴趣,请提交一个 issue。
待办事项
- 允许使用 reqwest 而不是 ureq,通过功能标志
- 字体
- 为 PackageResolver 提供在硬盘上缓存包的选项
一些链接,不清楚
依赖项
~62MB
~900K SLoC