在rmarkdown中是否有字幕和引用代码的技巧(不是运行代码的结果)?例如,我如何引用这段代码:
```{r blah}
blah <- "blah"
```
我知道我可以使用\ @ref(图:theFig)或\ @ref(tab:theTable)来获取fig.cap或标题(使用kable)但是我没有看到标题和引用的方法代码本身。
答案 0 :(得分:7)
这将是一个很棒的功能。我认为它尚未整合。这是一种适用于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
由于用于块的环境不是浮动类型,我们声明一个名为chunk
的新环境。选项name
留空,因为我们已经在下一行中重新定义\thechunk
,方法是在 Chunk 之前添加(使用名称选项播放,看看会发生什么)。
块应该按部分枚举,因此我们告诉tex每次新部分开始时重置计数器。
如果您不使用章节编号(通过设置YAML选项),则替换行
\renewcommand{\thechunk}{Chunk~\thesection.\arabic{chunk}}
通过
\renewcommand{\thechunk}{Chunk~\arabic{chunk}}
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)
})
在这里,我们使用了两个新的块选项ref
和codecap
。如果其中任何一个不是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}
这是两个页面的输出:
<强>注释:强>
您可以通过检查所需的输出类型来改进代码,以便新的源挂钩仅用于pdf输出(因为它是午餐时间而跳过)。