在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
?
答案 0 :(得分: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}