【问题标题】:R Markdown HTML Number FiguresR Markdown HTML数字数字
【发布时间】:2016-09-04 03:20:31
【问题描述】:

有谁知道如何为 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,但这似乎并没有改变结果。

【问题讨论】:

  • 此问题已通过bookdown 解决。它还不稳定,但绝对值得一试。

标签: html r r-markdown figure caption


【解决方案1】:

提供的其他答案相对已过时,此后使用 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

进一步阅读

【讨论】:

  • 但是,是否可以更改 bookdown 中的标题格式?例如使它:图S1。等等? (例如:stackoverflow.com/questions/51945079/…
  • @Micheal Harper:如果我只想对没有标题的数字进行编号怎么办?如果有例如怎么办?代码块中有两个图?
  • @David,只有当您有标题时,交叉引用才有效。我想如果你不想要标题,你可以使用fig.cap = " " 之类的东西来为标题标题创建一些空白空间。如果你想要子字幕,如果输出格式是 PDF,你可以使用this
  • 好像这个内置的数字编号在word文档中不起作用,只能在pdf和html中使用。
【解决方案2】:

所以除非有人有更好的解决方案,否则这是我想出的解决方案,这种方法存在一些缺陷(例如,如果图形/表格编号取决于节编号等...),但对于基本的 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

【讨论】:

  • 我也使用类似的东西。我想问题是你仍然不能引用数字。
  • 是的,您可以使用kfigr 包创建如下函数:refFig = function(x,prefix=TRUE){ x = figr(x,prefix=prefix,link=FALSE,type='Figure'); x} refTab = function(x,prefix=TRUE){ x = figr(x,prefix=prefix,link=FALSE,type='Table'); x} 然后调用内联r refFig('mylabel')',这将适用于html 和latex 输出。
  • 请在答案中包含允许引用的函数以及figtab 的工作示例
【解决方案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}")

```

产生(删除图形

情节1

图 1:这是情节一

如图所示。 1……而图。 2 场演出……

情节2

图 2:这是情节二

有关更多选项和自定义,请参阅pandoc-crossref readme

要安装 pandoc-crossref,假设你有一个 haskell 安装:

cabal update
cabal install pandoc-crossref

【讨论】:

    【解决方案4】:

    我使用类似于上面 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() 通过查看标签是否已经存在来解决这个问题。如果不是,它分配下一个数字,并返回它。所以你不必在一个地方使用“label”而在另一个地方使用“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。我很乐意坚持使用乳胶解决方案,但我的合著者使用 word,所以我需要一个适用于 pandoc 和 word 的解决方案。此外,有时我想要 html 或其他一些输出,我需要一个适用于任何与 rmarkdown 一起使用的输出的解决方案。

    【讨论】:

      猜你喜欢
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 2015-05-30
      • 1970-01-01
      • 2020-11-16
      • 2021-03-15
      相关资源
      最近更新 更多