2

在 Rnw/LaTeX 中,来自 knitr hooks 的常见输出的一种用途可能是用一些花哨的环境来装饰来自块的数据。
例如,特定于块的代码可以为表格生成核心数据,并且在提供重复修饰之前和之后的钩子代码。

考虑以下代码段:

\documentclass{article}
\begin{document}

<<myhooks,  include=FALSE>>=
printhook=function(before, options, envir) {
    if (before) {

        return('\nCommon R \\LaTeX\\ in before-hook')
    } else {
        return('\nCommon R \\LaTeX\\ in after-hook')
    }
}

knit_hooks$set(lprint = printhook)

@ 


<<test, results='asis', lprint=TRUE,  echo=FALSE>>=
cat("R \\LaTeX\\ in current chunk\n")
@ 

\end{document}

问题是 LaTeX 输出大致如下:

   \begin{kframe}
   Common R \LaTeX\ in before-hook
   \end{kframe}

   R \LaTeX\ in current chunk

   \begin{kframe}
   Common R \LaTeX\ in after-hook
   \end{kframe}

钩子代码实际上不是asis,但它被包装在kframe环境中,这可以防止将三个部分粘合在一起。

我们怎样才能删除封闭kframe

4

1 回答 1

2

对于这个问题,我没有一个优雅的解决方案。以下是一种可能的解决方案。chunk基本思想是在results == 'asis'没有回显源代码并且代码块中没有生成图的情况下替换输出钩子:

\documentclass{article}
\begin{document}

<<myhooks, include=FALSE>>=
local({
  hook_chunk = knit_hooks$get('chunk')
  knit_hooks$set(chunk = function(x, options) {
    x = hook_chunk(x, options)
    if (options$results == 'asis' && !options$echo && options$fig.num == 0) {
      # remove all kframe's
      gsub('\\\\(begin|end)\\{kframe\\}', '', x)
    } else x
  })
})
printhook=function(before, options, envir) {
    if (before) {
        return('\nCommon R \\LaTeX\\ in before-hook')
    } else {
        return('\nCommon R \\LaTeX\\ in after-hook')
    }
}
knit_hooks$set(lprint = printhook)
@

<<test, results='asis', lprint=TRUE,  echo=FALSE>>=
cat("R \\LaTeX\\ in current chunk\n")
@

\end{document}
于 2014-07-20T15:52:43.650 回答