求助: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 }
关键修正点说明
- 参数顺序修正:函数接收
args, kwargs, meta三个参数,确保第三个参数才是文档的元数据对象。 - 兼容作者字段的单复数:同时检查
author和authors字段,适配不同的YAML写法。 - 处理单作者场景:当YAML中只有单个作者时,Quarto可能不会将其转为数组,因此需要手动包装为数组以便遍历。
- 使用原生Link元素:替代直接输出HTML RawInline,这样生成的内容能兼容PDF、EPUB等非HTML格式的输出。
验证方法
保持你的YAML元数据不变,在文档中使用{{< orcid >}}短代码,编译后应该会生成指向对应ORCID页面的链接;若所有作者都没有ORCID,则显示提示文本。
内容的提问来源于stack exchange,提问作者Produnis
相关产品推荐
相关产品推荐

