代码块并入图序号
zhengzavan opened this issue · 4 comments
zhengzavan commented
zhengzavan commented
翻了一下 i-figure 的源码,感觉论文模板应该没什么操作空间,只能直接改 i-figure
本人太菜,不太懂typst的原理,凭感觉改了几个地方,貌似是能达目标的,就是不知道兼容性如何
#let _prefix = "i-figured-"
#let reset-counters(it, level: 1, extra-kinds: (), equations: true, return-orig-heading: true) = {
if it.level <= level {
for kind in (image, table, raw) + extra-kinds {
// 改了reset,感觉不用改,但是不改不行
if kind == image or kind == raw{
counter(figure.where(kind: _prefix + repr(image)).or(figure.where(kind: _prefix + repr(raw)))).update(0)
}
else{
counter(figure.where(kind: _prefix + repr(kind))).update(0)
}
// counter(figure.where(kind: _prefix + repr(kind))).update(0)
}
if equations {
counter(math.equation).update(0)
}
}
if return-orig-heading {
it
}
}
#let _typst-numbering = numbering
#let _prepare-dict(it, level, zero-fill, leading-zero, numbering) = {
let numbers = counter(heading).at(it.location())
// if zero-fill is true add trailing zeros until the level is reached
while zero-fill and numbers.len() < level { numbers.push(0) }
// only take the first `level` numbers
if numbers.len() > level { numbers = numbers.slice(0, level) }
// strip a leading zero if requested
if not leading-zero and numbers.at(0, default: none) == 0 {
numbers = numbers.slice(1)
}
let dic = it.fields()
let _ = if "body" in dic { dic.remove("body") }
let _ = if "label" in dic { dic.remove("label") }
let _ = if "counter" in dic { dic.remove("counter") }
// 这个是把caption前面的“代码”字样换成“图”
if it.kind == raw and "caption" in dic{
dic.insert("supplement", "图" )
}
dic + (numbering: n => _typst-numbering(numbering, ..numbers, n))
}
#let show-figure(
it,
level: 1,
zero-fill: true,
leading-zero: true,
numbering: "1.1",
extra-prefixes: (:),
fallback-prefix: "fig:",
) = {
if type(it.kind) == str and it.kind.starts-with(_prefix) {
it
} else {
let figure = figure(
it.body,
.._prepare-dict(it, level, zero-fill, leading-zero, numbering),
// 可以合并代码和图片的计序
kind: _prefix + if it.kind == raw {repr(image)} else {repr(it.kind)} ,
)
if it.has("label") {
// let prefixes = (table: "tbl:", raw: "lst:") + extra-prefixes
// 代码也用fig引用
let prefixes = (table: "tbl:", raw: "fig:") + extra-prefixes
let new-label = label(prefixes.at(
if type(it.kind) == str { it.kind } else { repr(it.kind) },
default: fallback-prefix,
) + str(it.label))
[#figure #new-label]
} else {
figure
}
}
}
#let show-equation(
it,
level: 1,
zero-fill: true,
leading-zero: true,
numbering: "(1.1)",
prefix: "eqt:",
only-labeled: false,
unnumbered-label: "-",
) = {
if (
only-labeled and not it.has("label")
or it.has("label") and (
str(it.label).starts-with(prefix)
or str(it.label) == unnumbered-label
)
or not it.block
) {
it
} else {
let equation = math.equation(
it.body,
.._prepare-dict(it, level, zero-fill, leading-zero, numbering),
)
if it.has("label") {
let new-label = label(prefix + str(it.label))
[#equation #new-label]
} else {
let new-label = label(prefix + _prefix + "no-label")
[#equation #new-label]
}
}
}
#let _typst-outline = outline
#let outline(target-kind: image, title: [List of Figures], ..args) = {
_typst-outline(..args, title: title, target: figure.where(kind: _prefix + repr(target-kind)))
}
OrangeX4 commented
没必要啊,我感觉在 raw 外面包一层 rect 或者 block 就行了?
zhengzavan commented
没必要啊,我感觉在 raw 外面包一层 rect 或者 block 就行了?
不是方框的问题,是代码块并入图片编号,比方说,有一个图A,接着是代码B;只用rect的话,假设A的编号是图 1.1,那B的编号就是代码 1.1。且A出现在图目录里,B出现在listings目录里
而导师期望的结果是,A的编号是图 1.1 ,B 的编号是图1.2,且A B 均出现在图目录里。
zhengzavan commented
没必要啊,我感觉在 raw 外面包一层 rect 或者 block 就行了?
重新看了一下i-figure,发现它是根据figure.kind分组的,所以只需要给raw 的 figure添加一个kind:image,就行了。方框的话直接给raw套一个rect