gpt4 book ai didi

r - rmarkdown 是否允许代码块的标题和引用?

转载 作者:行者123 更新时间:2023-12-04 12:34:10 27 4
gpt4 key购买 nike

是否有在 rmarkdown 中添加字幕和引用一小段代码的技巧(不是运行代码的结果)?例如,我如何引用这段代码:

```{r blah}
blah <- "blah"
```

我知道我可以使用\@ref(fig:theFig) 或\@ref(tab:theTable) 来获取 fig.cap 或标题(使用 kable),但我看不到标题和引用代码本身的方法.

最佳答案

这将是一个很棒的功能。而且我认为它还没有集成。这是一种适用于 PDF 文档并允许您生成标题和标签以进行交叉引用的方法:

  • 包括 header.tex内容如下
  • \usepackage{caption}
    \usepackage{floatrow}

    \DeclareNewFloatType{chunk}{placement=H, fileext=chk, name=}
    \captionsetup{options=chunk}
    \renewcommand{\thechunk}{Chunk~\thesection.\arabic{chunk}}
    \makeatletter
    \@addtoreset{chunk}{section}
    \makeatother
    由于用于 block 的环境不是 float 类型,我们声明了一个新的,命名为 chunk .选项 name因为我们已经重新定义了 \thechunk所以留空在下一行中添加单词 Chunk(使用 name 选项,看看会发生什么)。
    block 应该按节枚举,所以我们告诉 tex 每次新节开始时重置计数器。
    如果您不使用节编号(通过设置 YAML 选项),则替换该行
    \renewcommand{\thechunk}{Chunk~\thesection.\arabic{chunk}}
    经过
    \renewcommand{\thechunk}{Chunk~\arabic{chunk}}
  • 修改 rmarkdown 文档中的 knitr 源 Hook
  • library(knitr)
    oldSource <- knit_hooks$get("source")
    knit_hooks$set(source = function(x, options) {
    x <- oldSource(x, options)
    x <- ifelse(!is.null(options$ref), paste0("\\label{", options$ref,"}", x), x)
    ifelse(!is.null(options$codecap), paste0("\\captionof{chunk}{", options$codecap,"}", x), x)
    })
    这里我们使用了两个新的 block 选项 refcodecap .如果其中一个不是 NULL ,使用命令 \label生成相应的标签或标题或 \captionof .
    MWE:
    ---
    title: "Cross-referencing Code Chunks"
    output:
    pdf_document:
    includes:
    in_header: header.tex
    number_sections: true
    ---

    ```{r, echo=FALSE}
    library(knitr)
    oldSource <- knit_hooks$get("source")
    knit_hooks$set(source = function(x, options) {
    x <- oldSource(x, options)
    x <- ifelse(!is.null(options$ref), paste0("\\label{", options$ref,"}", x), x)
    ifelse(!is.null(options$codecap), paste0("\\captionof{chunk}{", options$codecap,"}", x), x)
    })
    ```

    # Foo

    Jump to \ref{TheBarChunk}

    ```{r Foo, ref = "TheFooChunk", codecap = "My Chunk"}
    print("Foo!")
    ```

    \newpage

    # Bar

    ```{r Bar, ref = "TheBarChunk", codecap = "My second chunk"}
    print("Bar!")
    ```

    Head back to \ref{TheFooChunk}
    这是(两个页面的)输出:
    enter image description here
    enter image description here
    在代码块下方添加标题
    如果您希望在代码块下方而不是上方添加标题,可以通过将上面的 knitr 钩子(Hook)更改为:
    oldSource <- knit_hooks$get("source")
    knit_hooks$set(source = function(x, options) {
    x <- oldSource(x, options)
    x <- ifelse(!is.null(options$codecap), paste0(x, "\\captionof{chunk}{", options$codecap,"}"), x)
    ifelse(!is.null(options$ref), paste0(x, "\\label{", options$ref,"}"), x)
    })
    评论:
    您可以通过检查所需的输出类型来改进代码,以便新的源 Hook 仅用于 pdf 输出(因为是午餐时间而跳过)。

    关于r - rmarkdown 是否允许代码块的标题和引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702942/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com