R Markdown цифры номера HTML

Кто-нибудь знает, как пронумеровать цифры в подписях, для HTML-формата R Markdown script?

Для 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 в каждом из выходных форматов, но это не повлияло на результат.


person Nicholas Hamilton    schedule 09.05.2016    source источник
comment
Эта проблема решена с помощью резервирования. Он пока нестабилен, но, безусловно, стоит попробовать.   -  person mondano    schedule 11.05.2016


Ответы (4)


Другие предоставленные ответы относительно устарели, и с тех пор это стало очень легко сделать с помощью пакета 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), где foo - имя фрагмента, то есть \@ref(fig-cars). Подробнее об этом поведении можно узнать здесь.

Дополнительная информация

person Michael Harper    schedule 07.08.2018
comment
Однако можно ли изменить формат подписи в резервной копии? Например, сделайте это: Рисунок S1. так далее? (См., Например, здесь: stackoverflow.com/questions/51945079/) - person AMM; 29.08.2018
comment
@Micheal Harper: Что, если я хочу пронумеровать только цифры без названия? И что, если есть, например, два графика в фрагменте кода? - person xhr489; 11.03.2019
comment
@David, перекрестная ссылка работает, только если у вас есть подпись. Я думаю, если вам не нужна подпись, вы можете использовать что-то вроде fig.cap = " ", чтобы создать пустое место для заголовка. Если вам нужны подзаголовки, вы можете использовать this, если формат вывода - PDF. - person Michael Harper; 11.03.2019
comment
Кажется, что эта встроенная нумерация рисунков работает не в текстовых документах, а только в pdf и html. - person Dylan_Gomes; 03.02.2020

Поэтому, если у кого-то нет лучшего решения, это решение, которое я придумал, у этого подхода есть некоторые недостатки (например, если номер рисунка / таблицы зависит от номера раздела и т. Д.), Но для базовый 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 в приведенном выше, если вы хотите заголовок таблицы.

person Nicholas Hamilton    schedule 10.05.2016
comment
Я тоже использую что-то подобное. Думаю, проблема в том, что вы все еще не можете ссылаться на цифру. - person George Dontas; 13.05.2016
comment
Да, вы можете, используя пакет 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, так и для латексного вывода. - person Nicholas Hamilton; 13.05.2016

Мы можем использовать 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}")

```

который производит (удаление графики

УЧАСТОК1

Рисунок 1: Это первый график

Как видно на рис. 1… тогда как рис. 2 шоу…

УЧАСТОК 2

Рисунок 2: Это второй график

Дополнительные параметры и настройки см. В pandoc-crossref readme.

Чтобы установить pandoc-crossref, если у вас есть установка haskell:

cabal update
cabal install pandoc-crossref
person scoa    schedule 11.05.2016

Я решаю перекрестные ссылки, используя решение, подобное тому, что опубликовал Николас выше. Я использую 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. Я бы с радостью придерживался латексных решений, но мои соавторы используют слово, поэтому мне нужно решение, которое работает с pandoc и word. Также иногда мне нужен html или какой-либо другой вывод, и мне нужно решение, которое работает для любого вывода, работающего с rmarkdown.

person Eli Holmes    schedule 15.11.2017