nju-lug / modern-nju-thesis

南京大学学位论文 Typst 模板 modern-nju-thesis
https://typst.app/universe/package/modern-nju-thesis
MIT License
123 stars 14 forks source link

代码块并入图序号 #5

Closed zhengzavan closed 2 months ago

zhengzavan commented 2 months ago

代码行的并入图序号,删除所有 Listing序号

学院的要求,代码块需要使用并入图序号,并且出现在图目录里,这个有办法做到吗?

微信图片_20240509010358

如上图,不是代码4.6 而是图4.6

zhengzavan commented 2 months ago

翻了一下 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 2 months ago

没必要啊,我感觉在 raw 外面包一层 rect 或者 block 就行了?

zhengzavan commented 2 months ago

没必要啊,我感觉在 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 2 months ago

没必要啊,我感觉在 raw 外面包一层 rect 或者 block 就行了?

重新看了一下i-figure,发现它是根据figure.kind分组的,所以只需要给raw 的 figure添加一个kind:image,就行了。方框的话直接给raw套一个rect