[英]R Markdown HTML Number Figures
对于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
,但这似乎不会改变结果。
提供的其他答案相对过时,使用bookdown软件包已经非常容易。 该软件包提供了许多改进,包括Word,HTML和PDF的内置数字编号。
为了能够使用bookdown ,您需要先安装软件包install.packages("bookdown")
,然后使用其中一种输出格式 。 对于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)
交叉引用输出\\@ref(fig:foo)
其中foo
是块的名称,即\\@ref(fig-cars)
。 您可以在此处了解有关此行为的更多信息
进一步阅读
- R Markdown:权威指南 :第11章概述了预订
- 使用bookdown创作书籍可提供有关预订的综合指南,并建议您提供更多高级详细信息。
因此,除非有人有更好的解决方案,这是我提出的解决方案,这种方法存在一些缺陷(例如,如果图/表编号依赖于部分编号等...),但是对于基本的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
```
如果你想要一个表格标题,将capTab
替换为capFig
的capTab
。
我们可以使用pandoc-crossref ,这是一个允许交叉引用图形,表格,部分和方程的过滤器,适用于所有输出格式。 最简单的方法是cat
图标签(在形式{#fig:figure_label}
每个图后,尽管这需要echo=FALSE
和results='asis'
。 然后我们可以参考一个数字,因为我们会引用: [@fig:figure_label]
产生fig. figure_number
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自述文件 。
要安装pandoc-crossref,假设您有haskell安装:
cabal update
cabal install pandoc-crossref
我使用类似于上面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")`.
得到“你可以看到我想在图1中展示的内容,你也可以在表1和A1中看到它。” 虽然数字可能不是1; 使用的数量将动态确定。 我第一次引用一个图形,表格或者我在计算的任何东西时都不必使用特殊功能。 ref()通过查看标签是否已存在来计算出来。 如果不是,则分配下一个号码,然后返回。 因此,您不必在一个地方使用“标签”,在另一个地方使用“ref”。
在写作过程中,我可能会认为附录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")`.
我只是指定一个新的计数器名称'tabappB',并且它的数字是动态确定的。
在我的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)
```
我必须添加“A”来获得表A1,但是如果R在标记我的计数器方面对我没有太多想法,我会发现它更容易。 我只是想让它返回正确的数字。
交叉引用适用于html,pdf / latex或word。 我很乐意坚持使用乳胶解决方案,但我的合着者使用了单词,所以我需要一个与pandoc和word一起使用的解决方案。 有时我想要html或其他输出,我需要一个适用于任何与rmarkdown一起使用的输出的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.