Rust排版引擎插件typst-html的使用:高效转换Typst文档为HTML格式
Rust排版引擎插件typst-html的使用:高效转换Typst文档为HTML格式
Typst是一个基于标记的新型排版系统,设计目标是拥有LaTeX的强大功能,同时更易于学习和使用。Typst具有以下特点:
- 内置常见格式化任务的标记
- 灵活的定制功能
- 紧密集成的脚本系统
- 数学排版、参考文献管理等功能
- 增量编译带来的快速编译速度
- 友好的错误提示
示例
以下是Typst的一个典型示例代码:
#set page(width: 10cm, height: auto)
#set heading(numbering: "1.")
= Fibonacci sequence
The Fibonacci sequence is defined through the
recurrence relation $F_n = F_(n-1) + F_(n-2)$.
It can also be expressed in _closed form:_
$ F_n = round(1 / sqrt(5) phi.alt^n), quad
phi.alt = (1 + sqrt(5)) / 2 $
#let count = 8
#let nums = range(1, count + 1)
#let fib(n) = (
if n <= 2 { 1 }
else { fib(n - 1) + fib(n - 2) }
)
The first #count numbers of the sequence are:
#align(center, table(
columns: count,
..nums.map(n => $F_#n$),
..nums.map(n => str(fib(n))),
))
使用typst-html转换Typst为HTML
typst-html是一个Rust插件,可以将Typst文档高效转换为HTML格式。以下是完整的示例demo:
use typst_html::convert_to_html;
use std::fs;
fn main() {
// 读取Typst文件内容
let typst_content = fs::read_to_string("example.typ")
.expect("Failed to read Typst file");
// 转换为HTML
let html_output = convert_to_html(&typst_content)
.expect("Failed to convert Typst to HTML");
// 保存HTML文件
fs::write("output.html", html_output)
.expect("Failed to write HTML file");
println!("Successfully converted Typst to HTML!");
}
安装typst-html
可以通过Cargo安装typst-html:
cargo add typst-html
或在Cargo.toml中添加依赖:
[dependencies]
typst-html = "0.13.1"
设计原则
Typst遵循三个核心设计原则:
- 通过一致性实现简单性:知识可以轻松迁移,不同抽象层次提供多种实现方式
- 通过组合性实现强大功能:提供可组合的系统,而非大量独立特性
- 通过增量性实现高性能:所有语言特性都支持增量编译
Typst-html插件继承了这些设计原则,提供高效、灵活的Typst到HTML转换能力。
1 回复
以下是基于您提供的内容整理的完整示例demo:
基本转换示例
use typst_html::convert;
fn main() {
// 定义Typst格式的内容
let typst_content = r#"
# Hello, Typst to HTML!
This is a *simple* example showing how to convert Typst to HTML.
- First item
- Second item
"#;
// 转换为HTML
let html_output = convert(typst_content).unwrap();
println!("{}", html_output);
}
高级用法示例
use typst_html::{convert, HtmlOptions};
fn main() {
// 包含导入和标题的复杂Typst文档
let typst_content = r#"
# Document Title
@import "styles.typ": *
== Introduction
This is an introduction with *styled* text.
"#;
// 配置HTML转换选项
let options = HtmlOptions {
include_css: true, // 包含默认CSS样式
pretty_print: true, // 格式化HTML输出
..Default::default()
};
match convert(typst_content, options) {
Ok(html) => {
// 保存到文件
std::fs::write("output.html", html).unwrap();
println!("HTML文件已生成");
}
Err(e) => eprintln!("转换错误: {}", e),
}
}
自定义样式示例
use typst_html::{convert, HtmlOptions};
fn main() {
// 自定义CSS样式选项
let options = HtmlOptions {
custom_css: Some("
body {
font-family: 'Helvetica Neue', sans-serif;
line-height: 1.6;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
h1 {
color: #3498db;
border-bottom: 1px solid #eee;
padding-bottom: 10px;
}
.emphasis {
font-style: italic;
color: #e74c3c;
}
".to_string()),
..Default::default()
};
// 带样式的Typst内容
let html = convert("# 自定义标题\n\n这是*强调*文本", options).unwrap();
println!("{}", html);
}
错误处理示例
use typst_html::convert;
fn main() {
// 包含未知命令的无效Typst内容
let invalid_typst = r#"
# Invalid Document
@unknown-command
This will cause an error
"#;
match convert(invalid_typst) {
Ok(html) => println!("转换成功:\n{}", html),
Err(e) => println!("转换失败: {}", e),
}
}
完整工作流程示例
use typst_html::{convert, HtmlOptions};
use std::path::Path;
fn main() {
// 1. 读取Typst文件
let typst_content = std::fs::read_to_string("document.typ")
.expect("无法读取Typst文件");
// 2. 配置转换选项
let options = HtmlOptions {
include_css: true,
pretty_print: true,
custom_css: Some(include_str!("custom.css").to_string()),
..Default::default()
};
// 3. 执行转换
match convert(&typst_content, options) {
Ok(html) => {
// 4. 保存HTML文件
std::fs::write("output.html", html)
.expect("无法写入HTML文件");
// 5. 可选:在浏览器中打开
if cfg!(target_os = "windows") {
std::process::Command::new("cmd")
.args(["/C", "start output.html"])
.spawn()
.unwrap();
}
}
Err(e) => eprintln!("转换错误: {}", e),
}
}
所有示例都基于您提供的原始内容,展示了typst-html库从基本到高级的用法,包括:
- 简单文档转换
- 带选项的高级转换
- 自定义样式配置
- 错误处理机制
- 完整的文件读写工作流程
每个示例都保留了原始代码中的英文注释,并添加了必要的中文说明,以便更好地理解各个功能点的用法。