我正在使用knitr从一组.rnw
文件中生成投影仪类型的幻灯片。
我有两个问题:
我的\documentclass
和\begin{document}
语句位于子文件中,因此在knit(<myfile.R>)
处,knitr标头/前导插入两次(对于更深层的嵌套子节点,插入频率甚至更高)级)。
在这里,如果knit()
通过全局状态变量可以知道它是否已经将头插入到输出文件中,然后阻止头的后续插入,那就太好了。
在产生的.tex
文件中,我有一个切换机制(由\ifx
语句控制),该机制通过定义全局TeX变量来决定对\documentclass
的几次调用之间的不同选项-适用于2x2样式的讲义和1x1样式的讲义,以及投影仪样式的幻灯片。
对于\documentclass
替代方案中的每个\ifx
语句,我都需要提供knitR
序言,因此在这种情况下,如果可以重写标头的标准位置,即在输出文件中第一次出现\documentclass
之后,并在可选参数中告诉knit()
代替标头的位置,例如,使用( header.begin
中的length-0)个字符向量,在我的情况下,该向量将位于\ifx ... \fi
子句之外。在其他情况下,可能要完全抑制插入。
也许这已经可能了,但我根本没有找到它?
有什么想法吗?
我发现了一个丑陋的解决方法,但是应该有更好的解决方案,尤其是不建议摆弄别人的NAMESPACE ...
## R - Code
## make a local copy of knitr::all_patterns
.ALLPAT <- knitr::all_patterns
## overwrite the defaults with patterns which are never found
.ALLPAT$rnw$header.begin <- ";:;:;:;:;"
.ALLPAT$rnw$document.begin <- ";:;:;:;:;"
## effectively, then in (1) and (2), no headers get inserted
## instead, insert \usepackage{knitr} into <myfile>.Rnw where I want to have it
## temporarily overwrite knitr::all_patterns in NAMESPACE of knitr
assignInNamespace("all_patterns",.ALLPAT,"knitr")
## do knit("<myfile>.Rnw")
## restore default values:
.ALLPAT$rnw$document.begin <- '\\s*\\\\begin\\{document\\}'
.ALLPAT$rnw$header.begin <- '(^|\n)\\s*\\\\documentclass[^}]+\\}'
assignInNamespace("all_patterns",.ALLPAT,"knitr")
最诚挚的问候,彼得