6

为了方便读者,我想在我的 bookdown 书的末尾,用 markdown 写一个简单的列表或书体定义的索引。即使用自定义块创建的,如下所示:

```{definition, bar, echo=T}
A bar is defined here as a foo-like thing.
```

(我需要定义,但其他人可能喜欢定理列表等。不知道是否可以以相同的方式涵盖图形和表格列表?)

感谢@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

```

打印这个:

1: bar

2: foobar

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

4

2 回答 2

11

这是一个使用输出格式的示例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')
```

输出:

定义列表

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

```{definition, d2, term='Bar'}
Bar is defined as ...
```
于 2016-11-24T05:34:24.013 回答
2

完美,加上 Yihui 的建议,这也打印出定义,无需费心名称,只需标签即可:

```{definition, 'Bar',echo=T,cache=F}
Bar is defined as something
```

```{definition, 'Bar2',echo=T,cache=F}
Bar2 is defined as something else.
```

Here are all the definitions in this book.

```{r comment="",results="asis",echo=FALSE,cache=F}


for(x in knitr::all_labels(engine == 'definition')){
   paste0("\n\n","\\@ref(def:",x,"): ",x,"\n\n>",knitr:::knit_code$get(x),collapse="\n\n") %>% cat
} 

```

...产生这个:

以下是本书中的所有定义。

1:酒吧

酒吧被定义为某事

2:酒吧2

Bar2 被定义为别的东西。

于 2016-11-25T08:42:29.293 回答