繁体   English   中英

R Markdown HTML数字数字

[英]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)
```

我尝试在每种输出格式中设置tocfig_captionnumber_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 1Figure 2 提供代码块是命名的并且有一个标题,我们可以使用语法\\@ref(fig:foo)交叉引用输出\\@ref(fig:foo)其中foo是块的名称,即\\@ref(fig-cars) 您可以在此处了解有关此行为的更多信息

进一步阅读

因此,除非有人有更好的解决方案,这是我提出的解决方案,这种方法存在一些缺陷(例如,如果图/表编号依赖于部分编号等...),但是对于基本的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替换为capFigcapTab

我们可以使用pandoc-crossref ,这是一个允许交叉引用图形,表格,部分和方程的过滤器,适用于所有输出格式。 最简单的方法是cat图标签(在形式{#fig:figure_label}每个图后,尽管这需要echo=FALSEresults='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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM