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

时间:2018-06-05 14:46:19

标签: r latex r-markdown knitr

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

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

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

1 个答案:

答案 0 :(得分:7)

这将是一个很棒的功能。我认为它尚未整合。这是一种适用于PDF文档的方法,允许您为交叉引用生成标题和标签:

1。添加包含以下内容的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

由于用于块的环境不是浮动类型,我们声明一个名为chunk的新环境。选项name留空,因为我们已经在下一行中重新定义\thechunk,方法是在 Chunk 之前添加(使用名称选项播放,看看会发生什么)。

块应该按部分枚举,因此我们告诉tex每次新部分开始时重置计数器。

如果您不使用章节编号(通过设置YAML选项),则替换行

\renewcommand{\thechunk}{Chunk~\thesection.\arabic{chunk}}

通过

\renewcommand{\thechunk}{Chunk~\arabic{chunk}}

2。修改rmarkdown文档中的knitr source 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)
})

在这里,我们使用了两个新的块选项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

<强>注释:

您可以通过检查所需的输出类型来改进代码,以便新的源挂钩仅用于pdf输出(因为它是午餐时间而跳过)。