knitr:如何将当前子Rnw文件的文件名放入latex头文件中

时间:2014-05-14 20:55:02

标签: r latex knitr

我正在写一本有多章的书,主book.Rnw档的所有孩子,每章都可以有 用于部分,示例等的多个子Rnw文件。为了便于在草稿文档中引用,在LateX头中显示当前子Rnw文件的路径名非常有用。

此问题跟进类似的问题,Need the filename of the Rnw when knitr runs in rStudio,建议使用类似

的内容
<<>>=
infile <- knitr:::knit_concord$get("infile")
@

然而,我一直无法使用knitr 自动这项工作,就像我在使用直接LaTeX时所做的那样。在那里,只要文件为\input{}\include{},就会自动更新全局LaTeX符号@filef@und。这允许使用前导码中的以下代码更新页眉:

%% Page Headings
\makeatletter
\usepackage{fancyhdr}
\pagestyle{fancy}
%
%% The next two lines are only for draft printing
\def\infoleft{\quad [{\small\ttfamily\@filef@und}]}
\def\inforight{[\number\month-\number\day-\number\year]\quad}
%
\renewcommand{\chaptermark}[1]{%
 \markboth{\thechapter\ #1}{}}
\renewcommand{\sectionmark}[1]{%
 \markright{\thesection\ #1}}
  \lhead[\fancyplain{}{\bfseries\sffamily\thepage}]%
  {\fancyplain{}{{\bfseries\sffamily\rightmark}\infoleft}}
  \rhead[\fancyplain{}{\inforight{\bfseries\sffamily\leftmark}}]%
  {\fancyplain{}{\bfseries\sffamily\thepage}}
\cfoot{}
\makeatother

我认为我正在寻找的是一个块挂钩,它将在全局R变量中记录子文档的路径名,然后使用gdefSexpr{}记录到LaTeX中。类似的东西:

<<ch02-ex1, child="ch02/ex1.Rnw">>=
@

触发类似下面的内容,提供infile = ch02/ex1.Rnw

<<>>=
infile <- knitr:::knit_concord$get("infile")
@

然后在.tex输出中插入如下内容。

\gdef\infile\Sexpr{infile}

1 个答案:

答案 0 :(得分:0)

而不是knitr:::knit_concord$get("infile"),我认为你现在应该使用current_input()。但是,你需要为第二部分编写一个简单的函数,即

setInfile <- function() cat("\\gdef\\infile ", current_input())

并在&#34; asis&#34;中拨打电话。在孩子的顶部块。 (我还没有尝试过这个;你可能需要对current_input()结果进行一些消毒,以便该行提供合法的LaTeX。你可能还需要父母的另一个电话来切换回来。