Typst-context

简介

Context 即上下文, Typst 中的一些行为需要用上下文信息来计算出当前需要的结果, 比如 header numberings, 你需要计算前面出现了多少个 header, 才能得到当前的 numbering.

show 规则, set 规则和 numbering 其实都会隐示创建上下文, 而这个上下文信息可以用 context 关键词来获取. 比如:

1
#set text(lang: "de")

设置了文档的语言, 而这个信息就可以用 context 关键字来读取:

1
2
3
4
5
6
7
8
9
10
#context text.lang

#let value = context text.lang
#value

#set text(lang: "de")
#value

#set text(lang: "fr")
#value

获取位置信息

可以利用 context 得到当前位于文档中的位置 (绝对位置), 或者相对某个元素的位置.

下面是一个利用 heading 获取当前位置的示例, 可以用 counter.get 获取当前位置的 counter 信息, 其返回一个数组 (毕竟当前位置可能有多个 counter 在起作用, 以下面的例子而言, 一级标题维护一个 counter, 一级标题下的二级标题也维护一个 counter):

1
2
3
4
5
6
7
8
9
10
11
12
#set heading(numbering: "1. ")

= Introduction
#lorem(5)

#context counter(heading).get()

= Background
== hello
#lorem(5)

#context counter(heading).get()

  • (1,1) 就知道当前位置是第一个一级标题下的第一个二级标题处

获取当前页, 行, 列信息

利用 here() 函数:

1
2
3
#context [
#here.position()
]

获取指定位置的页, 行, 列信息

利用 locate() 函数:

1
2
3
4
5
#context [
#locate(<intro>).position()
]

= Introduction <intro>

获取指定内容的 context 信息

利用 counter.at:

1
2
3
4
5
6
7
8
9
10
11
12
13
#set heading(numbering: "1.")

= Introduction <intro>
#lorem(5)

= Background <back>
#lorem(5)

#context [
#counter(heading).get() \
#counter(heading).at(here()) \
#counter(heading).at(<intro>)
]
  • here() 指定当前位置, counter.at(here())counter.get() 等价
  • at(<intro>) 利用 label 来指定要获取谁的 context 信息

context 嵌套

1
2
3
4
5
6
#set text(lang: "de")
#context [
#set text(lang: "fr")
#text.lang \
#context text.lang
]

set 之后, 当前 context 信息已经计算出了.

这里第一个 context 块, 使用的是该块之外已经计算出的结果, 因此在第二个 set 之后, #text.lang 的值仍然没有改变.


Typst-context
http://example.com/2024/10/29/Typst-context/
作者
Jie
发布于
2024年10月29日
许可协议