我正在使用调用knit2pdf的驱动程序脚本动态生成R中的pdf报告。我的报告源是.Rnw文件中的latex,调用如下:
knit2pdf("source.Rnw",output=paste0(fname,".tex"),quiet=T)fname不包含任何点。
source.Rnw包含:
<<setup, echo=FALSE >>=
opts_chunk$set(fig.path=tempfile(tmpdir="work",pattern=fname,fileext=".pdf"))
@
<<custom-dev, echo=FALSE >>=
my_pdf<-function(file,width,height) {
pdf(file,width=5,height=2)
}
@
<<plot, echo=FALSE, results="asis", dev="my_pdf", fig.ext="pdf">>=
# A ggplot chart
print(g)
@这些报告都很好,但是下面的警告是从sanitize_fn中生成的:
图路径中的点替换为_ ("work/fname_pdfplot")
很明显,冒犯。来自opts_chunk中的fileext。但是,如果我将该fileext更改为"_pdf",则报告中根本没有得到这个图,而latex会抛出一个文件(fname_pdfket-1)没有找到的错误。
关于如何(a)正确地做到这一点,所以没有警告,或者(b)这样做,就像我这样做,但压制这个特别的警告?
编辑1:
这里是一个不使用fileext的source.Rnw的工作示例。这似乎更接近了,因为现在由于放置work\fname而出现错误.在包含图形(而不是work/fname)中.,如果我将反斜杠更改为适当的斜杠,则编译非常干净。
tempfile正在返回work\fname.,所以我的修复方法可能只是重新转义那些反斜杠(或者用正斜杠替换它们)。这是不是我早就该知道的事了?
\documentclass[titlepage]{article}
\usepackage[utf8]{inputenc}
\usepackage[headheight=36pt, foot=24pt, top=1in, bottom=1in, left=1in, right=1in, landscape]{geometry}
\usepackage{hyperref}
\usepackage{bookmark}
\usepackage{fancyhdr}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{float}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{microtype}
\usepackage{libertine}
\usepackage{parskip}
\usepackage{environ}
\usepackage{preview}
\usepackage[labelformat=empty]{caption}
\usepackage{amssymb}
\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage{picture}
\usepackage{needspace}
\usepackage{adjustbox}
\usepackage{graphicx}
\pagestyle{fancy}
\raggedbottom
\renewcommand\familydefault{\sfdefault}
\newcommand{\helv}{%
\fontfamily{phv}\fontseries{m}\fontsize{8}{10}\selectfont}
\newcommand{\mycopyright}{\helv Copyright.}
\cfoot{\mycopyright}
\rhead{\textbf{\Sexpr{firstname} \Sexpr{lastname}} \\ \Sexpr{oafr} to \Sexpr{eoafr} \\ Page \thepage}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
\fancypagestyle{fancytitlepage}
{
\fancyhf{}
\cfoot{\mycopyright}
\rhead{}
\renewcommand{\headrulewidth}{0pt}
}
\linespread{1.2}
\usepackage{sectsty}
\allsectionsfont{\sffamily}
\partfont{\centering}
\makeatletter
\newcommand{\sectbox}[1]{%
\noindent\protect\colorbox{gray!40}{%
\@tempdima=\hsize
\advance\@tempdima by-2\fboxsep
\advance\@tempdima by-2\fboxrule
\protect\parbox{\@tempdima}{%
\smallskip
% extra commands here
\centering
#1\smallskip
}}}
\newcommand{\subsectbox}[1]{%
\noindent\protect\colorbox{gray!20}{%
\@tempdima=\hsize
\advance\@tempdima by-2\fboxsep
\advance\@tempdima by-2\fboxrule
\protect\parbox{\@tempdima}{%
\smallskip
% extra commands here
#1\smallskip
}}}
\makeatother
\sectionfont{\sectbox}
\subsubsectionfont{\subsectbox}
\makeatletter
\newcommand\cellwidth{\TX@col@width}
\makeatother
\newlength\foo
\NewEnviron{recipe}{%
\begin{adjustbox}{minipage=\linewidth,gstore totalheight=\foo, gobble}
\BODY
\end{adjustbox}
\needspace{\foo}
\BODY%
}
<<setup, echo=FALSE >>=
opts_chunk$set(fig.path = tempfile(tmpdir="work",pattern=fname))
@
\hyphenpenalty=100000
\begin{document}
\raggedbottom
\setlength{\parskip}{0pt}
<<custom-dev,echo=FALSE>>=
wkld_pdf<-function(file,width,height) {
pdf(file,width=5,height=2)
}
@
<<wkld, echo=FALSE, results='asis',fig.align="center",dev="wkld_pdf",fig.ext="pdf">>=
if (!is.na(wkld.team) | !is.na(wkld.res)) {
g<-pltr$workload.chart(wkld.team,wkld.res,firstname)
print(g)
}
@
\end{document}在上面的示例中,正确地创建了文件work\fname61c28cd1a0尴尬-1.pdf,但是生成的tex有:
{\centering \includegraphics[width=\maxwidth]{work\fname61c28cd1a0awkld-1}
}因此找不到它。
发布于 2018-05-14 16:12:16
似乎忽略fileext是有效的(并且很可能将其设置为_pdf )来删除警告。
还需要用一个/替换由tempfile生成的\,以防止从生成的包含图形调用中发出另一个警告,就像在链中的某个位置,\被计算到。这样做是有效的:
opts_chunk$set(fig.path = gsub('\\\\','/',tempfile(tmpdir="work",pattern=fname)))谢谢你帮我找到那个。
https://stackoverflow.com/questions/50278630
复制相似问题