[Tex/LaTex] knit() doesn’t create .tex file with necessary preamble

knitrrstudio

I have a question about creating .tex from .Rnw using knitr in Rstudio.

I have a test.Rnw file while looks like the following:

\input{report_preamble_en.tex}

\title{test}
\author{author}

\begin{document}
\maketitle

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

\end{document}

Then in Rstudio, I create a test.tex file by calling the following R function:

knit('test.Rnw')

The following is the content of the test.tex file:

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

My question is that why this test.tex file doesn't include the necessary preamble shown below?

%\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}

This happens today for the first time. Usually, the above preamble codes would appear in the test.tex file, between \input{report_preamble_en.tex} and \title{test}.

In Rstuido, I use xelatex.

I am not sure if this is relevant but I updated my Mac OS to Yosemite and reinstalled Rstudio to solve the problem that Tex is not found.

Best Answer

knit() relies on knit_patterns to insert things into a document as it is being processed. The default patterns that knitr relies on are defined in the list all_patterns, which you can view by just typing all_patterns into an R session (assuming you have loaded knitr).

If you do this, you will see the following somewhere in the output.

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

In short, this is needed so that knitr knows where to put its default preamble for a .tex file.

To quote from Yihui's website for knitr:

header.begin: the pattern to find out where the document header begins; this is used to insert some header information into the output document (e.g. commands in the preamble in LaTeX, or CSS styles in HTML)

So, in order to get the correct output in test.tex, you need to make sure that your .Rnw file has a declared \documentclass{} in it.

Of course, you can change this if you want to by using knit_patterns$set().

So if you want to always use \input{report_preamble_en.tex} as your $tex$header.begin, then you can do the following to knit() the file:

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