You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何在Typst中实现随当前章节变化的动态页眉

在Typst中实现随章节更新的页眉

当然可以实现,你之前的错误是因为set page属于全局页面配置,不能放在show heading这样的容器上下文里执行。下面是正确的实现思路和代码:

核心思路

通过状态变量跟踪当前章节的标题内容,然后在全局页面配置的页眉中引用这个状态变量,实现页眉内容随章节动态更新。

完整实现代码

// 定义状态变量,用于存储当前章节标题,初始值为空
#let current-chapter = state("current-chapter", "")

// 拦截一级标题(章节),更新状态变量
show heading.where(level: 1): it => {
  // 更新当前章节标题为当前标题的文本内容
  current-chapter.update(it.body)
  // 保留原标题的样式(这里可以加你需要的样式,比如蓝色)
  set text(blue.darken(40%))
  it
}

// 全局配置页面页眉,引用状态变量
set page(
  header: grid(
    columns: (1fr, 3fr, 1fr),
    align(left)[LeftHead],
    align(center, current-chapter.value()),
    align(right)[Right Head]
  )
)

// 测试内容
#heading(level: 1)[第一章:Typst入门]
#lorem(50)
#pagebreak()
#lorem(30)
#heading(level: 1)[第二章:高级排版技巧]
#lorem(40)
#pagebreak()
#lorem(20)

代码说明

  1. 状态变量:current-chapter是一个可更新的状态,会在遇到新的一级标题时被更新为当前标题的文本。
  2. 标题拦截:show heading.where(level: 1)只针对一级标题(章节),确保只有章节标题会触发页眉更新;如果需要跟踪更低级别的标题(比如小节),只需调整level参数。
  3. 全局页眉配置:在全局的set page中直接引用current-chapter.value(),这样每页渲染时都会获取最新的章节标题,实现动态更新。

扩展技巧

如果需要区分奇偶页页眉内容(比如奇数页显示章节名,偶数页显示书名),可以结合page.number()做条件判断:

set page(
  header: grid(
    columns: (1fr, 3fr, 1fr),
    align(left)[LeftHead],
    align(center, 
      if page.number() % 2 == 1 {
        current-chapter.value()
      } else {
        "我的Typst文档"
      }
    ),
    align(right)[Right Head]
  )
)

内容的提问来源于stack exchange,提问作者KronosTheLate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:42:54