Ссылка на фрагмент с использованием 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".
Ответы
Ответ 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}.