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

  1. 通过一致性实现简单性:知识可以轻松迁移,不同抽象层次提供多种实现方式
  2. 通过组合性实现强大功能:提供可组合的系统,而非大量独立特性
  3. 通过增量性实现高性能:所有语言特性都支持增量编译

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库从基本到高级的用法,包括:

  1. 简单文档转换
  2. 带选项的高级转换
  3. 自定义样式配置
  4. 错误处理机制
  5. 完整的文件读写工作流程

每个示例都保留了原始代码中的英文注释,并添加了必要的中文说明,以便更好地理解各个功能点的用法。

回到顶部