【问题标题】:Change default behavior of callout blocks in Quarto更改 Quarto 中标注块的默认行为
【发布时间】:2023-01-19 17:29:18
【问题描述】:

在 Quarto 中,我想更改单个 callout block 类型的默认行为,以便它

  1. 总是自动拥有相同的caption (例如“其他资源”)
  2. 永远是folded (collapse="true")

    假设我希望将此用于 tip 标注块类型,而其他(notewarningcautionimportant)不应受到影响。

    换句话说,我想要这个的行为/输出:

    :::{.callout-tip collapse="true"}
    ## Additional Resources
    
    -   Resource 1
    
    -   Resource 2
    :::
    

    只需要写这个:

    :::{.callout-tip}
    -   Resource 1
    
    -   Resource 2
    :::
    

【问题讨论】:

    标签: r-markdown quarto


    【解决方案1】:

    查看文档后,根据我自定义 Rmarkdown 的经验,我猜想这需要创建自定义模板和/或使用 pandoc Lua 过滤器。

    我过去使用的一种更轻量级的方法是使用一个小的自定义函数将自定义标注块的代码添加到 Rmd 或 Qmd。一个缺点是这需要一个代码块。但是,为了让您的生活更轻松一些,您可以例如创建一个 RStudio sn-p 以将代码块模板添加到您的文档中。

    ---
    title: "Custom Callout"
    format: html
    ---
    
    ```{r}
    my_call_out <- function(...) {
      cat(":::{.callout-tip collapse='true'}
    ")
      cat("## Additional Resources
    ")
      cat(paste0("- ", ..., collapse = "
    
    "))
      cat("
    :::
    ")
    }
    ```
    
    ```{r results="asis"}
    my_call_out(paste("Resource", 1:2))
    ```
    
    Blah blah
    
    ```{r results="asis"}
    my_call_out("Resource 3", "Resource 4")
    ```
    
    Blah blah
    

    【讨论】:

    • 谢谢!这对我来说非常好,而且我觉得它非常巧妙。对我来说最烦人的部分之一实际上是标题会出现在 RStudio 的文档大纲中,这也已在此处修复。
    【解决方案2】:

    更新:

    我实际上已经将以下 lua 过滤器转换为四开过滤器扩展 collapse-callout,它允许更轻松地为特定标注块指定默认选项。有关安装和使用的详细说明,请参阅 github 自述文件。


    正如@stefan 提到的,您可以使用 pandoc Lua 过滤器更巧妙地完成此操作。

    四开本_doc.qmd

    ---
    title: "Callout Tip"
    format: html
    filters: 
      - custom-callout.lua
    ---
    
    ## Resources
    
    :::{.custom-callout-tip}
    -   Resource 1
    
    -   Resource 2
    :::
    
    
    ## More Resources
    
    :::{.custom-callout-tip}
    -   Resource 3
    
    -   Resource 4
    :::
    
    

    自定义callout.lua

    local h2 = pandoc.Header(2, "Additional Resources")
    
    function Div(el)
      if quarto.doc.isFormat("html") then
        if el.classes:includes('custom-callout-tip') then
          local content = el.content
          table.insert(content, 1, h2)
          return pandoc.Div(
            content,
            {class="callout-tip", collapse='true'}
          )
        end
      end
    end 
    


    只需确保 quarto_doc.qmdcustom-callout.lua 文件位于同一目录(即文件夹)中。

    【讨论】:

    • 检查编辑后的答案。我认为最好使用自定义类名 .custom-callout-tip 而不是使用 .callout-tip 来执行此操作。
    • 非常好。做得好。关于将 lua 与四开本结合使用的良好参考资料的任何提示?
    • Quarto 文档对此有 a section。但是 TBH,我自己正在学习过程中,并试图找到包含大量示例的文档或与此相关的书籍。具体来说,我浏览了quarto-exts中的代码来回答这个问题。
    • 相同的。我也在这里通过试错法:-)
    • 极好的!我现在已经使用了它(将 custom-callout.lua 文件添加到主项目文件夹并将 filters: - custom-callout.lua 添加到我网站的主 _quarto.yaml
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多