knitr sanitize_fn предупреждение о включении графиков в латекс через knit2pdf - PullRequest
0 голосов
/ 10 мая 2018

Я динамически генерирую отчеты в формате PDF в R, используя скрипт драйвера, который вызывает knit2pdf.Мой источник отчетов - латекс, в файле .Rnw, и вызов такой:

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 knitr генерируется следующее предупреждение:

точек в путях к рисункам заменены на _ ("work / fname_pdfplot")

Понятно, обидел.исходит из файла file в opts_chunk.Однако, если я изменю этот fileext на «_pdf», я вообще не получу график в отчете, и латекс выдаст ошибку о том, что файл (fname_pdfplot-1) не найден.

Идеи включеныкак (а) сделать это правильно, чтобы не было предупреждения, или (б) сделать это, как я делаю, но подавить это конкретное предупреждение?

Редактировать 1:

Вот рабочий пример source.Rnw без использования fileext.Похоже, что это ближе, потому что теперь это обрывается с ошибкой из-за того, что work \ fname ... помещается в includegraphics, а не в 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 \ fname61c28cd1a0awkld-1.pdf создан правильно, но сгенерированный текст имеет:

{\centering \includegraphics[width=\maxwidth]{work\fname61c28cd1a0awkld-1} 

}

и, следовательно, не находит его.

1 Ответ

0 голосов
/ 14 мая 2018

Похоже, что исключение fileext работает (и, вероятно, также установит его в _pdf) для удаления предупреждения.

Также необходимо было заменить \, сгенерированный tempfile, на /, чтобы предотвратить другое предупреждениеиз сгенерированного вызова includegraphics, как где-то в цепочке, \ был оценен до.Это сработало:

opts_chunk$set(fig.path = gsub('\\\\','/',tempfile(tmpdir="work",pattern=fname)))

Спасибо, что помогли мне отследить это.

...