2016-11-22 61 views
4

爲了方便讀者,我希望在我的書的末尾添加書面降價,本書正文中的簡單列表或定義索引。即使用自定義模塊創建的,是這樣的:在書的末尾創建定義/定理的索引

```{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')中不可用)

回答

5

下面是一個使用輸出格式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

的基本思想是用一大塊鉤來收集定義標籤和名稱,並在最後打印出來。您不必使用塊選項name。它可以是任意選項,例如term。選項name是特殊的,因爲定義的名稱將打印在輸出中。如果你不喜歡,你可以使用,例如,term

```{definition, d2, term='Bar'} 
Bar is defined as ... 
``` 
+0

很好......所以有可能使用相同類型的鉤子來收集塊的*內容*,以便能夠在最後定義列表中打印定義的內容,而不僅僅是名稱和鏈接?我想我可以嘗試使用類似ref的東西。在文檔末尾添加標籤,以重新使用定義塊內容 –

+0

塊的內容不能從塊鉤子訪問,但是您可以從'knitr ::: knit_code $ get(a_vector_of_chunk_labels)'獲得它, –

0

完美,因此增加從一輝的建議,這樣就會打印出定義爲好,沒必要用名打擾,只是標籤將做到:

```{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:BAR2

BAR2被定義爲別的東西。