r - 在书本结尾处创建定义/定理的索引

标签 r markdown knitr bookdown

为了方便读者,我想在本书的结尾处以markdown的形式包括本书正文中的简单列表或定义索引。即使用自定义块创建的块,如下所示:

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

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

感谢@yihui,我知道knitr::all_labels(engine == 'definition')是我的 friend 。

因此,我可以在本书结尾处的任何地方(通常在结尾处)执行此操作:
```{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')中不可用)

最佳答案

这是使用输出格式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')
```

输出:

definition list

基本思想是使用块 Hook 收集定义标签和名称,并在最后打印它们。您不必使用块选项name。它可以是任意选项,例如term。选项name是特殊的,因为定义的名称将显示在输出中。如果您不喜欢,可以使用term:
```{definition, d2, term='Bar'}
Bar is defined as ...
```

关于r - 在书本结尾处创建定义/定理的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40735727/

相关文章:

html - Vue.js Markdown 过滤器

html - 如何使用 Markdown 显示 {% raw %} 和 {% endraw %}?

r - 如何重新格式化数据并映射它?

r - 如何在脚本模式下只显示 `plot(model)` 的前两个图?

r - 如何将 R 警告消息重定向到 STDOUT?

Java 和 R 桥梁

javascript - 通过摊牌在浏览器中 Markdown

r - 如何使用 r-markdown 编织与多行文本对齐的内嵌图像?

r - 更改 R 的 kable 中的列宽不会更改标题的宽度

r - R中带有编织和减价的自定义CSS