Quarto书籍标题使用r params$name参数不生效问题求助
解决Quarto书籍标题动态使用参数值的问题
问题根源
你遇到的核心问题是:_quarto.yml作为Quarto的项目配置文件,不会被knitr或其他代码引擎解析,所以里面的r params$name只会被当作纯文本显示,而不会执行并替换为参数值。和参数定义在qmd文件还是主YAML无关——哪怕你把参数移到_quarto.yml里,主配置里的R代码也依然不会被执行。
解决方案
下面提供两种可行的实现方式:
方式一:项目参数 + Lua 过滤器
这种方式适合需要在多个地方复用参数,且希望保持主配置简洁的场景:
- 修改_quarto.yml,定义项目级参数并给标题加占位符,同时引入Lua过滤器:
project: type: book execute-dir: project params: name: "Test" # 定义项目级参数 book: title: "Test title for {name}" # 用占位符标记需要替换的位置 chapters: - index.qmd - contact_us.qmd format: html: theme: cosmo fontsize: 16px mainfont: Arial filters: - title-params.lua # 引入自定义过滤器 execute: echo: false warning: false editor: source
- 在项目根目录创建
title-params.lua文件,写入以下代码:
function Meta(meta) -- 将标题中的占位符替换为项目参数的实际值 meta.book.title = meta.book.title:gsub("{name}", quarto.project.params.name) return meta end
- 如果需要在qmd文件中使用这个参数,直接用
r quarto.project.params.name即可,和主配置保持参数一致。
方式二:在qmd文件中动态修改元数据
这种方式更直接,不需要额外的Lua文件:
修改你的index.qmd,在setup代码块里用Quarto API动态更新书籍标题:
--- params: name: "Test" engine: knitr --- ```{r setup, include=FALSE} # 动态替换书籍标题 quarto_metadata$book$title <- paste("Test title for", params$name)
Introduction {.unnumbered}
This book is about r params$name.
渲染书籍时,setup代码块会自动修改Quarto的元数据,从而让标题显示参数对应的实际值。 内容的提问来源于stack exchange,提问作者cp13
相关产品推荐
相关产品推荐

