在 Rnw/LaTeX 中,knitr hooks 的常见输出的一种用途可能是用一些奇特的环境来装饰来自 block 的数据。
例如,特定于 block 的代码可以生成表的核心数据,并且前后的钩子(Hook)代码提供重复的装饰。
考虑以下代码片段:
\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}
Hook 代码实际上并不是 asis,但它被包装在 kframe
环境中,从而防止将三个部分粘合在一起。
我们如何删除封闭的kframe
?
最佳答案
对于这个问题我没有一个优雅的解决方案。以下是一种可能的解决方案。基本思想是当 results == 'asis'
时替换输出钩子(Hook) chunk
,没有源代码回显,并且代码块中不生成任何绘图:
\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}
关于r - Knit asis 不适用于钩子(Hook)的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24845731/