Dear R devel, being constrained to a windows environment at work and having colleagues being accustomed to the Microsoft Office Suite, I was looking for a way to have the RweaveLatex driver for Sweave automatically generating 'win.metafile's in addition to the pdf graphics. Without this functionalilty, the generation of emf-graphics is quite laborious, I think:
<<>>= plotit <- function () { # code which generates the graphic } win.metafile("foobar.emf") plotit() dev.off() pdf("foobar.pdf") plotit() dev.off() @ \includegraphics{foobar} I would like to have something like: <<foobar, fig=true, pdf=true, emf=true>> # code which generates the graphic @ SweaveHooks are not applicable for this feature. Therefore, I thought it would be best to extend the typical 'RweaveLatex' driver by an option 'emf' - like eps and pdf. So, here is the result of some handicrafts: RweaveLatexEMF <- function () { # add option emf (= FALSE) and set default for eps to FALSE setup <- utils::RweaveLatexSetup setupsrc <- deparse(setup) epsline <- grep("eps", setupsrc) setupsrc[epsline] <- sub("eps = TRUE", "eps = FALSE, emf = FALSE", setupsrc[epsline]) setup <- eval(parse(text=setupsrc)) # 'makeRweaveLatexCodeRunner' function makeruncode <- function(evalFunc=utils::RweaveEvalWithOpt) { runcode <- utils:::RweaveLatexRuncode runcodesrc <- deparse(runcode) epsline1 <- grep("cat(.. eps..)", runcodesrc) runcodesrc <- append(runcodesrc, " if (options$emf) cat(\" emf\")", after=epsline1) epsline2 <- grep("options\\$fig && options\\$eval", runcodesrc) runcodesrc <- append(runcodesrc, deparse(quote( if (options$emf && .Platform$OS.type == "windows") { grDevices::win.metafile(file=paste(chunkprefix, "emf", sep="."), width=options$width, height=options$height) err <- try({SweaveHooks(options, run=TRUE) eval(chunkexps, envir=.GlobalEnv)}) grDevices::dev.off() if(inherits(err, "try-error")) stop(err) } )) , after=epsline2) runcode <- eval(parse(text=runcodesrc)) } runcode <- makeruncode() list(setup = setup, runcode = runcode, writedoc = utils::RweaveLatexWritedoc, finish = utils::RweaveLatexFinish, checkopts = utils::RweaveLatexOptions) } This enhanced Sweave driver works for me like a charm, but it is a very poor solution. What about allowing for all available grDevices on the current platform - besides the standard eps and pdf devices? The only building block is the section "if (options$fig && options$eval)" in utils:::makeRweaveLatexCodeRunner. The TODO list of Seth Falcon's weaver package also states "For Sweave: multiple graphic formats besides just pdf and eps (perhaps as a separate driver?)". However, since so many packages depend on the basic Sweave implementation by Fritz Leisch, I don't know if there is an easy route to tackle. Looking forward to your opinions and pointers. Best regards, Sebastian Meyer ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel