如何阻止 knitr 添加基于 documentClass 的 tex 包?
How to stop knitr from adding tex packages based on documentClass?
例如,我有一个简单的最小 .Rnw 文件,如下所示:
<<setup, include=FALSE>>=
test = "test"
@
\documentclass{article}
\begin{document}
Test value is \Sexpr{test}
\end{document}
我只想用它编织来替换 Sexpr 变量,但它添加了一大堆基于文档类的序言。
我在有限的 docker 环境中工作,所以我在 tex 中没有这些包。
如何让 knitr 不添加所有预编码?
这是 knitr 的输出:
\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}}}%
\let\hlipl\hlkwb
\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}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\documentclass{article}
\begin{document}
Test value is test
\end{document}
不修改 knitr
代码就无法真正阻止它。一些额外的包被硬编码到 knitr:::make_header_latex
函数中,您可以在 https://github.com/yihui/knitr/blob/dccdad769b67a23d9cf8b8414f844e2a6a74f21e/R/header.R#L16 .
中看到
但是,有一些方法可以动态修改该函数,使用相当危险的 assignInNamespace
函数:
assignInNamespace("make_header_latex", function(...) "", "knitr")
在此之后,
knit("minimal.Rnw")
产生这个输出:
\documentclass{article}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\begin{document}
Test value is test
\end{document}
(upquote
行来自不同的函数,但它应该是安全的,因为 \IfFileExists
。)
如果你这样做要小心,因为我所做的更改将持续到你的 R 会话的其余部分。
编辑添加: 如果需要,可以将 assignInNamespace
行放入
文档中的代码块。如果您使用 RStudio 并通过单击 "Compile PDF" 编织文档,它将启动一个新的 R 会话,进行编织(这将替换函数),然后 运行 修补函数: 这样您就可以得到想要的效果,而不会在当前会话中弄乱 knitr
。
例如,我有一个简单的最小 .Rnw 文件,如下所示:
<<setup, include=FALSE>>=
test = "test"
@
\documentclass{article}
\begin{document}
Test value is \Sexpr{test}
\end{document}
我只想用它编织来替换 Sexpr 变量,但它添加了一大堆基于文档类的序言。
我在有限的 docker 环境中工作,所以我在 tex 中没有这些包。
如何让 knitr 不添加所有预编码?
这是 knitr 的输出:
\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}}}%
\let\hlipl\hlkwb
\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}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\documentclass{article}
\begin{document}
Test value is test
\end{document}
不修改 knitr
代码就无法真正阻止它。一些额外的包被硬编码到 knitr:::make_header_latex
函数中,您可以在 https://github.com/yihui/knitr/blob/dccdad769b67a23d9cf8b8414f844e2a6a74f21e/R/header.R#L16 .
但是,有一些方法可以动态修改该函数,使用相当危险的 assignInNamespace
函数:
assignInNamespace("make_header_latex", function(...) "", "knitr")
在此之后,
knit("minimal.Rnw")
产生这个输出:
\documentclass{article}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\begin{document}
Test value is test
\end{document}
(upquote
行来自不同的函数,但它应该是安全的,因为 \IfFileExists
。)
如果你这样做要小心,因为我所做的更改将持续到你的 R 会话的其余部分。
编辑添加: 如果需要,可以将 assignInNamespace
行放入
文档中的代码块。如果您使用 RStudio 并通过单击 "Compile PDF" 编织文档,它将启动一个新的 R 会话,进行编织(这将替换函数),然后 运行 修补函数: 这样您就可以得到想要的效果,而不会在当前会话中弄乱 knitr
。