Rust排版引擎库typst-layout的使用,typst-layout提供高效文档布局与格式化功能
Rust排版引擎库typst-layout的使用
Typst是一种基于标记的新型排版系统,旨在与LaTeX一样强大,同时更易于学习和使用。Typst-layout是其布局引擎库,提供高效的文档布局与格式化功能。
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-layout
在Rust项目中使用typst-layout,可以通过Cargo添加依赖:
[dependencies]
typst-layout = "0.13.1"
或者直接在项目目录运行:
cargo add typst-layout
设计原则
Typst-layout遵循三个核心设计原则:
- 通过一致性实现简单性 - 知识可以轻松迁移
- 通过可组合性实现强大功能 - 少量可组合的控件
- 通过增量性实现高性能 - 支持增量编译
完整示例
以下是一个更完整的typst-layout使用示例,展示如何设置文档样式和布局:
// 使用typst-layout创建PDF文档的示例
use typst_layout::{
document::{Document, PageConfig},
model::DocumentModel,
export::pdf::PdfExporter,
};
fn main() {
// 创建文档模型
let mut model = DocumentModel::new();
// 添加页面配置
model.add_page_config(PageConfig {
width: 210.0, // A4宽度(mm)
height: 297.0, // A4高度(mm)
margin: 20.0, // 边距
});
// 添加内容
model.add_paragraph("Hello, Typst Layout!")
.with_style("heading", "1");
model.add_paragraph("This is a paragraph demonstrating typst-layout capabilities.")
.with_style("body", "");
// 创建数学公式
model.add_math("F_n = F_{n-1} + F_{n-2}");
// 构建文档
let doc = Document::from_model(model);
// 导出PDF
let exporter = PdfExporter::new();
exporter.export(&doc, "output.pdf").unwrap();
}
Typst-layout提供了强大的文档布局和格式化功能,特别适合需要精确控制文档排版的应用程序。
1 回复
Rust排版引擎库typst-layout使用指南
介绍
typst-layout是一个高效的Rust文档布局与格式化库,提供了强大的排版功能,帮助开发者实现专业文档布局。该库是Typst排版系统的一部分,专注于处理文档元素的精确布局和格式化。
主要特性
- 基于约束的布局系统
- 支持文本、图像、表格等多种元素
- 高效的布局算法
- 灵活的样式配置
- 支持分页和页面布局
安装
在Cargo.toml中添加依赖:
[dependencies]
typst-layout = "0.7"
完整示例代码
下面是一个结合基本布局、文本样式和表格的完整示例:
use typst_layout::{Layout, Size, Frame, Rect, Abs};
use typst_layout::text::{TextRun, TextItem, TextStyle};
use typst_layout::geom::{Color, RgbaColor};
use typst_layout::table::{Table, TableCell, TableRow};
fn main() {
// 1. 创建A4大小的页面框架
let page_size = Size::new(Abs::mm(210.0), Abs::mm(297.0));
let mut frame = Frame::new(page_size);
// 2. 添加标题文本(带样式)
let title_style = TextStyle {
size: Abs::pt(18.0),
color: Color::Rgba(RgbaColor::new(0, 0, 128, 255)), // 深蓝色
weight: typst_layout::text::FontWeight::BOLD,
..Default::default()
};
let title = TextItem::new("公司年度报告".into(), title_style);
let title_run = TextRun::new(
vec![title],
Abs::mm(20.0), // x位置
Abs::mm(15.0), // y位置
);
frame.push_text(title_run);
// 3. 创建两栏布局
let column_width = Abs::mm(85.0);
let content_height = Abs::mm(220.0);
// 左栏
let left_column = Rect::new(
Abs::mm(15.0),
Abs::mm(30.0),
column_width,
content_height
);
frame.push(left_column, vec![]);
// 右栏
let right_column = Rect::new(
Abs::mm(110.0),
Abs::mm(30.0),
column_width,
content_height
);
frame.push(right_column, vec![]);
// 4. 在左栏添加内容
let normal_style = TextStyle {
size: Abs::pt(12.0),
color: Color::Rgba(RgbaColor::new(0, 0, 0, 255)), // 黑色
..Default::default()
};
let content = TextItem::new("这是左栏的内容示例...".into(), normal_style);
let content_run = TextRun::new(
vec![content],
Abs::mm(20.0), // x位置
Abs::mm(35.0), // y位置
);
frame.push_text(content_run);
// 5. 在右栏添加表格
let mut table = Table::new();
// 表头
let header_style = TextStyle {
size: Abs::pt(12.0),
color: Color::Rgba(RgbaColor::new(255, 255, 255, 255)), // 白色
weight: typst_layout::text::FontWeight::BOLD,
..Default::default()
};
let header = TableRow::new(vec![
TableCell::new_with_style("部门".into(), header_style.clone()),
TableCell::new_with_style("预算".into(), header_style.clone()),
TableCell::new_with_style("实际".into(), header_style),
]);
// 数据行
let data_style = TextStyle {
size: Abs::pt(11.0),
..Default::default()
};
let row1 = TableRow::new(vec![
TableCell::new_with_style("研发".into(), data_style.clone()),
TableCell::new_with_style("$120,000".into(), data_style.clone()),
TableCell::new_with_style("$115,000".into(), data_style.clone()),
]);
let row2 = TableRow::new(vec![
TableCell::new_with_style("市场".into(), data_style.clone()),
TableCell::new_with_style("$80,000".into(), data_style.clone()),
TableCell::new_with_style("$85,000".into(), data_style.clone()),
]);
table.push_row(header);
table.push_row(row1);
table.push_row(row2);
// 将表格定位到右栏
let table_pos = (Abs::mm(115.0), Abs::mm(35.0));
frame.push_table(table, table_pos);
// 6. 创建最终布局
let layout = Layout::new(frame);
println!("复杂文档布局创建完成");
// 可以导出布局或进一步处理
// export_to_pdf(&layout);
}
代码说明
- 首先创建A4大小的页面框架
- 添加带样式的标题文本(深蓝色、加粗)
- 创建两栏布局结构
- 在左栏添加普通文本内容
- 在右栏添加带有样式的表格:
- 表头使用白色文字和加粗样式
- 数据行使用默认样式
- 最后创建布局对象,可用于导出或进一步处理
这个示例展示了typst-layout库的主要功能:
- 页面和框架创建
- 文本样式设置
- 分栏布局
- 表格创建和样式化
- 元素定位
性能提示
- 重用样式对象以减少内存分配
- 对于大型文档,考虑分块处理布局
- 使用
Layout::measure
方法预先计算布局尺寸 - 批量添加元素而不是逐个添加
typst-layout库提供了强大的文档布局能力,适合需要精确控制文档格式的应用场景。通过组合基本布局元素和样式,可以构建复杂的文档结构。