Я решаю перекрестные ссылки, используя решение, подобное тому, что опубликовал Николас выше. Я использую 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