Typst-语法基础
Modes
Typst 主要有三种 syntactical modes:
- Code, 以
#
开头, lets you use Typst’s scripting features - Math, 用
$$
包裹 - Markup, 用
[]
包裹, 其内的特殊符号被解析为样式, 在非 Code 和 Math 模式时, 默认为 Markup 模式 (此时没有用[]
包裹)
注释
单行用 //
.
多行用 /* */
.
转义
用 \
, 也可以用 \u{}
显示 utf8 字符:
1 |
|
Scripting 语法
这里演示: 函数调用, 访问字段, 以及调用 methods:
1 |
|
Blocks
两种 blocks:
- Code block, 如
{ let x = 1; x + 2 }
多语句同一行用;
分割, 或者写作多行. 在{}
中的语句不再需要#
开头. 返回值可以是 block 中的最后一个语句. - Content block, 如
[*Hey* there!]
也就是 Markup 的 block, 可以把整个 block 赋值给一个变量.
如:
1 |
|
Bindings and Destructuring
用 let
创建变量称为 bindings
, 用 =
进行赋值. 如果没有初始化, 则其值为 none
. 如:
1 |
|
也可以用 let
创建具名函数. 如:
1 |
|
创建 arrays 和 dictionaries, 都是用 ()
, 如:
1 |
|
..
用于收集剩余元素. 如 #let (Homer, ..other) = books
, 这里 other
就赋值为除 Homer
以外的键值对.
注意这里的 #let (Austen,) = books
用于取出 Austen
键的值.
循环迭代 dictionaries 的值, 如:
1 |
|
可以用 _
当作占位符:
1 |
|
用 zip
方法可以将两个数组配对成一个新的数组列表, 如:
1 |
|
用 map
方法来直接操作数组:
1 |
|
交换两个变量的值可以直接为:
1 |
|
Conditions
语法为:
if condition {..}
if condition [..]
if condition [..] else {..}
if condition [..] else if condition {..} else [..]
Loops
Typst 支持 for
和 while
循环. 语法为:
for .. in collection {..}
for .. in collection [..]
while condition {..}
while condition [..]
如:
1 |
|
同时也支持 break
和 continue
. 如:
1 |
|
Fields
用 .
访问, 可以是:
- dictionary 的键
- module 下的定义
- symbol 中的 modifier
- element 包含的 content
如:
1 |
|
Methods
Methods 与 type 相绑定. 比如字符串调用 len
的两种方式;
1 |
|
语法格式为:
1 |
|
Modules
include "bar.typ"
, Evaluates the file at the pathbar.typ
并返回其内容import "bar.typ"
, 将bar.typ
的内容作为bar
关键字导入, 可以起别名:import "bar.typ" as hhh
import "bar.typ": a, b
, 导入变量, 可以用*
导入全部, 也可以起别名, 如:import "bar.typ": a as one, b as two
如:
1 |
|
Packages
用 @namespace/name:version
的格式导入:
1 |
|
Context
Style context
可以用 context
关键字来访问一些上下文信息. 如这里用 set
设置的 style context:
1 |
|
这里先用 set
设置了 text(lang: "de")
作用于后面所有的文档, 因此产生了一个上下文, 可以用 context
来访问.
似乎由于 bindings 的机制, 可以实现:
1 |
|
的输出为:
1 |
|
value
的值在随上下文而变化.
Location context
文本在 document 中所处的位置, 即 location context (比如周围是什么 element, 位于哪一 page 等) 也可以用 conotext
关键字访问.
如:
1 |
|
这里的 counter.get
隐式借助了 location context.
使用 counter.at
和 here
更加灵活:
1 |
|
用 locate
函数来获取具体的位置信息:
1 |
|
Nested contexts
1 |
|
也就是说, 当前层的 context 都需要用 context
来访问, 不然就是访问外层的.
Label
可以直接为 markup content 附上一个 label, 也可以先给 label 赋予一定的 style 后 attach 到 content 中, 如:
1 |
|
Type
Typst 中的常见的类型包括, 如:
1 |
|
输出为:
1 |
|
arguments
在 Typst 中, arguments 也是一种类型, 指剩下的参数:
1 |
|
这里输出的类型就是 arguments
.
arguments()
函数为 constructor, 返回一个 arguments 类型的值.
pos()
方法, 将参数以 array 返回.
named()
方法, 将参数以 dictionary 返回.
array
Array 中的元素不需要为同一类型.
array()
函数为 constructor, 返回一个 array 类型值.
at
方法, 取数组中指定 index
的元素, 可指定默认值.
比较直观的方法有:
len()
first()
last()
push()
pop()
insert()
remove()
slice()
contains()
rev()
, reversesplit()
join()
filter(function)
函数和 perl 中的 grep
类似.
map(function)
函数和 perl 中的 map
类似.
sorted(function)
函数和 perl 中的 sort
类似.
zip(..array)
函数, 用于整合数组.
dedup()
, 函数, 可移除数组中的重复元素.
content
所有的 markup 都是 content 类型 (也就是 []
包裹的部分).
datetime
Datetime 类型用于表示时间.
datetime()
函数为 constructor.
display()
方法用于显示.
dictionary
键值对间用 :
.
dictionary()
函数为 constructor.
at()
方法指定键, 访问其值.
比较直观的函数有:
len()
keys()
values()
insert()
remove()
pairs()
Integer
对于每一个 integer, 常用的 methods 有:
signum
, 返回整数的符号
selector
selector 实际就是 filter, 用于选择自己想要找到的 elements. 有多种方式得到 selector 类型:
- 用 element function
- string, regular expression
<label>
location
- selector constructor
如 selector()
constructor, 可以将一个 value 转换为 selector. 这个 value 可以是;
- element function
<label>
- more complex selector
其函数声明为:
1 |
|
和 query 配合使用
1 |
|
这里的 heading
是一个 element constructor.
Calculation 模块
默认导入为 calc
.
eval
和 Perl 语言中类似, 这里是将 string 视为 Typst code, 如:
1 |
|
这里可以指定的 mode 包括 code
, markup
, math
. 默认是 code
.
function
创建具名函数
如:
1 |
|
这里使用 let
将一段 typst code 和一个 name 绑定在一起.
创建匿名函数
用 parameter list 加上 =>
在加上 function body. 如果只有一个 parameter, 则可省略 parameter list 两侧的括号.
如:
1 |
|
这里参数为 it
, 函数体为 [#it #it]
.
panic
用于输出到编译的输出中:
1 |
|