在结账簿结尾处创建定义/定理索引

Ste*_*ell 6 markdown r knitr bookdown

为了方便读者,我想在我的书籍结尾处列出以书写形式书写的简短列表或书籍正文定义索引.即使用自定义块创建的,如下所示:

```{definition, bar, echo=T}
A bar is defined here as a foo-like thing.
```
Run Code Online (Sandbox Code Playgroud)

(我需要定义,但其他人可能会喜欢定理列表等.不知道图表列表是否可以用同样的方式覆盖?)

感谢@yihui,我知道那knitr::all_labels(engine == 'definition')是我的朋友.

所以我可以在本书的最后任何地方做到这一点,通常在最后:

```{r comment="",results="asis",echo=FALSE}
knitr::all_labels(engine == 'definition') %>% unlist %>% paste0("\n\n","\\@ref(def:",.,"): ",.,"\n\n",collapse="\n\n") %>% cat

```
Run Code Online (Sandbox Code Playgroud)

打印这个:

1: bar

2: foobar
Run Code Online (Sandbox Code Playgroud)

可点击的数字.哪个可以.但是,如果在每个标签之后,实际定义也可以打印出来,那不是很好吗?(块中的内容在knitr :: all_labels(engine =='definition')中不可用)

Yih*_*Xie 10

以下是使用输出格式的示例bookdown::html_document2,它也适用于任何其他书籍输出格式:

---
title: "Test Definitions"
output: bookdown::html_document2
---

```{r setup, include=FALSE}
def_list = list()
knitr::knit_hooks$set(engine = function(before, options) {
  if (before && options$engine == 'definition') {
    # collect definition terms from options$name
    def_list[[options$label]] <<- options$name
  }
  NULL
})
```

```{definition, d1, name='Foo'}
Foo is defined as ...
```

```{definition, d2, name='Bar'}
Bar is defined as ...
```

All definitions in this document:

```{r echo=FALSE, results='asis'}
def_list = unlist(def_list)
cat(sprintf('- \\@ref(def:%s) %s', names(def_list), def_list), sep = '\n')
```
Run Code Online (Sandbox Code Playgroud)

输出:

定义清单

基本思想是使用块钩来收集定义标签和名称,并在最后打印它们.您不必使用chunk选项name.它可以是任意选项,例如term.该选项name很特殊,因为定义的名称将打印在输出中.如果您不喜欢,可以使用,例如term:

```{definition, d2, term='Bar'}
Bar is defined as ...
```
Run Code Online (Sandbox Code Playgroud)