Universe

Create project in app

Elegant multilingual books with framed theorems, algorithms and annotated code. Inspired by the visual language of LaTeX ElegantBook; independently implemented in Typst.

Source repository: xiong-ZH-zq/neat-book.

面向中文教材、数学讲义和技术书籍的 Typst 模板。默认使用开放字体,支持中、英、日、韩文, 集成 Theorion 定理环境、按章编号、三级目录、Chicago author-date 参考文献和后置附录。

Neat Book cover

在本仓库使用

需要 Typst 0.15.0+、Python 3.11+。测试另需 Poppler 的 pdftotext。 安装下面列出的字体后,在项目根目录运行:

make build       # build/neat-book.pdf,完整示例书
make preview     # 监听书稿并自动重新编译
make test        # 编译与语义回归检查
make thumbnail   # 重新生成 Universe 封面缩略图
make package     # 检查、生成缩略图、打包到 dist/

scripts/build.py 把本项目放入 build/packages/preview/neat-book/0.1.0/, 借助 --package-path build/packages 测试真实的包导入。首次构建时 Typst 会下载已固定版本的依赖。 依赖命中本机缓存后可以离线编译。此过程无需把本项目安装到用户的全局包目录。

书稿入口为 template/main.typ;正文和附录在 template/chapters/; 自定义标志在 template/assets/;文献库是 template/references.bib。 无须 Python 的本地最小示例可以直接运行:

typst compile --root . examples/minimal.typ build/minimal.pdf

先确保 build/ 存在。模板排版代码位于 src/,公共入口为 lib.typ。

新建书稿

本项目尚未发布到 Universe。发布后可以使用:

typst init @preview/neat-book:0.1.0 my-book
typst compile my-book/main.typ my-book.pdf

在本地测试相同的初始化流程:

make build
typst init --package-path build/packages @preview/neat-book:0.1.0 build/my-book
typst compile --root build/my-book --package-path build/packages build/my-book/main.typ build/my-book.pdf

一份书稿的导言区可以写成:

#import "@preview/neat-book:0.1.0": *
#show: neat-book.with(
  title: "我的数学书",
  subtitle: "概念、证明与计算",
  author: ("张三", "李四"),
  institution: "开放知识研究所",
  date: datetime(year: 2026, month: 10, day: 20),
  logo: image("assets/logo.svg", width: 22mm),
  references: bibliography("references.bib", title: [参考文献]),
  appendix: include "chapters/appendix.typ",
)

= 第一章
#introduction[
  - 本章的第一个目标。
  - 本章的第二个目标。
]

== 第一节
=== 第一个小节

#theorem(title: "交换律")[对实数 $a,b$,有 $a+b=b+a$。] <commutative>
#proof[由实数加法的定义可得。]
参见 @commutative。

logo 接受 content,请在书稿中调用 image(...),不要仅传路径字符串。 这样路径相对于书稿解析,也可以传入多个图形组成的标志。references 和 appendix 同样接受 content, 书稿自己的图片、文献和 include 路径不受包隔离影响。 封面依次为标题、副标题、作者、机构、日期、logo;省略可选项时不输出占位内容。

字体与语言

参数 fonts 的键 默认字体 用途
english Libertinus Serif 西文正文,原生粗体、斜体与粗斜体
chinese Noto Serif CJK SC 简体中文正文
japanese Noto Serif CJK JP 日文正文与日文汉字字形
korean Noto Serif CJK KR 韩文正文
mono DejaVu Sans Mono 代码、行内等宽文本
sans Noto Sans CJK SC 章节标题与封面标题
math New Computer Modern Math 数学公式

上述字体均为开放字体。Typst CLI 自带 Libertinus Serif、DejaVu Sans Mono 和 New Computer Modern Math; CJK 字体请从 Noto CJK 官方项目 安装或上传到网页项目。 Ubuntu/Debian 可安装 fonts-noto-cjk;运行本仓库全部测试另需 fonts-noto-core。 2026-10-20 已直接核对 Typst 官方网页字体索引:上述 7 个默认字体家族均在线可用, 含所需常规、粗体,以及西文/等宽字体的斜体和粗斜体。默认配置在网页端无需另传字体。 核对范围与可复查证据见 发布检查记录。 字体文件不随包分发。可用 typst fonts 检查实际字体名称,或 typst compile --font-path ./fonts ... 指定字体目录。自定义字体仍应确认网页环境中可用。

只覆盖需要更换的项,其余保留默认值。每项可使用字体名或字体名数组:

#show: neat-book.with(
  fonts: (
    chinese: ("Source Han Serif SC", "Noto Serif CJK SC"),
    english: "Noto Serif",
    japanese: "Noto Serif CJK JP",
    mono: "Noto Sans Mono",
    sans: "Noto Sans CJK SC",
  ),
)

正文可直接混排中文与西文。对于汉字共享但地区字形不同的文本,用显式语言片段选择字形:

#zh[中文 *粗体*、_斜体_、*_粗斜体_*。]
#en[English *bold*, _italic_, *_bold italic_*.]
#ja[日本語の漢字・*太字*・_斜体_。]
#ko[한국어와 *굵은 글꼴*。]

多数 CJK 字体不提供原生 italic,Typst 不会自动为这些字体合成斜体。 本模板默认对斜体中的 CJK 字符逐字应用 12° 倾斜,保留粗体字重与逐字换行,西文使用原生 italic。 用 cjk-oblique: 15deg 可调整倾斜角度;若选择了带原生斜体的 CJK 字体,设置 cjk-oblique: none 关闭合成。 全书日文可设置 lang: "ja", 同时将 fonts.sans 改成 "Noto Sans CJK JP";全书韩文同理。

定理、证明与解答

基于 Theorion 0.6.0,使用其 Fancy 样式和原生引用机制。 以下所有编号环境均支持 title: 可选参数,省略即为无标题环境:

#theorem(title: "定理名")[内容。] <thm-name>
#theorem[无名定理内容。]
#definition(title: "定义名")[内容。]
#example[例题。]
#lemma[引理。]
#proposition[命题。]
#corollary[推论。]
#axiom[公理。]
#postulate[公设。]
#assumption[假设。]
#property[性质。]
#conjecture[猜想。]
#remark[注解。]
#note[注意。]
#exercise[练习。]
#problem[问题。]

#proof[证明正文。]
#solution[解答正文。]
#conclusion[结论正文。]

proof 与 solution 无需标题参数、不编号,且均以空心方框 □ 结束。 证明末尾为公式或列表时仍支持 Theorion 的 QED 定位;可在需要的位置放置 #qedhere。 常规编号环境共享章内计数器;推论沿用 Theorion 的下级编号,如定理 1.3 后的推论 1.3.1。 章切换时自动重新计数。附录使用 A.1 等编号。

短定理框默认不跨页,避免标题与正文分离;长定理可使用:

#theorem(title: "很长的定理", breakable: true)[很长的正文……]

编号环境同时保留 Theorion 的 number、numbering、supplement、full-title、outlined 等参数。 无编号定理可用 #theorem(numbering: none)[内容]。 轻量提示框 note-block、tip-block、important-block、warning-block、caution-block、 remark-block、quote-block、emph-block 也可直接导入。 高级功能可通过导出的 theorion 模块访问,例如定理重述:

#theorion.theorion-restate(filter: <thm-name>)

算法环境

基于 MIT 许可的 algorithmic 1.0.7, 提供类似 algorithm2e 的三线标题、输入输出、行号、嵌套控制流与缩进竖线。 这是 Typst 原生 API,伪代码语法遵循 algorithmic,不解析 LaTeX 宏。

#algorithm(
  title: "欧几里得算法",
  input: [非负整数 $a,b$],
  output: [$gcd(a,b)$],
  {
    import algorithmic: *
    While($b != 0$, {
      Assign[$r$][$a mod b$]
      Assign[$a$][$b$]
      Assign[$b$][$r$]
    })
    Return[$a$]
  },
) <alg-gcd>
参见 @alg-gcd。

支持 If、IfElseChain、For、While、Procedure、Return、Comment、Line 等原始构造。 line-numbers: false 关闭行号。算法可以跨页,按章编号,也可生成算法目录:

#outline(target: figure.where(kind: "algorithm"), title: [算法目录])

代码框

普通三反引号代码块自动使用 Codly 2.0.0 与 codly-languages 0.1.10:浅色主题、语法高亮、行号,右上角显示语言图标与名称。 也可以通过字符串创建:

#codeblock("print('Hello, world!')", lang: "python")

未知语言显示原始名称;仅当语言库提供图标时显示对应图标。 短代码框默认保持完整,长代码块可以显式开启跨页:

#show: codly.set_(breakable: true)

Codly 2 配置使用作用域内的 show 规则,自定义语言图标与名称的例子:

#show: codly.lang-set_(languages: codly-languages + (
  mylang: (name: "My Language", icon: image("assets/my-language.svg", height: 10pt), color: blue),
))

参考文献、编号与附录

bibliography-style 默认为 "chicago-author-date",可换为 Typst 内置样式或自定义 CSL。 正文使用 @文献键 引用。模板保证输出顺序为:封面 → 三级目录 → 正文 → 参考文献 → 附录。 参考文献标题不编号,但进入目录。附录文件用普通 = 附录章标题 开始,多个一级标题依次为 A、B、C。

公式默认编号 (1.1)、(1.2),按章重置;附录为 (A.1)、(B.1)。 原生图、表和算法也按章独立编号。跨章、前向、从附录返回正文的引用均按被引用对象的位置生成章号。 单个不编号公式可在局部使用 #set math.equation(numbering: none)。

neat-book 参数

参数 默认值 含义
title "Neat Book" 书名字符串,同时写入 PDF 元数据
subtitle none 副标题内容
author () 单个作者字符串或作者字符串数组
institution none 机构内容
date none datetime 或文字;省略则不显示
logo none 调用方解析的图片或其他 content
lang "zh" 文档语言,控制断行与环境名称
fonts (:) 合并覆盖上表的字体配置
font-size 10.5pt 正文字号
cjk-oblique 12deg CJK 合成斜体角度;none 关闭合成
accent rgb("176B70") 标题、链接、提要和定义框的主色
paper "a4" 纸张规格
margin (x: 26mm, top: 25mm, bottom: 24mm) 页边距
cover true 是否输出封面
toc true 是否输出目录
toc-title auto 目录标题,默认随语言切换
toc-depth 3 目录深度
references none 文献表内容,通常为 bibliography(...)
bibliography-style "chicago-author-date" 默认文献样式
appendix none 参考文献后面的附录内容

正文从页码 1 开始,目录使用罗马页码,封面不显示页码。页眉显示书名与当前章名。 每章从新页开始。introduction(title: auto)[...] 可放在每章开头,支持列表、公式及自定义标题。

开发与发布

本项目采用 MIT 许可;依赖保留各自许可证,通过 Universe 导入,不在仓库内复制源代码。 素材来源、图标许可及商标说明见 第三方声明。封面书本图形是本项目原创, 示例中 Python/Rust 标志仅用于标识代码语言,不表示项目得到相应组织的认可。 make test 检查全部环境、公式重置、跨章引用、两章附录、五种 QED 结尾、 中英日混排、长内容跨页,以及真实 typst init 后独立项目的编译。 GitHub Actions 的编译配置在 .github/workflows/check.yml。

项目已提供 Universe manifest、可初始化模板、缩略图和最小发布包脚本。 源码仓库和作者信息已配置,正式提交前仍应重新运行官方检查工具;详见 发布说明。 包格式和提交要求参见 本次核对的 Typst 官方提交指南。

ElegantBook 为设计参考,本项目并非其官方移植版。