Подтвердить что ты не робот

Ссылка на фрагмент с использованием knitr, r markdown и pandoc (pander)

У меня возникли проблемы с попыткой ссылки на куски в документе r markdown, который я пытаюсь преобразовать в .pdf с помощью pandoc.convert.

Если я включаю \label{mylabel} в текст - я могу ссылаться на это на \ref{mylabel}. Тем не менее, я думал, что мог бы сослаться на кусок (или таблицу/фигуру внутри куска) аналогичным образом - но мне не повезло.

Например, для фрагмента:

```{r myplot, echo=FALSE, warning=FALSE}
plot(cars)
```

Я мог бы поместить \ref{myplot} или \ref{fig:myplot} или даже внутреннюю ссылку на уценку [car plot](myplot). В документации, по-видимому, упоминается, что метки создаются на основе имени куска, и это форматы, предложенные в отношении похожих вопросов. Но никто не работает.

Аналогично для таблиц (которые я создаю с помощью pander) - у меня есть куски вроде:

```{r car_sum}
library(pander)
car_summary<-summary(cars)
pander(car_summary, caption = "This is a summary of cars")
```

При преобразовании в .pdf из файла .md с помощью "pandoc.convert" таблицам дается приятное название "Таблица 3 Это сводка автомобилей" и пронумерованы, но я не могу использовать метку в качестве ссылки \ref{car_sum}, и он всегда отображается как '??'. Некоторые форумы, похоже, упоминают, что перед названием метки вам нужно включить "tab:" или "fig:", но это все еще не работает для меня.

Можно ли отредактировать ссылки в тексте? Если да, то нужно набирать, чтобы сделать это правильно, чтобы он работал в конечном документе, показывающем что-то вроде "см. Таблицу 2".

4b9b3361

Ответ 1

Все возможно!!

См. этот смысл, который делает то, что вы описываете. Просто сохраните и вязать его, чтобы увидеть его в действии... По какой-то причине Rpub не захотел опубликовать его (неизвестная ошибка).

Тестирование с преобразованием сгенерированного knitr .html в .pdf через pandoc привело также к рабочим ссылкам, что является хорошим бонусом!

Рабочая лошадка:

```{r setup, echo=FALSE, results='hide'}
chunkref <- local({
  function(chunklabel) {
    sprintf('[%s](#%s)', chunklabel, chunklabel )
  }  
})

secref <- local({
  function(seclabel) {
    sprintf('[%s](#%s)', seclabel, seclabel )
  }  
})

pgref <- local({
  function(n)
  sprintf('[Page-%i](#Page-%i)', n, n)
})

sec <- local({
  function(seclabel) {
    sprintf('# <a name="%s"/> %s', seclabel, seclabel )
  }  
})

pgcount <- local({
  pg <- 0
  function(inc=T) {
    if( inc ) { pg <<- pg + 1 }
    return( pg )
  }
})

pganchor <- local({
  function(doLabel=T) {
    if( doLabel) {
      sprintf('\n-----\nPage-%i\n<a name="Page-%i"/>\n', pgcount(inc=F), pgcount() )
    } else {
      sprintf('\n<a name="Page-%i"/>\n', pgcount() )
    }
  }
})

knit_hooks$set( anchor = function(before, options, envir) {
  if ( before ) {
    sprintf('<a name="%s"/>\n', options$label )
  }
})

knit_hooks$set( echo.label = function(before, options, envir) {
  if ( before ) {
    sprintf('> %s', options$label )
  }
})

knit_hooks$set( pgbreak = function(before, options, envir) {
  if ( !before ) {
    pganchor();
  }
})
````

Что позволяет создавать несколько типов ссылок...

Inline: `r sec("Introduction")` then `r secref("Introduction")`

или

Как опции пакета:

```{r car-summary, echo=T, warning=FALSE, anchor=T, pgbreak=T, echo.label=F}`

затем

`r chunkref("car-summary")`

Даже ссылки "сверху страницы" и "нижняя часть страницы" маркеры и метки...

Ответ 2

Более простое решение для обращения к цифрам: поместите это в поле fig.cap (double \\, чтобы избежать первого \):

fig.cap="\\label{mylabel}Caption of my figure."

Затем используйте \autoref{mylabel} для ссылки на рисунок в основном тексте.

Я использую RStudio с Rmarkdown. Полный документ RMD:

---
output: pdf_document
---

```{r fig.cap="\\label{mylabel}Caption of my figure."}
plot(1)
```

The generated figure is \autoref{mylabel}.