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

求助:Quarto Lua脚本无法提取YAML元数据中的ORCID编号

解决Quarto自定义短代码无法提取YAML中ORCID的问题

核心问题分析

你的代码存在两个关键错误导致无法获取ORCID:

  • 字段名不匹配:YAML元数据里用的是author(单数),但Lua脚本中尝试读取meta.authors(复数),自然拿不到数据。
  • 短代码函数参数错误:Quarto自定义短代码的Lua函数签名应为function(args, kwargs, meta),你只写了function(meta),导致实际传入的参数不是文档元数据,而是短代码的参数列表,所以meta为空。

修正后的Lua脚本

return {
  ['orcid'] = function(args, kwargs, meta)
    -- 从元数据中获取作者列表,兼容单数author和复数authors字段
    local authors = meta.author or meta.authors
    -- 处理单作者的情况(Quarto可能将单个作者转为非数组结构)
    if authors and not authors[1] then
      authors = {authors}
    end

    if authors then
      for _, author in ipairs(authors) do
        if author.orcid then
          local orcid_id = pandoc.utils.stringify(author.orcid)
          -- 使用pandoc原生Link元素,兼容HTML以外的输出格式
          return pandoc.Para(pandoc.Link("ORCID", "https://orcid.org/" .. orcid_id))
        end
      end
    end

    return pandoc.Para(pandoc.Str("ORCID not found"))
  end
}

关键修正点说明

  1. 参数顺序修正:函数接收args, kwargs, meta三个参数,确保第三个参数才是文档的元数据对象。
  2. 兼容作者字段的单复数:同时检查author和authors字段,适配不同的YAML写法。
  3. 处理单作者场景:当YAML中只有单个作者时,Quarto可能不会将其转为数组,因此需要手动包装为数组以便遍历。
  4. 使用原生Link元素:替代直接输出HTML RawInline,这样生成的内容能兼容PDF、EPUB等非HTML格式的输出。

验证方法

保持你的YAML元数据不变,在文档中使用{{< orcid >}}短代码,编译后应该会生成指向对应ORCID页面的链接;若所有作者都没有ORCID,则显示提示文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:22:23