Typst使用指南
本文档书写构建的初衷是,如果希望调用AI帮助书写文档,可以直接将该文档交给AI以直接规定清楚AI的输出。
全局设置
说明:全局设置规定文档开头处一般需要写的内容,作为文档的基础模板,这个地方不需要AI来写,如果使用Python程序自动调用相关程序和AI生成文档,应当将本内容作为模板(保存为template.typ),每次导入模板即可,模板应该这样写:
// ------------------------
// KPS 统一盒子:自动编号 + 可引用
// 用法:#kpsbox(例题)[内容] 或 #kpsbox("例题")[内容]
// 可选参数:
// id: "ex:xxx" // 允许 @ex:xxx 引用编号
// stroke/fill/inset/radius/gap/title-size/title-weight // 外观控制
// 说明:
// - 不同 kind(例题/定理/练习)使用彼此独立的计数器
// - 标题在框外上方,显示为"例题 1"、"例题 2" …
// ------------------------
#let kpsbox(
kind, // 标题文字(如:例题、定理、练习)
body,
id: none, // 可选:给出 id 以便 @id 引用
stroke: 1pt,
fill: luma(98%),
inset: 12pt,
radius: 8pt, // 默认改为圆角
gap: 0.4em, // 标题与框之间的间距
title-size: 1.05em, // 标题字号
title-weight: 700 // 标题粗细
) = context {
// 计数器按 kind 分组
let kind-name = str(kind)
let cnt = counter("kpsbox-" + kind-name)
// 先步进计数器,确保从1开始
cnt.step()
// 获取当前值
let num = if id != none {
let anchor = label(id)
cnt.update(anchor)
cnt.display()
} else {
cnt.display()
}
// 标题块:如"例题 1"
block(below: gap)[
#set text(weight: title-weight, size: title-size)
#kind #num
]
// 带边框内容块 - 宽度设为100%以匹配文档宽度
block(width: 100%)[
#box(
stroke: stroke,
fill: fill,
inset: inset,
radius: radius,
width: 100%, // 确保框宽度为100%
body
)
]
}
#let project(
title: "",
authors: (),
logo: none,
body,
titlesize: ""
) = {
// 基础设置
set text(
font: ("dengxian"),
lang: "zh",
region: "cn"
)
// 初始化各种盒子的计数器,设置为0,这样第一次步进后就是1
counter("kpsbox-例题").update(1)
counter("kpsbox-例题解答").update(1)
counter("kpsbox-习题").update(1)
counter("kpsbox-习题解答").update(1)
counter("kpsbox-定理").update(1)
// 标题设置 - 所有级别加粗
show heading: set text(weight: 700, font: ("dengxian"))
set heading(numbering: "1.1.1")
// 其他文档设置
show heading.where(level: 1): set block(below: 1em)
show math.equation.where(block: false): math.display
set document(author: authors, title: title)
set page(paper: "a4")
set par(leading: 0.5em)
// 代码块样式
show raw.where(block: false): box.with(
fill: white,
stroke: 0.5pt + luma(200),
inset: (x: 3pt, y: 0pt),
outset: (y: 3pt),
radius: 2pt,
)
show raw.where(block: true): block.with(
fill: white,
stroke: 1pt + luma(100),
inset: 10pt,
radius: 4pt,
width: 100%,
)
// 标题页
v(0.6fr)
if logo != none {
align(right, image(logo, width: 26%))
}
v(9.6fr)
text(titlesize, weight: 700, font: ("Times New Roman", "Microsoft YaHei", "SimHei"), title)
v(0.2fr)
for c in authors [#c]
v(2.4fr)
pagebreak()
// 目录页
set page(numbering: "1", number-align: center)
outline(depth: 3, indent: auto)
pagebreak()
// 正文
set par(justify: true)
body
}
此文件保存为template.typ 然后写主文档:
#import "KPS-Template.typ": *
#import "@preview/physica:0.9.6": *
#show: project.with(
title: "KPS-Project-简约书籍模板",
titlesize: 1.5em,
authors: ("一号作者",)
)
//下方便可接入AI生成的内容
此文件接入AI的内容过后,最终的结果应当保存为result.typ
文档细节规定
以下是修改后的文档,所有表格都已居中:
Typst表格教程:3步创建带合并单元格的结构化表格
一、表格基础:从3列布局开始
在Typst中,#table() 是构建表格的核心函数。以示例中的3列表格为例,首先通过 columns: 3 定义固定列数,align: center + horizon 确保内容垂直居中+水平对齐。注意Typst表格遵循行主序填充(先行后列),所有单元格需按顺序填入:
#align(center, table(
columns: 3, // 固定3列
align: center, // 全局垂直居中
// 表头行(独立语义化标签)
table.header[Technique][Advantage][Drawback],
// 第1数据行:3个单元格
[Diegetic], [Hekki 1], [Hekki 2],
// 第2数据行
[Extradiegetic], [Breaks immersion], [Obtrusive],
))
二、关键技巧:跨列合并(colspan)
当需要横向合并单元格时,使用 table.cell(colspan: 2) 包裹内容。注意:合并列数需小于等于总列数,且会占据后续单元格位置。修改示例第二行:
#align(center, table(
columns: 3,
align: center,
table.header[Technique][Advantage][Drawback],
[Diegetic], // 第1列
table.cell(colspan: 2, "Hekki"), // 合并2-3列,内容居中
// 无需填写第3列(已被合并占据)
[Extradiegetic], [Breaks immersion], [Obtrusive],
))
此时表格结构变为:
| Technique | Advantage(合并列) |
|---|---|
| Diegetic | Hekki |
三、合并同行中的表格的最终代码
#align(center, table(
columns: 3, // 固定3列
align: center, // 全局垂直居中
// 表头行(独立语义化标签)
table.header[Technique][Advantage][Drawback],
// 第1数据行:3个单元格
[Diegetic], table.cell(colspan: 2, "Hekki"),
// 第2数据行
[Extradiegetic], [Breaks immersion], [Obtrusive],
))
数学物理化学公式
绝对值
abs(x)
这能渲染出x的绝对值
范数
norm(x)
这能渲染出x的范数
大 O 符号(Big O):“不超过某阶的增长”(上界)
Order(x)
渲染为大O符号
小 o 符号(Little o):“远小于某阶的增长”(严格上界)
order(x)
渲染为小o符号
集合符号
Set(a_n), Set(a_i; forall i)
Set(vec(1,n); forall n, n|2)
Set(a; exists x,a=x^2)
使用Set()包裹集合内的内容,使用分号“;”分割集合元素和元素条件,forall是“任取”符号,exists是“存在”符号
区间求值
evaluated(x)_0^infinity
例如说计算定积分,最后一步应当有原函数取上限值减去原函数取下限值,这就是区间求值符号作用的地方。infinity是无限的意思,按照具体的区间,可以对上下限进行修改。
期待值
expval(u)
expval(p, psi)
期待值(即期望值),在量子力学等领域常用狄拉克符号(bra-ket 符号)表示,如示例中、,用于描述物理量在量子态下的平均取值,也可类比推广到概率论中随机变量的期望计算场景,可根据具体物理量或随机变量对参数进行调整。
列向量
vec(1, 2)
列向量,示例中,用于表示具有列结构的向量,可根据具体元素个数和数值进行调整。
行向量
vecrow(alpha, b)
vecrow(sum_0^n i, b, delim:"[")
行向量,示例中、,用于表示具有行结构的向量,可通过delim参数修改分隔符,也可根据元素内容灵活调整。
转置
v^TT
A^TT
转置,示例中、,用于表示矩阵、向量的转置操作,在线性代数中用于交换行列结构,也可参考相关线性代数章节(如Section 3.7.1)深入了解。
粗体向量
vb(a)
vb(mu_1)
粗体向量,示例中、,通过加粗符号来表示向量,常用于线性代数、物理等领域对向量的标记,可根据具体符号进行调整。
单位向量
vu(a)
vu(mu_1)
单位向量,示例中、,用于表示模长为1的向量,在力学、电磁学等领域描述方向时常用,可根据具体向量符号修改。
带箭头向量
va(a)
va(mu_1)
带箭头向量,示例中、,通过在符号上方加箭头来标记向量(非粗体,符合ISO 80000-2:2019标准),适用于需要明确向量标识的场景,可更换具体符号。
梯度
grad f
梯度,示例中,是多元函数的偏导数组成的向量,用于描述函数在空间中的变化率方向,在微积分、物理场分析中广泛应用。
散度
div vb(E)
散度,示例中,用于描述矢量场的发散程度,在电磁学(如电场的散度)、流体力学等领域是核心概念。
旋度
curl vb(B)
旋度,示例中,用于描述矢量场的旋转程度,在电磁学(如磁场的旋度)等领域具有关键作用。
拉普拉斯算子
diaer(u) = c^2 laplacian u
拉普拉斯算子,示例中(注意:非Typst中的Laplace 形式),是二阶微分算子,在偏微分方程、物理场(如热传导、波动)中频繁出现。
点积
a dprod b
点积(内积的一种),示例中,用于计算两个向量的标量结果,反映向量的投影关系,在力学(如功的计算)、线性代数中常用。
叉积
a cprod b
叉积,示例中,用于计算两个向量的矢量结果,其方向垂直于原向量所在平面,在力学(如力矩)、电磁学(如洛伦兹力)中应用广泛。
内积
iprod(u, v)
iprod(sum_i a_i, b)
内积,示例中、,是向量空间中元素的一种运算,可推广到函数空间等场景,用于定义长度、角度等概念。
矩阵
mat(1,2;3,4)
矩阵,示例中,是由数排成的矩形阵列,在线性代数中用于描述线性变换、方程组等,可根据元素数量和数值调整。
矩阵行列式
mdet(1,x;1,y)
矩阵行列式,示例中,是矩阵的一个标量属性,用于判断矩阵可逆性、求解线性方程组(克拉默法则)等,可根据矩阵元素修改。
对角矩阵
dmat(1,2)
dmat(1,a,xi,delim:"[",fill:0)
对角矩阵,示例中、,是主对角线外元素全为0的矩阵,可通过delim修改分隔符、fill指定填充元素,也可调整对角线上的元素。
反对角矩阵
admat(1,2)
admat(1,a,xi,delim:"[",fill:dot)
反对角矩阵,示例中、,是主对角线元素全为非主对角线(反对角线)有元素的矩阵,可通过delim修改分隔符、fill指定填充样式,也可调整反对角线上的元素。
单位矩阵
imat(2)
imat(3,delim:"[",fill:*)
单位矩阵,示例中、,是主对角线元素全为1、其余元素全为0的方阵,在线性代数中是矩阵乘法的单位元,可通过delim修改分隔符、fill指定填充样式,也可调整维度。
零矩阵
zmat(2)
zmat(3,delim:"[")
零矩阵,示例中、,是所有元素都为0的矩阵,在线性代数中是矩阵加法的单位元,可通过delim修改分隔符,也可调整维度。
雅可比矩阵
jmat(f_1,f_2; x,y)
jmat(f,g; x,y,z; delim:"[")
jmat(f_1,f_2;x,y;big:#true)
jmat(f,g;x,y,z;delim:"|",big:#true)
雅可比矩阵,示例中、、(大分数版)、(大分数版),是一阶偏导数组成的矩阵,用于描述多元函数的局部线性变换,可通过delim修改分隔符、big:#true取消分数压缩,也可调整函数和变量数量。
海塞矩阵
hmat(f; x,y)
hmat(; x,y,z; delim:"[")
hmat(f;x,y;big:#true)
hmat(;x,y,z;delim:"|",big:#true)
海塞矩阵,示例中、、(大分数版)、(大分数版),是二阶偏导数组成的对称矩阵,用于多元函数的极值分析、泰勒展开等,可通过delim修改分隔符、big:#true取消分数压缩,也可调整变量数量。
旋转矩阵(2D和3D)
rot2mat(theta)
rot2mat(-a/2,delim:"[")
rot2mat(display(a/2),delim:"[")
rot3xmat(theta)
rot3ymat(45^degree)
rot3zmat(theta,delim:"[")
旋转矩阵,2D示例中、、;3D示例中、、,用于描述平面或空间中的旋转变换,2D旋转围绕原点,3D旋转分别围绕x、y、z轴,可通过delim修改分隔符、调整角度参数。
格拉姆矩阵
grammat(alpha,beta)
grammat(v_1,v_2,v_3, delim:"[")
grammat(v_1,v_2, norm:#true)
格拉姆矩阵,示例中、、,由向量的内积组成,用于衡量向量组的线性相关性、计算投影矩阵等,可通过delim修改分隔符、norm:#true将对角元素显示为向量范数的平方,也可调整向量数量。
左矢
bra(u)
bra(vec(1,2))
左矢,示例中、,是量子力学中狄拉克符号的“左部分”,用于与右矢配合表示内积等运算,可根据具体量子态(如向量、符号)调整内容。
右矢
ket(u)
ket(vec(1,2))
右矢,示例中、,是量子力学中狄拉克符号的“右部分”,用于表示量子态,可根据具体量子态(如向量、符号)调整内容。
内积(狄拉克符号)
bracket(a)
bracket(u, v)
bracket(psi,A/N,phi)
内积(狄拉克符号),示例中、、,用于计算量子态或算符的内积,可支持1、2、3个参数,适用于量子力学中态与态、态与算符与态的内积场景。
外积(狄拉克符号)
ketbra(a)
ketbra(u, v)
ketbra(a/N, b)
外积(狄拉克符号),示例中、、,用于表示量子态的外积(投影算符类结构),可支持1或2个参数,在量子力学中用于描述态的投影、算符构造等场景。
期望值(狄拉克符号)
expval(u)
expval(A,psi)
期望值(狄拉克符号),示例中、,用于计算物理量在量子态下的期望值,适用于量子力学中算符的期望取值场景,可根据算符和量子态调整参数。
矩阵元(狄拉克符号)
mel(n, partial_nu H, m)
矩阵元(狄拉克符号),示例中,用于表示算符在量子态之间的矩阵元,与bracket(n,M,n)作用类似,适用于量子力学中算符矩阵元的计算场景。
概率
Pr(x)
概率,示例中,用于表示事件发生的概率,在概率论中描述随机事件的可能性大小,可根据具体随机变量调整参数。
指数函数
exp x
指数函数,示例中,是以自然常数为底的指数运算,在微积分、概率统计(如指数分布)等领域广泛应用。
对数函数
log x, lg x, ln x
对数函数,示例中,分别对应一般对数、常用对数(以10为底)、自然对数(以为底),用于解决指数关系的逆运算,在数学分析、工程计算中常见。
二进制对数
lb x
二进制对数,示例中,是以2为底的对数,在计算机科学(如信息熵、算法复杂度)中应用广泛。
矩阵行列式
det A
矩阵行列式,示例中,是矩阵的一个标量属性,用于判断矩阵可逆性、求解线性方程组等,在线性代数中具有核心地位。
对角矩阵(紧凑形式)
diag(-1,1,1,1)
对角矩阵(紧凑形式),示例中,是主对角线元素为指定值、其余元素为0的矩阵的紧凑表示(若需显式矩阵形式可使用dmat),在线性代数中用于简化对角矩阵的书写。
矩阵迹
trace A, tr A
Trace A, Tr A
矩阵迹,示例中、,是矩阵主对角线元素的和,在线性代数中用于描述矩阵的特征值和、线性变换的迹等场景。
矩阵秩
rank A
矩阵秩,示例中,是矩阵中行(或列)向量组的极大线性无关组的秩,用于衡量矩阵的线性相关性、解空间维度等,在线性代数中是关键概念。
高斯误差函数
erf(x)
高斯误差函数,示例中,在概率统计(如正态分布的累积分布函数)、工程计算中用于描述误差分布等场景。
留数(复分析)
Res A
留数(复分析),示例中,在复分析中用于计算复变函数的围道积分,是复积分的核心工具之一。
实部与虚部(复分析)
Re z, Im z
实部与虚部(复分析),示例中,用于分解复数为实部和虚部,是复分析、电路分析(如交流电的实虚分量)等领域的基础概念。
符号函数
sgn x
符号函数,示例中,用于表示实数的符号(正、负、零),在数学分析、信号处理等领域用于描述变量的符号特征。
微分
differential(...)
微分,示例中,用于描述函数或变量的微小变化,在微积分、微分几何(如外微分)等领域是基础概念。
变分
var(f)
var(x,y)
变分,示例中、,是dd(..., d: delta)的简写,用于变分法中描述函数的微小变分,在力学(如拉格朗日力学)、变分原理中应用广泛。
差分
difference(f)
difference(x,y)
差分,示例中、,是dd(..., d: Delta)的简写,用于描述变量或函数的有限变化,在数值分析(如差分方程)、离散数学中常见。
导数
derivative(...)
导数,示例中,用于描述函数的变化率,在微积分中是核心概念,可表示一阶、高阶等多种导数形式。
偏导数
partialderivative(...)
偏导数,示例中,用于描述多元函数对某一变量的变化率,支持混合阶偏导数,在多元微积分、物理场分析(如偏微分方程)中不可或缺。
一般文档格式
代码
typst中渲染代码和markdown类似,都是用两个"```"包裹代码部分作为代码框,例如:
#include <iostream>
int main() {
// 输出Hello, World!到控制台
std::cout << "Hello, World!" << std::endl;
return 0;
}
你也可以使用行内代码,例如说:print("hello)
加粗
加粗使用*包裹内容
*这是加粗的内容*
斜体
斜体使用_包裹内容
_这是斜体的内容_
下划线
使用命令
#underline("下划线的文本")
删除线
#strike("被删除的文本")
标题体系
使用等号组织标题
= 这是一级标题
== 这是二级标题
=== 这是三级标题
==== 这是四级标题
列表与嵌套
无序列表
- 主项1
- 子项1-1
- 子项1-2
- 主项2
- 子项2-1
- 子项2-2
有序列表
+ 主项1
+ 子项1-1
+ 子项1-2
+ 主项2
+ 子项2-1
+ 子项2-2
图片与其引用
// 1. 定义带标签的图片:label="fig:trend" 是关键,绑定引用标识
#figure(
image("chart.jpg", width: 80%),
caption: "趋势分析图",
) <fig:trend>
// 2. 引用该图片:用 @+标签名,自动关联编号
如图@fig:trend 所示,2023-2024 年数据呈稳步上升趋势,其中 Q3 增幅达 15%。
对于AI识别文档,它需要做的事情
AI生成文档的时候并不能完美地理解文档全文的组织,所以在调用AI识别pdf,分段拼接全文档的时候,应当弱化文档排版技术,尽量的使用最纯粹的文档格式,具体体现在:
不能使用标题格式,如果识别到有标题,请将标题单独成行按照普通文本输出,上方和下方都要空一行,这样才能隔离出标题。 不能使用下划线、删除线、加粗、斜体,就用最普通的文字输出。
当然要完全忠于原文,AI最多只能把混乱的文档组织成从上到下的文段的格式,但是具体的内容,即使是错别字,也不要修改,这个应当在后期修改。
面对表格,AI尽可能地转化表格为typst格式,面对代码,AI将把它放到代码环境中,在文段中的小段语句说明的代码使用行内代码,大段的代码使用大代码环境。
面对图片,AI识别图片有什么内容,对于风景和画像图,描述这是什么图,对于数学物理图片,描述图片内容,并叙述一下读到的参数。 AI输出图片说明的格式大概是:“【此处有一张图片】...(后面是上述提及的描述)”