Typsite 文档
Typsite 文档
1 介绍
Typsite 是一个用于构建静态网站的工具,其文章内容由纯 Typst 编写,经由 Typsite 进行处理后,最终生成一个健全的静态站点。
2 功能
- Typst 的常规表达
- 框架: 标题递增、小节模板、侧边栏、页脚
- 富文本:段落、小节、引用、代码块、数学公式、注脚、页面嵌入
- 将 Typst math 转换为 Mathml (自动检测math-font)
- 支持现代 Web 技术规范,如 HTML5、CSS3 和 JavaScript(ES6+)
- 增量编译, 实时预览
3
Typst 简介
[typst]
Typst 是一种现代化的排版系统,类似于 LaTeX,但设计更为简洁、易学,它主要用于创建学术论文、书籍、报告等需要精美排版的文档。
你可以在这里查看其官方英文文档:Typst Document
对于Typst的中文教程,我强烈推荐:Typst 蓝书 [天呐,这位编者非常清楚地知道自己是在阐述一套本体论!].
Typst
🔥已经崛起了!🔥
🚀这TeX人没收到通知吗?🚀
此节的剩余部分将会介绍 Typst & HTML -> Typsite
3.1 Typst 的 HTML 导出功能
Typst 于
0.13
0.13
增加了 HTML 导出功能,包括 html-export 模式以及两个核心函数:
html.elem
html.elem
和
html.frame
html.frame
—— 我们可以利用这些函数来基于 Typst 编写以HTML+CSS为目标内容。
3.2 Typsite:基于 Typst 的静态站点生成器
受此启发,我用 Rust 开发了名为 Typsite 的静态站点生成器.
目前,Typst 的 HTML 导出:
- 对简单富文本已有良好支持
- 复杂样式需要用户通过
html.elemhtml.elem函数手动编写 - 无法自动将所有 Typst 生态内容转换为 HTML
- 对于包含复杂 Typst 样式的内容,可以使用
html.framehtml.frame将其转为 SVG 并嵌入 HTML - 对于每一次 compile, 只支持单文件 HTML 输出
对于详细的已支持内容与计划可以追踪这个issue: HTML export #5512
虽然官方有计划支持自动 typst style -> HTML+CSS,但这并不会与 Typsite 产生任何冲突。 恰恰相反,Typst 的发展将使 Typsite 更加实用,因为 Typsite 主要职能是协调文章间的交互,并最终构建一套功能完善的静态网站。
4 安装
通过 Release 页面下载二进制文件
- 请使用 Typst 最新稳定版(当前已测试 0.15.1)
- 从源码构建需要 Rust 1.89 或更新版本
通过 Nix & Flakes 构建
- 请确保你已经开启了
experimental-features = nix-command flakesexperimental-features = nix-command flakes
- 请确保你已经开启了
git clone https://github.com/Glomzzz/typsite.git
cd typsite
nix build .
git clone https://github.com/Glomzzz/typsite.git
cd typsite
nix build .
5 初始化
通过
typsite init
typsite init
, 可以在当前文件夹初始化 Typsite.
.
├── root --- typst 根目录
│ ├── index.typ --- 文章
│ └── lib/ --- typsite 库文件,入口为 lib/lib.typ
├── .typsite --- typsite 配置目录
│ ├── assets --- 资源目录 (会同步到输出目录)
│ ├── components --- 组件模板
│ ├── themes --- 代码高亮
│ ├── syntaxes --- 代码语法
│ ├── rewrite --- 重写器模板
│ ├── schemas --- 页面模板
│ └── options.toml --- 项目配置
├── .cache --- 缓存目录
└── publish --- 输出目录
.
├── root --- typst 根目录
│ ├── index.typ --- 文章
│ └── lib/ --- typsite 库文件,入口为 lib/lib.typ
├── .typsite --- typsite 配置目录
│ ├── assets --- 资源目录 (会同步到输出目录)
│ ├── components --- 组件模板
│ ├── themes --- 代码高亮
│ ├── syntaxes --- 代码语法
│ ├── rewrite --- 重写器模板
│ ├── schemas --- 页面模板
│ └── options.toml --- 项目配置
├── .cache --- 缓存目录
└── publish --- 输出目录
7 命令行
用法: typsite <COMMAND>
命令:
init 在指定目录中初始化一个新的 typsite 项目
compile 编译或监听项目,指定输入和输出目录 [别名: c]
clean 清除缓存和输出目录
syntect 查看代码高亮&语法支持列表
help 打印此消息或指定子命令的帮助信息
选项:
-h, --help 打印帮助
-V, --version 打印版本信息
用法: typsite <COMMAND>
命令:
init 在指定目录中初始化一个新的 typsite 项目
compile 编译或监听项目,指定输入和输出目录 [别名: c]
clean 清除缓存和输出目录
syntect 查看代码高亮&语法支持列表
help 打印此消息或指定子命令的帮助信息
选项:
-h, --help 打印帮助
-V, --version 打印版本信息
7.1 init
在指定目录中初始化一个新的 typsite 项目
用法: typsite init [OPTIONS]
选项:
-d, --dir <DIR> 项目根目录 [默认: ./]
-h, --help 打印帮助
在指定目录中初始化一个新的 typsite 项目
用法: typsite init [OPTIONS]
选项:
-d, --dir <DIR> 项目根目录 [默认: ./]
-h, --help 打印帮助
7.2 compile
编译或监听项目,指定输入和输出目录
用法: typsite compile [OPTIONS]
选项:
--host <HOST> 服务主机 [默认: localhost]
--port <PORT> 服务端口, 如果非0则进入watch-mode [默认: 0]
--config <CONFIG> 项目配置路径 [默认: ./.typsite]
--cache <CACHE> 缓存目录 [默认: ./.cache]
-j, --jobs <JOBS> 并发导出的文章数 [默认: 可用 CPU/Rayon 预算]
-i, --input <INPUT> Typst 根目录,存放 typst 文件的位置 [默认: ./root] [别名: --i]
-o, --output <OUTPUT> 输出目录 [默认: ./publish] [别名: --o]
-p, --packages <PACKAGES> 本地包目录,typsite会将在此目录的包自动安装到@local,若在watch-mode则会自动同步,如果为空或未找到目录则跳过 [默认: ""] [别名: --p]
-t, --typst <TYPST> Typst 可执行程序路径 [默认: typst]
--no-pretty-url
--no-short-slug
-h, --help 打印帮助
编译或监听项目,指定输入和输出目录
用法: typsite compile [OPTIONS]
选项:
--host <HOST> 服务主机 [默认: localhost]
--port <PORT> 服务端口, 如果非0则进入watch-mode [默认: 0]
--config <CONFIG> 项目配置路径 [默认: ./.typsite]
--cache <CACHE> 缓存目录 [默认: ./.cache]
-j, --jobs <JOBS> 并发导出的文章数 [默认: 可用 CPU/Rayon 预算]
-i, --input <INPUT> Typst 根目录,存放 typst 文件的位置 [默认: ./root] [别名: --i]
-o, --output <OUTPUT> 输出目录 [默认: ./publish] [别名: --o]
-p, --packages <PACKAGES> 本地包目录,typsite会将在此目录的包自动安装到@local,若在watch-mode则会自动同步,如果为空或未找到目录则跳过 [默认: ""] [别名: --p]
-t, --typst <TYPST> Typst 可执行程序路径 [默认: typst]
--no-pretty-url
--no-short-slug
-h, --help 打印帮助
7.3 clean
清除缓存和输出目录
用法: typsite clean [OPTIONS]
选项:
--input <INPUT> 受保护的 Typst 源文件目录 [默认: ./root]
--config <CONFIG> 受保护的配置目录 [默认: ./.typsite]
--force 检查路径后允许清理没有归属标记的旧目录
-o, --output <OUTPUT> 输出目录 [默认: ./publish]
-c, --cache <CACHE> 缓存目录,用于存储原始 Typst HTML [默认: ./.cache]
-h, --help 打印帮助
清除缓存和输出目录
用法: typsite clean [OPTIONS]
选项:
--input <INPUT> 受保护的 Typst 源文件目录 [默认: ./root]
--config <CONFIG> 受保护的配置目录 [默认: ./.typsite]
--force 检查路径后允许清理没有归属标记的旧目录
-o, --output <OUTPUT> 输出目录 [默认: ./publish]
-c, --cache <CACHE> 缓存目录,用于存储原始 Typst HTML [默认: ./.cache]
-h, --help 打印帮助
7.4 syntect
查看代码高亮&语法支持列表
用法: typsite syntect [OPTIONS]
选项:
--config <CONFIG> 项目配置路径 [默认: ./.typsite]
-h, --help 打印帮助
查看代码高亮&语法支持列表
用法: typsite syntect [OPTIONS]
选项:
--config <CONFIG> 项目配置路径 [默认: ./.typsite]
-h, --help 打印帮助
7.5 并行构建
Typsite 使用 Rayon 并行计算独立文件的指纹、校验导出缓存、解析文章 HTML 和渲染页面。Typst 导出使用独立的有界 Rayon 池:默认以可用 CPU 预算(同时参考 Rayon 池大小)为并发上限。每个 Typst 子进程再通过自身的
--jobs
--jobs
分得一部分 CPU 预算,避免每个子进程都启动整台机器数量的工作线程。
typsite compile --jobs 4
# 内存受限或排查导出问题时,每次只运行一个文章子进程。
typsite compile --jobs 1
typsite compile --jobs 4
# 内存受限或排查导出问题时,每次只运行一个文章子进程。
typsite compile --jobs 1
-j
-j
是
--jobs
--jobs
的别名,参数必须是正整数。它控制的是同时导出的文章数,不是全部 Rayon 工作;文件指纹、解析和渲染的线程可另用
RAYON_NUM_THREADS
RAYON_NUM_THREADS
调整。显式设置较大的
--jobs
--jobs
可能增加内存使用,但实际并发数不会超过待导出的文章数。真正无变化的构建不会创建导出线程池。
包在导出前统一准备。各工作线程生成独立产物,全部结束后再按稳定的源文件顺序汇总。关系解析、依赖有序的元数据、缓存/归属检查点和过期删除仍保持有序。独立输出文件并行原子写入并同步数据,父目录按批次同步。已验证的无变化构建跳过配置解析,合法高亮资源按内容指纹缓存,共享依赖每批导出校验一次。只改变
--jobs
--jobs
不会使缓存失效,也不会改变站点字节。
8 RSS 订阅与站点地图
RSS 需要主动开启。 文章标记
rss
rss
默认是
false
false
,内置配置的
base_url
base_url
留空。生成订阅需要同时填写站点地址,并在集合页通过
#rss(true)
#rss(true)
选择文章。不要把全局文章默认值改为 true。
8.1 1. 开启订阅文件生成
在
.typsite/options.toml
.typsite/options.toml
中填写站点公开地址,即可生成 RSS 2.0 和站点地图:
[site]
base_url = "https://example.org"
title = "我的站点"
description = "笔记与文章"
rss_path = "/rss.xml"
sitemap_path = "/sitemap.xml"
rss_limit = 20
rss_content = "summary" # 可选 "summary" 或 "full"
[site]
base_url = "https://example.org"
title = "我的站点"
description = "笔记与文章"
rss_path = "/rss.xml"
sitemap_path = "/sitemap.xml"
rss_limit = 20
rss_content = "summary" # 可选 "summary" 或 "full"
请修改已有的
[site]
[site]
,不要重复添加。把示例地址换成自己的公开地址后,运行
typsite compile
typsite compile
。文件写入输出目录;每个生成页面的 HTML head 中都会加入 RSS 自动发现链接,读者可订阅
https://example.org/rss.xml
https://example.org/rss.xml
。
8.2 2. 通过集合页选择文章
文章元数据新增布尔选项
rss
rss
,默认是
false
false
。在集合页写上
#rss(true)
#rss(true)
,并直接嵌入要订阅的文章:
#import "/lib/lib.typ": *
#show: schema.with("page")
#title[我的订阅集合]
#rss(true)
= #embed("./first-post.typ")
= #embed("./second-post.typ")
#import "/lib/lib.typ": *
#show: schema.with("page")
#title[我的订阅集合]
#rss(true)
= #embed("./first-post.typ")
= #embed("./second-post.typ")
只有直接嵌入的文章会成为订阅条目。标记为
rss: true
rss: true
的集合页自身不进入 RSS,即使被其他集合页嵌入也不例外。标记不会被嵌入文章继承。嵌套嵌入不会自动成为独立条目,但全文模式仍会保留所选文章里的嵌入内容。引用、父级元数据和仅声明的 child 图关系不参与选择。多个集合页选出的文章合并去重,每篇只出现一次。
#rss(false)
#rss(false)
将页面恢复为普通文章;如果仍被某个已标记的集合页直接嵌入,它仍可进入 RSS。没有标记集合页或没有可选直接嵌入时,已启用的订阅文件为空。日期排序和
rss_limit
rss_limit
在选出条目之后应用。站点地图仍包含所有编译文章。
演示站点的两个首页都是集合页,各自直接嵌入文章指南和 Typst 简介,因此 RSS 共四个条目,而不是全部页面。旧站点库可从
@local/typsite:0.1.0
@local/typsite:0.1.0
导入
rss
rss
,或合并新版
root/lib/lib.typ
root/lib/lib.typ
的导入列表。
8.3 3. 在演示站点中试用
填写
base_url
base_url
后,在初始化的演示站点目录运行:
typsite compile
typsite compile --port 8080
typsite compile
typsite compile --port 8080
检查
publish/rss.xml
publish/rss.xml
,或在预览运行时打开
http://localhost:8080/rss.xml
http://localhost:8080/rss.xml
。部署输出后,用公开地址(例如
https://example.org/rss.xml
https://example.org/rss.xml
)订阅;预览地址只用于本地检查。
没有文件时,检查
base_url
base_url
、
rss_path
rss_path
、
rss_limit
rss_limit
;文件为空时,检查是否存在带有可选直接嵌入的标记集合页。保留
[default_metadata.options].rss = false
[default_metadata.options].rss = false
;
#rss(true)
#rss(true)
写在集合页,而不是准备发布的文章上。完整的升级操作见
0.1.8 RSS 迁移步骤
。
8.4 条目内容与日期
-
summarysummary输出纯文本摘要,依次取非空的descriptiondescription、summarysummary、abstractabstract元数据。没有这些元数据时,不会自动截取正文。 -
fullfull还会在content:encodedcontent:encoded中包含组合后的文章 HTML,包括嵌入文章,但不包含页面模板、导航、侧边栏或引用与反向链接页脚。普通链接和图片地址会转为绝对 URL。脚本会被移除;RSS 阅读器可能无法像网页一样显示 SVG、MathML、交互元素或站点专用 CSS。 - 标题优先使用
page-titlepage-title,其次为titletitle。排序时间依次取updatedupdated、lastmodlastmod、datedate,由新到旧;时间相同时按 URL 排序。pubDatepubDate使用发表datedate,缺失时回退到修改时间。 - 日期支持
YYYY-MM-DDYYYY-MM-DD、YYYY-MM-DD HH:MM[:SS]YYYY-MM-DD HH:MM[:SS](按 UTC)、RFC 3339 和 RFC 2822。无效或未知日期会被省略,不会写出不合法的 RSS 日期。 -
base_urlbase_url留空会关闭两种输出。rss_pathrss_path留空或rss_limit = 0rss_limit = 0只关闭 RSS;sitemap_pathsitemap_path留空只关闭站点地图。关闭或改名后,旧生成文件通过归属记录清理。 - 修改订阅配置只重新组合输出,不会让未变更文章重新经过 Typst 导出。
--no-pretty-url--no-pretty-url会反映在文章链接中。
文章可以使用现有辅助函数提供元数据:
#title[一篇文章]
#date[2026-03-02 18:25]
#metacontent("summary")[写给订阅阅读器的简短介绍。]
#metacontent("updated")[2026-03-03T09:00:00Z]
#title[一篇文章]
#date[2026-03-02 18:25]
#metacontent("summary")[写给订阅阅读器的简短介绍。]
#metacontent("updated")[2026-03-03T09:00:00Z]
9 架构 & 流程
方形图按编号蛇形阅读:第一行从左到右,第二行从右到左,第三行再从左到右。HIT 复用原始 HTML,MISS 重新调用 Typst;发布状态未变时在步骤 03 直接结束。只有需要发布更新时,才继续解析、关系解析和完整页面组合。两个独立检查点分别保存导出结果与发布状态,底部红色区域说明失败恢复。小屏可在图内横向滚动查看细节。
Rayon 并行执行独立文件指纹、文章解析、页面渲染和有界 Typst 导出;包准备与发布检查点仍保持有序。 构建缓存保存原始 Typst HTML 和实际依赖的指纹,不保存旧关系图或渲染片段。 需要更新时重新组合所有页面,但只写入内容发生变化的文件;无变化的构建不写输出,也不刷新预览。 发布按单个文件原子替换,不是整个站点的事务;失败后修复问题并重新运行即可。 升级与输出归属说明见 迁移到 Typsite 0.1.8 。
10 配置
你可以在这里看到所有的默认配置:
基于这些配置, 你可以完全地自定义你的整个站点.
- schema: 页面模板, 负责处理页面框架
- components / rewrites: 组件/重写器, 组成页面内容
- assets: 资源文件目录, 会在compile时自动同步到输出目录
- themes: 代码高亮文件
- syntaxes: 代码语法文件
11
文章
[article]
11.1 元数据
11.1.1 页面设置
11.1.2 元内容
11.1.3 文章关系
11.2 侧边栏
11.3 正文
11.3.1 标题
11.3.2 段落
11.3.3 路标
11.3.4 嵌入
11.3.5 注脚
11.3.6 链接
11.3.7 公式
11.3.8 内联
11.3.9 代码
11.3.9.1 Theme
11.3.9.2 Syntax
11.3.10 样式
11.3.10.1 对齐
11.3.10.2 高亮
11.3.10.3 彩字
11.3.10.4 加粗
11.3.10.5 斜体
11.4 页脚
11.4.1 Backlinks
11.4.2 References
Backlinks
Backlinks
迁移到 Typsite 0.1.8 [migrate-to-018]
迁移到 Typsite 0.1.8 [migrate-to-018]
Typsite 0.1.8 更换了构建引擎,修复了增量构建残留旧输出的问题,并支持 Typst 最新稳定版。已有的合法文章、模板、配置项和命令行选项继续受支持。本文说明从 0.1.7 升级时需要检查的变化。
从更早版本升级时,请先阅读 迁移到 Typsite 0.1.7 。
1 升级清单
备份文章、
root/libroot/lib和.typsite.typsite,尤其是自己修改过的模板和辅助函数。安装 Typsite 0.1.8 和 Typst 最新稳定版。本次已测试 Typst 0.15.1,不保证兼容旧版 Typst。
在另一个目录生成参考项目,不要在现有站点上直接初始化:
typsite init --dir ../typsite-018-referencetypsite init --dir ../typsite-018-reference对照参考项目的
root/libroot/lib和.typsite.typsite合并更新,保留自己的定制。执行平常使用的编译命令。旧内部缓存会自动按缓存未命中处理,通常不需要先手动清理。
typsite --version typst --version typsite compiletypsite --version typst --version typsite compile部署前同时检查生成的页面和命令退出状态。构建失败现在会返回非零退出码。
2 站点库与 Typst
2.1 更新 inline-math
请合并参考项目中的
root/lib/site.typ
root/lib/site.typ
。
inline-math
inline-math
现在在上下文中求值,查询脚注标签并传给 SVG 渲染器,支持行内和块级公式回退:
#inline-math($a/b$)
#inline-math($sum_(i=1)^n i$, block: true)
#inline-math($a/b$)
#inline-math($sum_(i=1)^n i$, block: true)
已有调用不需要修改函数签名。Typsite 会自动向 Typst 传入 HTML 功能标志和
html-frames
html-frames
输入参数。
2.2 不要修改内置包的版本号
Typsite 可执行程序的版本是 0.1.8,内置 Typst 包继续使用原来的标识:
#import "@local/typsite:0.1.0": *
#import "@local/typsite:0.1.0": *
不要把导入改为
@local/typsite:0.1.8
@local/typsite:0.1.8
。需要导出时,可执行程序会先安装随附的包。
2.3 编译内置演示站点
初始化的演示站点包含本文、模板、字体和 SVG 示例,构建时不需要下载 preview 包。在参考项目目录中运行:
typsite compile
typsite compile --port 8080
typsite compile
typsite compile --port 8080
第二条命令启动预览,可访问
http://localhost:8080/
http://localhost:8080/
或
/en/
/en/
。内容示例中的外部音乐播放器和网页字体仍需要浏览器联网,但不是构建依赖。
3 缓存与输出归属
新缓存保存 Typst 原始 HTML,以及 Typst 实际读取文件的指纹。导入或引用的文件变化时,会重新导出相应文章。旧缓存中的关系图和渲染片段不再恢复。
需要更新输出时,Typsite 会重新建立当前关系图,并重新组合所有页面,但只写入字节发生变化的文件。删除引用后,对应的旧反向链接会消失;删除或重命名文章后,旧的受管理输出也会移除。
输出目录中新增独立的归属记录:
publish/.typsite-outputs.json
publish/.typsite-outputs.json
请保留这个文件。 它不是可随意丢弃的缓存。Typsite 据此删除过期生成文件,同时保留无关文件。如果记录损坏,构建会拒绝猜测哪些文件可以删除;修复前请先备份。手动删除它,意味着放弃对之前输出文件的归属记录。
升级前生成、尚未被记录的文件不会被自动接管或删除。如果已经删除的旧页面仍留在输出目录中,请手动移除已确认过期的文件,或检查输出目录内容后显式执行清理。
3.1 更安全的 clean
typsite clean
typsite clean
会在删除前检查两个目标目录、取得构建锁,并拒绝清理与源文件或配置重叠的路径。没有归属标记的非空旧目录,需要明确允许:
# 先检查这两个目录;clean 会清空它们的内容。
typsite clean --cache ./.cache --output ./publish --force
# 先检查这两个目录;clean 会清空它们的内容。
typsite clean --cache ./.cache --output ./publish --force
源文件或配置目录不是默认位置时,也要传入,以便保护这些目录:
typsite clean --input ./content --config ./config \
--cache ./build-cache --output ./public --force
typsite clean --input ./content --config ./config \
--cache ./build-cache --output ./public --force
--force
--force
只允许清理没有标记的旧目录,不会绕过路径安全检查或正在使用的构建锁。清理后可能保留锁文件;构建或预览运行时,不要删除
.typsite.lock
.typsite.lock
。
4 更严格的校验
过去被忽略的错误,现在可能导致构建失败。请修复或移除无效资源,不要再依赖静默跳过:
- 页面模板、组件和重写器 HTML 必须包含完整的
<head>...</head><head>...</head>与<body>...</body><body>...</body>。有意留空时,可使用<head/><head/>或<body/><body/>。 - 损坏的主题、语法定义、语法元数据和重写器,即使没有用到,也会报错;重复的资源标识会被拒绝。
- 页面不能显式把自己设为父页面,也不能嵌入自己。父级继承、嵌入或元数据依赖形成循环时会报错,不再挂起;普通的相互引用和自引用仍然合法。
- 源文件、配置、缓存和输出目录不能相互重叠;本地包源也不能与缓存或输出目录重叠。输出冲突、仅大小写不同的路径冲突、越界路径和受管理输出中的符号链接会被拒绝。目录名中的空格和方括号按字面处理。
-
.typsite.lock.typsite.lock与.typsite-outputs.json.typsite-outputs.json是保留的输出名称,包括大小写变体,以及这些名称之下的路径。
5 包目录与可复现构建
--packages
--packages
仍指向本地包的源文件目录,不是 Typst 包命名空间。安装前会拒绝无效的包名、版本和重复标识。
需要隔离时,可设置
TYPST_PACKAGE_PATH
TYPST_PACKAGE_PATH
,包会安装到它下面的
local/<name>/<version>
local/<name>/<version>
。Typsite 同时支持
TYPST_PACKAGE_CACHE_PATH
TYPST_PACKAGE_CACHE_PATH
。例如在 POSIX shell 中:
export TYPST_PACKAGE_PATH="$PWD/.typst-packages"
export TYPST_PACKAGE_CACHE_PATH="$PWD/.typst-package-cache"
typsite compile
export TYPST_PACKAGE_PATH="$PWD/.typst-packages"
export TYPST_PACKAGE_CACHE_PATH="$PWD/.typst-package-cache"
typsite compile
这些目录应与源文件、配置、构建缓存和输出目录分开。没有指定路径时,仍保留默认的共享包安装行为。需要可复现导出时,请使用项目字体和固定的
SOURCE_DATE_EPOCH
SOURCE_DATE_EPOCH
;系统字体或未声明的外部输入发生变化后,可能需要丢弃构建缓存。
6 并行构建与 –jobs
独立文件指纹、文章解析和页面渲染现在使用 Rayon。Typst 并发导出默认以可用 CPU/Rayon 预算为上限(不再固定限制为四篇),每个子进程再分得部分 CPU 工作线程。内存受限时,可用
typsite compile --jobs 1
typsite compile --jobs 1
串行导出文章;也可用
--jobs 4
--jobs 4
明确限制并发数(别名
-j
-j
,参数必须是正整数)。
--jobs
--jobs
不控制全部 Rayon 工作;文件指纹、解析与渲染可通过
RAYON_NUM_THREADS
RAYON_NUM_THREADS
调整。包在工作线程启动前统一准备,结果按稳定的源文件顺序汇总,全部线程结束后才记录检查点或发布。关系与元数据顺序、过期删除和发布归属仍受保护。独立输出并行原子替换并同步数据。可丢弃的缓存现在使用带校验和、共享依赖集的二进制清单和按内容指纹索引的高亮资源缓存,旧格式会自动重建。已验证的无变化构建仍检查输入、导出产物和输出的内容哈希,但不再重解析所有配置。已安装本地包在导出前计算指纹,避免不必要的验证导出;新发现的外部输入仍需验证。只改变并发数无需清缓存,生成的输出字节相同。
7 RSS 订阅配置
RSS 2.0 支持摘要或全文。配置分为两个步骤:先在站点配置中开启文件生成,再通过集合页选择文章。文章元数据
rss
rss
默认是 false;只填写站点地址不会自动选出任何条目。
7.1 第一步:配置站点
修改
.typsite/options.toml
.typsite/options.toml
已有的
[site]
[site]
,不要重复添加同名配置段。把示例地址换成站点部署后的公开地址:
[site]
base_url = "https://example.org"
title = "我的站点"
description = "笔记与文章"
rss_path = "/rss.xml"
rss_limit = 20
rss_content = "summary" # 可选 "summary" 或 "full"
sitemap_path = "/sitemap.xml"
[site]
base_url = "https://example.org"
title = "我的站点"
description = "笔记与文章"
rss_path = "/rss.xml"
rss_limit = 20
rss_content = "summary" # 可选 "summary" 或 "full"
sitemap_path = "/sitemap.xml"
保留
[default_metadata.options]
[default_metadata.options]
下的
rss = false
rss = false
,也可以省略。这是每篇文章的默认值,不是
[site]
[site]
下的开关。请在具体集合页中显式开启,不要把所有文章的默认值都改为 true。
7.2 第二步:标记集合页并嵌入条目
合并新版
root/lib/lib.typ
root/lib/lib.typ
的
rss
rss
导入,或像下面一样直接从内置包导入。例如创建
root/feed.typ
root/feed.typ
,嵌入演示站点中已有的两篇文章:
#import "/lib/lib.typ": *
#import "@local/typsite:0.1.0": rss
#show: schema.with("page")
#title[订阅集合]
#rss(true)
= #embed("./typst.typ")
= #embed("./article.typ")
#import "/lib/lib.typ": *
#import "@local/typsite:0.1.0": rss
#show: schema.with("page")
#title[订阅集合]
#rss(true)
= #embed("./typst.typ")
= #embed("./article.typ")
这会选出
typst.typ
typst.typ
和
article.typ
article.typ
,不包含
feed.typ
feed.typ
。自己的站点应替换为实际文章路径。只选择直接嵌入;嵌套嵌入、引用、父级关系和仅声明的 child 图关系不添加条目。多个集合的选择合并去重。标记页自身始终排除,即使被另一个集合嵌入也不例外;标记不会被子文章继承。
#rss(false)
#rss(false)
只取消集合标记,不会排除被其他集合选中的文章。
7.3 第三步:构建与订阅
typsite compile
typsite compile --port 8080
typsite compile
typsite compile --port 8080
第一条命令生成
publish/rss.xml
publish/rss.xml
,使用自定义输出目录或路径时则写到相应位置。第二条命令可通过
http://localhost:8080/rss.xml
http://localhost:8080/rss.xml
本地检查。读者应订阅部署后的公开地址,例如
https://example.org/rss.xml
https://example.org/rss.xml
,而不是 localhost 预览地址。每个生成页面的 HTML head 中也会加入 RSS 自动发现链接。
演示站点的两个首页已有
#rss(true)
#rss(true)
。填写
base_url
base_url
后,它们直接嵌入的文章会组成四个条目:中英文文章指南和 Typst 简介。再加入上面的
feed.typ
feed.typ
只会重复选中已有文章,不会生成重复条目。首页、迁移指南和内容示例不会自动进入 RSS;站点地图仍包含所有编译文章。
7.4 内容模式与常见配置问题
-
rss_content = "summary"rss_content = "summary"是默认模式:依次取非空的descriptiondescription、summarysummary、abstractabstract元数据。可在所选文章里写#metacontent("summary")[简短介绍。]#metacontent("summary")[简短介绍。];缺少摘要不会排除文章。 -
rss_content = "full"rss_content = "full"还会输出组合后的文章 HTML,不含页面导航、侧边栏或引用与反向链接页脚。嵌入内容仍保留在所选文章内部。不同阅读器对 SVG、MathML 和站点专用 CSS 的支持不同。 - 没有生成
rss.xmlrss.xml:检查base_urlbase_url、rss_pathrss_path是否非空,以及rss_limitrss_limit是否大于零。默认路径和上限仍是/rss.xml/rss.xml、20。非空但无效的站点 URL 会导致校验失败。 - 文件有了但没有条目:检查集合页是否写了
#rss(true)#rss(true),以及是否有实际的直接#embed(...)#embed(...)。只填写[site].base_url[site].base_url不够;rss = falserss = false也不是条目排除开关。 - RSS 日期使用 RFC 2822,不使用 ISO 时间戳。纯日期和
YYYY-MM-DD HH:MM[:SS]YYYY-MM-DD HH:MM[:SS]按 UTC 处理;RFC 3339/RFC 2822 的偏移会转换为 UTC。无效日期省略,标题和摘要提取为文本,不会直接显示 HTML 标签。
更多选项与文章元数据示例见 首页的 RSS 章节 。
8 预览与失败恢复
仍通过非零的
--port
--port
启动预览。所有已连接客户端会观察到同一构建版本;真正没有变化的轮询不会刷新浏览器。导出、解析或渲染失败时保留上次成功发布的页面,修复成功后触发刷新。按 Ctrl-C 会等待正在执行的构建结束,再退出。
即使后续发布失败,已经成功导出的结果也能复用。修复报错后,重新运行相同命令即可。发布只保证单个文件的原子替换,不是整个站点的事务:发布中途失败可能留下完整的新旧文件混合状态,普通重试会修复。如果部署要求站点整体切换,请另设部署步骤。