对于HTML格式的R Markdown脚本,是否有人知道如何对字幕中的数字进行编号?
对于PDF文档,标题将说明如下:
图X:一些标题文本
但是,HTML版本的等效标题只是说:
一些标题文字
这使得数字的交叉引用数字完全没用。
这是一个最小的例子:
---
title: "My Title"
author: "Me"
output:
pdf_document: default
html_document: default
---
```{r cars, fig.cap = "An amazing plot"}
plot(cars)
```
```{r cars2, fig.cap = "Another amazing plot"}
plot(cars)
```
我尝试在每种输出格式中设置toc
,fig_caption
和number_sections
,但这似乎不会改变结果。
答案 0 :(得分:7)
提供的其他答案相对而言已经过时,因此使用 bookdown 软件包使此操作变得非常容易。该软件包提供了许多改进,其中包括Word,HTML和PDF中的内置图形编号。
要使用 bookdown ,您需要先安装软件包install.packages("bookdown")
,然后使用output formats中的一个。对于HTML,这是html_document2
。以您的示例为例:
---
title: "My Title"
author: "Me"
date: "1/1/2016"
output: bookdown::html_document2
---
```{r cars, fig.cap = "An amazing plot"}
plot(cars)
```
```{r cars2, fig.cap = "Another amazing plot"}
plot(cars)
```
这些数字将分别标记为Figure 1
和Figure 2
。假设代码块已命名并具有标题,我们可以使用语法\@ref(fig:foo)
交叉引用输出,其中foo
是块的名称,即\@ref(fig-cars)
。您可以了解有关此行为的更多信息here
进一步阅读
- R Markdown: The definitive Guide:第11章对书本进行了很好的概述
- Authoring books with bookdown提供了有关书本的全面指南,建议使用更高级的细节。
答案 1 :(得分:3)
因此,除非有人有更好的解决方案,这是我提出的解决方案,这种方法存在一些缺陷(例如,如果图/表编号取决于部分编号等...),但对于基本的html文档,它的工作原理。
在文档顶部的某处,运行:
```{r echo=FALSE}
#Determine the output format of the document
outputFormat = opts_knit$get("rmarkdown.pandoc.to")
#Figure and Table Caption Numbering, for HTML do it manually
capTabNo = 1; capFigNo = 1;
#Function to add the Table Number
capTab = function(x){
if(outputFormat == 'html'){
x = paste0("Table ",capTabNo,". ",x)
capTabNo <<- capTabNo + 1
}; x
}
#Function to add the Figure Number
capFig = function(x){
if(outputFormat == 'html'){
x = paste0("Figure ",capFigNo,". ",x)
capFigNo <<- capFigNo + 1
}; x
}
```
然后在您的文档过程中,如果您想要绘制一个数字:
```{r figA,fig.cap=capFig("My Figure Caption")
base = ggplot(data=data.frame(x=0,y=0),aes(x,y)) + geom_point()
base
```
如果您需要表格标题,请将上面的capFig
替换为capTab
。
答案 2 :(得分:3)
我们可以使用pandoc-crossref,这是一个允许交叉引用图形,表格,部分和方程式的过滤器,适用于所有输出格式。最简单的方法是在每个绘图后cat
数字标签(以{#fig:figure_label}
的形式),但这需要echo=FALSE
和results='asis'
。然后我们可以像引用一样引用一个数字:[@fig:figure_label]
默认生成fig. figure_number
。
这是一个MWE:
---
output:
html_document:
toc: true
number_sections: true
fig_caption: true
pandoc_args: ["-F","pandoc-crossref"]
---
```{r}
knitr::opts_chunk$set(echo=FALSE,results='asis')
```
```{r plot1,fig.cap="This is plot one"}
x <- 1:10
y <- rnorm(10)
plot(x,y)
cat("{#fig:plot1}")
```
As we can see in [@fig:plot1]... whereas [@fig:plot2] shows...
```{r plot2, fig.cap="This is plot two"}
plot(y,x)
cat("{#fig:plot2}")
```
生成(删除图形
PLOT1
图1:这是第一个
正如我们在图中看到的那样。 1 ...而无花果。 2显示......
PLOT2
图2:这是第二个图
有关更多选项和自定义设置,请参阅pandoc-crossref readme。
要安装pandoc-crossref,假设您安装了haskell:
cabal update
cabal install pandoc-crossref
答案 3 :(得分:0)
我使用类似于上面Nicholas发布的解决方案来解决交叉引用问题。我在某些项目中使用了bookdown,但我发现在我只想要简单的交叉引用的其他项目中使用它很尴尬。
当我用rmarkdown写一篇论文时,我使用以下内容,我希望它以标准格式提交给期刊。我想要一个图形结尾,然后是表格,然后我会有表格和数字。在我写作时,我只是粗略地了解了文本中引用数字的顺序。我只想用像fig:foobar这样的文本代码来引用它们,并在文本中指定基于外观的编号。当我查看图形图例列表时,我会看到传说的顺序,并根据需要移动图例。
这是我的结构。
我有一个R包,我有论文需要的东西,比如各种参考书目和辅助R函数。在该包中,我有以下函数,它使用在主Rmd环境中定义的一些变量:.rmdenvir和.rmdctr。
ref <- function(useName) {
require(stringr)
if(!exists(".refctr")) .refctr <- c(`_` = 0)
if(any(names(.refctr)==useName)) return(.refctr[useName])
type=str_split(useName,":")[[1]][1]
nObj <- sum(str_detect(names(.refctr),type))
useNum <- nObj + 1
newrefctr <- c(.refctr, useNum)
names(newrefctr)[length(.refctr) + 1] <- useName
assign(".refctr", newrefctr, envir=.rmdenvir)
return(useNum)
}
它假设我用cntname:foo之类的名称命名我想引用的东西,例如fig:foo。它为每个人制作了一个新的计数器,如果需要,我可以动态组成新的计数器(写作时)。
在我的主Rmd文件中,我有一些设置行:
```{r setup_main}
require(myPackageforPapers)
# here is where the variables needed by ref() are defined.
.rmdenvir = environment()
.refctr <- c(`_` = 0)
````
在文中我使用以下
You can see what I am trying to show in Figure `r ref("fig:foo")`
and you can see it also in Tables `r ref("tab:foo")`
and A`r ref("tabappA:foobig")`.
得到&#34;您可以看到我想要在图1中显示的内容,您也可以在表1和A1中看到它。&#34;虽然数字可能不是1;使用的数量将动态确定。我第一次参考一个数字,表格或我正在计算的任何东西时,我不必使用特殊功能。 ref()通过查看标签是否已存在来计算出来。如果不是,则分配下一个号码,然后返回。因此,您不必使用&#34;标签&#34;在一个地方&#34; ref&#34;在另一个。
在写作过程中,我可能会认为附录A太大了,我会把一些表分成附录B.我需要做的就是将上面的内容改为
You can see what I am trying to show in Figure `r ref("fig:foo")`
and you can see it also in Tables `r ref("tab:foo")`
and B`r ref("tabappB:foobig")`.
我只需指定一个新的计数器名称&#39; tabappB&#39;并且其数量是动态确定的。
在我的Rmd文件的末尾,我有一个看起来像
的图表 # Figure Legends
Figure `r ref("fig:foo")`. This is the legend for this figure.
Figure `r ref("fig:foo2")`. This is the legend for another figure.
然后我的表格显示如此
```{r print-tablefoo, echo=FALSE}
tablefoo=mtcars
thecap = "Tables appear with a legend while figures do not."
fullcap = paste("Table ", ref("tab:foo"), ". ", thecap, sep="")
kable(tablefoo, caption=fullcap)
```
然后是这样的数字:
```{r fig-foo, echo=FALSE, fig.cap=paste("Figure",ref("fig:foo"))}
plot(1,1)
```
附录A是一个包含在孩子身份的Rmd文件。它将有像
这样的表格 ```{r print-tableAfoo, echo=FALSE}
tablefoo=mtcars
thecap = "This is a legend."
fullcap = paste("Table A", ref("tabappA:foobig"), ". ", thecap, sep="")
kable(tablefoo, caption=fullcap)
```
我必须添加&#34; A&#34;得到表A1,但我发现如果R在标记我的计数器方面对我没有太多考虑,我会发现它更容易。我只是想让它返回正确的号码。
交叉引用适用于html,pdf / latex或word。我很乐意坚持使用乳胶解决方案,但我的合着者使用了单词,所以我需要一个与pandoc和word一起使用的解决方案。有时我想要html或其他输出,我需要一个适用于任何与rmarkdown一起使用的输出的解决方案。