R Markdown HTML数字数字

时间:2016-05-09 13:07:42

标签: html r r-markdown figure caption

对于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)
```

我尝试在每种输出格式中设置tocfig_captionnumber_sections,但这似乎不会改变结果。

4 个答案:

答案 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 1Figure 2。假设代码块已命名并具有标题,我们可以使用语法\@ref(fig:foo)交叉引用输出,其中foo是块的名称,即\@ref(fig-cars)。您可以了解有关此行为的更多信息here

  

进一步阅读

     

答案 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=FALSEresults='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一起使用的输出的解决方案。