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

如何为Typst文档实现图片内嵌/末尾追加的切换功能?

实现Typst图片位置一键切换(内嵌/末尾)

可以通过全局开关变量+图片存储数组的方式实现需求,下面是具体可直接复用的方案:

1. 全局配置与初始化

在文档开头定义控制开关和存储图片的数组:

// 控制图片位置:true=内嵌正文,false=全部移到文档末尾
#let inline-figures = true

// 存储非内嵌模式下的图片内容
#let figure-store = []

2. 自定义myfigure函数

该函数兼容原生figure的所有参数,根据开关自动处理图片位置:

#let myfigure(
  image,
  caption: none,
  width: 100%,
  // 可添加其他原生figure支持的参数
  ..rest
) = {
  if inline-figures {
    // 内嵌模式:直接渲染原生figure
    figure(
      image,
      caption: caption,
      width: width,
      ..rest
    )
  } else {
    // 末尾模式:将图片存入数组,正文插入引用标记
    figure-store.push(
      figure(
        image,
        caption: caption,
        width: width,
        ..rest
      )
    )
    // 正文显示符合德国论文格式的图片引用
    text(gray)[Abbildung #len(figure-store) (siehe Anhang)]
  }
}

3. 正文使用示例

不管切换哪种模式,调用方式完全一致:

// 正文内容示例
Dies ist ein Beispieltext, der sich auf ein Bild bezieht. #myfigure(
  image("diagramm.png"),
  caption: "Beispiel-Diagramm zur Datenanalyse",
  width: 80%
)
Weiterer Text, der auf das nächste Bild verweist. #myfigure(
  image("tabelle.png"),
  caption: "Vergleichstabelle der Messergebnisse"
)

4. 文档末尾自动输出图片

在文档最后添加以下代码,非内嵌模式下自动生成图片附录:

// 仅当非内嵌模式时显示图片附录
#if !inline-figures {
  pagebreak()
  = Anhang: Abbildungen
  // 遍历存储数组输出所有图片
  #for fig in figure-store {
    #fig
    v(1em) // 图片间添加间距
  }
}

额外:兼容原生figure命令(可选)

如果不想修改现有代码中的figure调用,可以直接覆盖原生命令:

#let original-figure = figure // 保存原生figure命令
#let figure(..args) = {
  if inline-figures {
    original-figure(..args)
  } else {
    figure-store.push(original-figure(..args))
    text(gray)[Abbildung #len(figure-store) (siehe Anhang)]
  }
}

这样你可以继续使用原生figure语法,无需调整现有代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:35:22