2014-07-19 2 views
2

Rnw/LaTeX에서는 knitr 후크의 공통 출력을 사용하여 청크의 데이터를 장식 할 수 있습니다.
예를 들어, 청크에 고유 한 코드는 테이블의 핵심 데이터를 생성 할 수 있으며 반복적 인 장식을 제공하기 전후의 후크 코드를 생성합니다.Knitr asis가 후크의 출력과 함께 작동하지 않습니다.

\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 환경에서는 3 조각을 함께 붙이지 않습니다.

어떻게 동봉 된 kframe을 제거 할 수 있습니까?

답변

2

나는이 문제에 대한 우아한 해결책이 없습니다. 다음은 가능한 해결책 중 하나입니다.

\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} 
+0

한 덕분에,이 문제를 해결 : 기본 개념은 출력이 results == 'asis'이 어떤 소스 코드가 에코되지 않으며, 더 플롯 코드 청크에서 생산되지 않은 경우 chunk 훅 교체하는 것입니다. 나는 이것이 공유 된 필요라는 것을 깨달았다. [yihui.name/knitr/hooks#comment-1339608701](http://yihui.name/knitr/hooks#comment-1339608701). 바라건대 단일 덩어리 고리에서 곧바로 kframes를 우회 할 가능성은 곧 출시 될 knitr 버전의 기능이 될 것입니다. – antonio

관련 문제