#typst #template #source-file #templating #engine #resolver

typst-as-lib

typst的小型封装,使其更容易作为模板引擎使用

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 模板引擎

Download history 927/week @ 2024-07-11 663/week @ 2024-07-18 199/week @ 2024-07-25 16/week @ 2024-08-01

1,805 每月下载量

MIT 协议

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 添加。TypstTemplateTypstTemplateCollection 的包装,同时还保存了主源文件的 FileId

加载字体

加载字体(目前)不在本库的范围内。如果您对此感兴趣,请提交一个 issue。

  • 是 typst-cli 加载系统字体的方式。
  • 这是一个从文件夹加载字体的 示例

待办事项

  • 允许使用 reqwest 而不是 ureq,通过功能标志
  • 字体
  • 为 PackageResolver 提供在硬盘上缓存包的选项

依赖项

~62MB
~900K SLoC