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,质能关系成立。
方案说明
- 全局作用域规则:所有
set和show规则直接放在模板顶层或conf()函数中,确保整个文档的公式都能被正确处理。 - 保留元素上下文:直接处理原
math.equation元素,不拆分body,确保label和位置信息完整,引用时能找到对应的编号。 - 计数控制:通过
counter.update抵消无标签块级公式的自动计数,保证编号仅分配给带标签的公式。
内容的提问来源于stack exchange,提问作者tevzm
相关产品推荐
相关产品推荐

