如何使用Typst的selector查询标题之间的内容?
在Typst中选择标题之间的内容
可以通过组合Typst的query和选择器逻辑提取标题之间的内容,核心思路是定位目标标题和它后续的第一个同级标题,再获取两者之间的元素。以下是具体实现方案:
实现步骤与代码示例
我们可以封装一个函数来提取指定标题之后、下一个同级标题之前的内容:
= 标题提取演示 // 定义函数:获取指定二级标题之后到下一个同级别标题前的内容 #let get-content-after-heading(target-heading) = locate(loc => { // 找到目标标题的位置 let target = query(selector(heading.where(level: 2, text: target-heading)), loc).first() // 找到目标标题之后的第一个同级标题 let next-heading = query(selector(heading.where(level: 2)).after(target.location()), loc).first() if next-heading != none { // 获取两个标题之间的所有元素 query(selector(all).between(target.location(), next-heading.location()), loc) } else { // 如果是最后一个标题,获取它之后到文档结尾的内容 query(selector(all).after(target.location()), loc) } }) // 提取Test1到Test2之间的内容 #let content1 = get-content-after-heading("Test1") #content1 // 提取Test2到Test3之间的内容 #let content2 = get-content-after-heading("Test2") #content2 // 提取Test3之后的内容 #let content3 = get-content-after-heading("Test3") #content3 == Test1 #lorem(10) == Test2 Hello World. \ Hello Again. == Test3 This is test3 \ This is test3 too
关键逻辑说明
- 定位目标标题:通过
heading.where(level: 2, text: target-heading)精准匹配指定二级标题,获取其位置对象。 - 定位下一个同级标题:用
.after(target.location())筛选出目标标题之后的第一个同级标题,作为内容范围的结束边界。 - 提取区间内容:使用
.between()选择器获取两个标题位置之间的所有元素;如果是最后一个标题,则用.after()获取其之后到文档结尾的内容。
注意事项
- 如果标题文本存在重复,需要调整匹配逻辑(比如结合标题的位置索引)避免错误匹配。
- 提取的内容是元素列表,直接调用即可渲染;若需进一步处理(如统计字数),可遍历列表操作。
内容的提问来源于stack exchange,提问作者ohmycloudy
相关产品推荐
相关产品推荐

