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遵循三个核心设计原则:

  1. 通过一致性实现简单性 - 知识可以轻松迁移
  2. 通过可组合性实现强大功能 - 少量可组合的控件
  3. 通过增量性实现高性能 - 支持增量编译

完整示例

以下是一个更完整的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);
}

代码说明

  1. 首先创建A4大小的页面框架
  2. 添加带样式的标题文本(深蓝色、加粗)
  3. 创建两栏布局结构
  4. 在左栏添加普通文本内容
  5. 在右栏添加带有样式的表格:
    • 表头使用白色文字和加粗样式
    • 数据行使用默认样式
  6. 最后创建布局对象,可用于导出或进一步处理

这个示例展示了typst-layout库的主要功能:

  • 页面和框架创建
  • 文本样式设置
  • 分栏布局
  • 表格创建和样式化
  • 元素定位

性能提示

  1. 重用样式对象以减少内存分配
  2. 对于大型文档,考虑分块处理布局
  3. 使用Layout::measure方法预先计算布局尺寸
  4. 批量添加元素而不是逐个添加

typst-layout库提供了强大的文档布局能力,适合需要精确控制文档格式的应用场景。通过组合基本布局元素和样式,可以构建复杂的文档结构。

回到顶部