如何在Typst中实现LaTeX的subequations功能?
在Typst中实现带数字+字母编号的多行子方程
要在Typst里实现LaTeX subequations环境那种(1a)、(1b)、(1c)式的编号效果,你可以通过自定义计数器和方程编号格式来实现,具体方案如下:
基础实现代码
// 定义主计数器,负责生成编号里的数字部分 #let subeq-main = counter("subeq-main") // 自定义编号格式:主数字+字母后缀 #let subeq-format(idx) = { let main-num = subeq-main.display() let suffix = char("a".at(0) + idx - 1) "(" + main-num + suffix + ")" } // 生成第一组子方程 #equation( numbering: subeq-format, align: true, a = b, b = c, c = d, ) // 递增主计数器,生成第二组子方程 #subeq-main.step() #equation( numbering: subeq-format, align: true, x = y, y = z, )
代码说明
subeq-main是自定义计数器,用来控制每组子方程的数字前缀(比如1、2)。subeq-format函数接收每行方程的索引(从1开始),把主数字和对应字母(a、b、c...)拼接成目标编号格式。equation块开启align: true让方程对齐,同时指定numbering参数为自定义格式函数,这样每行方程都会生成独立的带字母后缀的编号。- 要生成新的一组子方程时,调用
subeq-main.step()递增主计数器即可,下一组的编号就会变成(2a)、(2b)。
封装成函数简化调用
如果需要频繁使用这种子方程块,可以把逻辑封装成函数,自动处理主计数器的递增:
#let subeq-main = counter("subeq-main") #let subeq-format(idx) = { let main-num = subeq-main.display() let suffix = char("a".at(0) + idx - 1) "(" + main-num + suffix + ")" } // 封装后的子方程块函数 #let subeq-block(..eqs) = { subeq-main.step() equation( numbering: subeq-format, align: true, ..eqs ) } // 调用方式更简洁 #subeq-block( a = b, b = c, c = d, ) #subeq-block( x = y, y = z, )
内容的提问来源于stack exchange,提问作者cknoll
相关产品推荐
相关产品推荐

