2016-07-16 6 views
0

長いRnwドキュメントのインデックスを作成しようとしています。私はむしろフォームknitrで関数のLaTeX indexエントリを自動生成する方法

\index{*functionname* function (*packagecontainingthatfunction*)} 

のインデックスエントリを持つようにコードの塊に呼び出される各機能をたいknitrがためにこれらを自動生成場合は、手動で各コードチャンクを検査し、これらのインデックス・エントリを追加するよりも、それはいいだろう私。

どうすればよいですか?

私はknitr::render_latexの動作を無効にする必要があると思いますが、変更する必要があることはわかりません。

と遊ぶのサンプルRnwファイル:

\documentclass{article} 

\usepackage[]{imakeidx} 
\makeindex 

\begin{document} 

<<>>= 
y <- log(sqrt(1:10)) 
@ 

\printindex 

\end{document} 

答えて

3

は、フックを使用してください。

この関数は式を再帰的に参照し、関数が見つかるたびに\index{functionname function (packagename)}を返します。

create_index_entry_from_expressions <- function(exprs) 
{ 
    lapply(
    as.list(exprs), 
    function(li) 
    { 
     # Load packages of functions accessed by :: or ::: 
     if(is.call(li) && grepl("^:{2,3}$", deparse(li[[1]]))) 
     { 
     library(deparse(li[[2]]), character.only = TRUE) 
     } 
     if(is.name(li)) 
     { 
     name_of_obj <- deparse(li) 
     obj <- mget(
      name_of_obj, 
      mode = "function", 
      ifnotfound = NA_character_, 
      inherits = TRUE 
     )[[1]] 
     location <- find(name_of_obj) 
     if(!is.na(name_of_obj) && 
      is.function(obj) && 
      grepl("^[[:alpha:]]", name_of_obj) && 
      grepl("^package:", location)) 
     { 
      return(
      paste0(
       "\\index{", 
       knitr:::escape_latex(name_of_obj), 
       " function (", 
       substring(location, 9), 
       ")}" 
      ) 
     ) 
     } 
     return(NULL) 
     } 
     if(!is.language(li)) return(NULL) 
     create_index_entry_from_expressions(li) 
    } 
) 
} 

このフックは、チャンクオプションとしてindexit = TRUEを持っているすべてのチャンクのために、.texファイルにインデックス・エントリのテキストを追加します。ドキュメントの早い段階で定義してください。

knitr::knit_hooks$set(indexit = function(before, options, envir) { 
    if (before) { 
    exprs <- parse(text = options$code) 
    result <- create_index_entry_from_expressions(exprs) 
    unlist(result, use.names = FALSE) 
    } 
}) 
関連する問題