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 onknit_patterns
to insert things into a document as it is being processed. The default patterns thatknitr
relies on are defined in the listall_patterns
, which you can view by just typingall_patterns
into an R session (assuming you have loadedknitr
).If you do this, you will see the following somewhere in the output.
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
: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 toknit()
the file: