由knitr用户控制的.rnw文件的标头/前导插入

时间:2019-03-15 22:51:54

标签: r latex knitr

我正在使用knitr从一组.rnw文件中生成投影仪类型的幻灯片。

我有两个问题:

  1. 我的\documentclass\begin{document}语句位于子文件中,因此在knit(<myfile.R>)处,knitr标头/前导插入两次(对于更深层的嵌套子节点,插入频率甚至更高)级)。

    在这里,如果knit()通过全局状态变量可以知道它是否已经将头插入到输出文件中,然后阻止头的后续插入,那就太好了。

  2. 在产生的.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")

最诚挚的问候,彼得

0 个答案:

没有答案