knit() 不会创建带有必要前言的 .tex 文件

knit() 不会创建带有必要前言的 .tex 文件

我对在 Rstudio 中使用 knitr 从 .Rnw 创建 .tex 有疑问。

我有一个 test.Rnw 文件,如下所示:

\input{report_preamble_en.tex}

\title{test}
\author{author}

\begin{document}
\maketitle

test
<<cache=TRUE>>=
a = 1
@

\end{document}

然后在 Rstudio 中,我通过调用以下 R 函数创建一个 test.tex 文件:

knit('test.Rnw')

以下是test.tex文件的内容:

\input{report_preamble_en.tex}

\title{test}
\author{author}

\begin{document}
\maketitle

test
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{a} \hlkwb{=} \hlnum{1}
\end{alltt}
\end{kframe}
\end{knitrout}

\end{document}

我的问题是为什么这个 test.tex 文件不包含下面显示的必要前言?

%\documentclass{article}\usepackage[]{graphicx}\usepackage[]{color}
%% maxwidth is the original width if it is less than linewidth
%% otherwise use linewidth (to make sure the graphics do not exceed the margin)
\makeatletter
\def\maxwidth{ %
  \ifdim\Gin@nat@width>\linewidth
    \linewidth
  \else
    \Gin@nat@width
  \fi
}
\makeatother

\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345}
\newcommand{\hlnum}[1]{\textcolor[rgb]{0.686,0.059,0.569}{#1}}%
\newcommand{\hlstr}[1]{\textcolor[rgb]{0.192,0.494,0.8}{#1}}%
\newcommand{\hlcom}[1]{\textcolor[rgb]{0.678,0.584,0.686}{\textit{#1}}}%
\newcommand{\hlopt}[1]{\textcolor[rgb]{0,0,0}{#1}}%
\newcommand{\hlstd}[1]{\textcolor[rgb]{0.345,0.345,0.345}{#1}}%
\newcommand{\hlkwa}[1]{\textcolor[rgb]{0.161,0.373,0.58}{\textbf{#1}}}%
\newcommand{\hlkwb}[1]{\textcolor[rgb]{0.69,0.353,0.396}{#1}}%
\newcommand{\hlkwc}[1]{\textcolor[rgb]{0.333,0.667,0.333}{#1}}%
\newcommand{\hlkwd}[1]{\textcolor[rgb]{0.737,0.353,0.396}{\textbf{#1}}}%

\usepackage{framed}
\makeatletter
\newenvironment{kframe}{%
 \def\at@end@of@kframe{}%
 \ifinner\ifhmode%
  \def\at@end@of@kframe{\end{minipage}}%
  \begin{minipage}{\columnwidth}%
 \fi\fi%
 \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep
 \colorbox{shadecolor}{##1}\hskip-\fboxsep
     % There is no \\@totalrightmargin, so:
     \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
 \MakeFramed {\advance\hsize-\width
   \@totalleftmargin\z@ \linewidth\hsize
   \@setminipage}}%
 {\par\unskip\endMakeFramed%
 \at@end@of@kframe}
\makeatother

\definecolor{shadecolor}{rgb}{.97, .97, .97}
\definecolor{messagecolor}{rgb}{0, 0, 0}
\definecolor{warningcolor}{rgb}{1, 0, 1}
\definecolor{errorcolor}{rgb}{1, 0, 0}
\newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX

\usepackage{alltt}

今天第一次出现这种情况。通常,上述前导代码会出现在 test.tex 文件中的\input{report_preamble_en.tex}和之间\title{test}

在 Rstuido 中,我使用 xelatex。

我不确定这是否相关,但我将我的 Mac OS 更新到 Yosemite 并重新安装了 Rstudio 以解决找不到 Tex 的问题。

答案1

knit()依赖于knit_patterns在处理文档时插入内容。knitr依赖于的默认模式在列表中定义all_patterns,您只需all_patterns在 R 会话中键入即可查看(假设您已加载knitr)。

如果你这样做,你会在输出的某处看到以下内容。

$tex$header.begin
[1] "(^|\n)[^%]*\\s*\\\\documentclass[^}]+\\}"

简而言之,这是必需的,以便knitr知道将文件的默认前导码放在哪里.tex

引自Yihui 的网站knitr

header.begin:查找文档标题开始位置的模式;这用于将一些标题信息插入到输出文档中(例如 LaTeX 序言中的命令或 HTML 中的 CSS 样式)

因此,为了获得正确的输出test.tex,您需要确保您的文件中.Rnw有一个声明。\documentclass{}

当然,如果您愿意,您可以使用来更改这一点knit_patterns$set()

因此,如果您想始终将其用作\input{report_preamble_en.tex}您的,那么您可以对文件$tex$header.begin执行以下操作:knit()

library(knitr)
knit_patterns$set(header.begin = "(^|\n)[^%]*\\s*\\\\input\\{report_preamble_en.tex+\\}")
knit('test.Rnw')

相关内容