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

Typst模板中公式编号与引用问题求助

解决Typst模板中公式引用"cannot reference equation without numbering"错误

问题分析

你遇到的核心问题是把原本全局生效的公式规则封装到函数内部后,破坏了Typst的元素上下文和全局作用域:

  • show和set规则被限制在customEq函数内部,无法全局覆盖所有公式,导致带标签的公式没有正确生成编号。
  • 主脚本中把公式的body单独传入函数,丢失了原公式的label属性和位置信息,引用时找不到对应的编号记录。

修正方案

正确的做法是在模板的全局作用域(比如conf()函数或模板顶层)直接设置规则,而非封装成自定义函数。以下是修正后的代码:

模板脚本(template.typ)

// 全局配置公式编号格式
#set math.equation(numbering: "(1)")
// 全局设置块级公式允许换行
#show math.equation: set block(breakable: true)

// 自定义公式引用的显示样式
#show ref: it => {
  [equation #numbering(
      it.element.numbering,
      ..counter(math.equation).at(it.element.location())
    )]
}

// 全局处理公式:仅为带标签的块级公式生成编号
#show math.equation: it => {
  if it.block and not it.has("label") {
    // 抵消自动计数,避免无标签公式占用编号
    counter(math.equation).update(v => v - 1)
    // 生成无编号的块级公式,清空标签防止干扰
    math.equation(it.body, block: true, numbering: none) + label("")
  } else {
    // 保留原公式(带标签的会自动应用编号规则)
    it
  }  
}

主脚本(main.typ)

// 导入模板即可,无需额外处理公式
#import "template.typ": *

// 行内公式,无编号
$E=mc^2$

// 带标签的块级公式,自动生成编号
#math.equation(block: true, label: "energy"):
  E = mc^2

// 引用公式
根据公式 @energy,质能关系成立。

方案说明

  1. 全局作用域规则:所有set和show规则直接放在模板顶层或conf()函数中,确保整个文档的公式都能被正确处理。
  2. 保留元素上下文:直接处理原math.equation元素,不拆分body,确保label和位置信息完整,引用时能找到对应的编号。
  3. 计数控制:通过counter.update抵消无标签块级公式的自动计数,保证编号仅分配给带标签的公式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:25:57