| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- require(utils)
- RweaveOrg = function () {
- list(setup = RweaveOrgSetup, runcode = RweaveOrgRuncode,
- writedoc = RweaveOrgWritedoc, finish = RweaveOrgFinish,
- checkopts = RweaveOrgOptions)
- }
- RweaveOrgSetup <-
- function (file, syntax, output = NULL, quiet = FALSE, debug = FALSE,
- echo = TRUE, eval = TRUE, keep.source = FALSE, split = FALSE,
- stylepath, pdf = TRUE, eps = TRUE) {
- if (is.null(output)) {
- prefix.string <- basename(sub(syntax$extension, "", file))
- output <- paste(prefix.string, "org", sep = ".")
- }
- else prefix.string <- basename(sub("\\.org$", "", output))
- if (!quiet)
- cat("Writing to file ", output, "\n", "Processing code chunks ...\n",
- sep = "")
- output <- file(output, open = "w+")
- if (missing(stylepath)) {
- p <- as.vector(Sys.getenv("SWEAVE_STYLEPATH_DEFAULT"))
- stylepath <- if (length(p) >= 1 && nzchar(p[1]))
- identical(p, "TRUE")
- else TRUE
- }
- if (stylepath) {
- styfile <- file.path(R.home("share"), "texmf", "Sweave")
- if (.Platform$OS.type == "windows")
- styfile <- gsub("\\\\", "/", styfile)
- if (length(grep(" ", styfile)))
- warning(gettextf("path to '%s' contains spaces,\n",
- styfile), gettext("this may cause problems when running LaTeX"),
- domain = NA)
- }
- else styfile <- "Sweave"
- options <- list(prefix = TRUE, prefix.string = prefix.string,
- engine = "R", print = FALSE, eval = eval, fig = FALSE,
- pdf = pdf, eps = eps, width = 6, height = 6, term = TRUE,
- echo = echo, keep.source = keep.source, results = "verbatim",
- split = split, strip.white = "true", include = TRUE,
- pdf.version = "1.1", pdf.encoding = "default", concordance = FALSE,
- expand = TRUE)
- options <- RweaveOrgOptions(options)
- list(output = output, styfile = styfile, havesty = FALSE,
- haveconcordance = FALSE, debug = debug, quiet = quiet,
- syntax = syntax, options = options, chunkout = list(),
- srclines = integer(0), srcfile = srcfile(file))
- }
- makeRweaveOrgCodeRunner <-
- function (evalFunc = RweaveEvalWithOpt)
- {
- RweaveOrgRuncode <- function(object, chunk, options) {
- if (!(options$engine %in% c("R", "S"))) {
- return(object)
- }
- if (!object$quiet) {
- cat(formatC(options$chunknr, width = 2), ":")
- if (options$echo)
- cat(" echo")
- if (options$keep.source)
- cat(" keep.source")
- if (options$eval) {
- if (options$print)
- cat(" print")
- if (options$term)
- cat(" term")
- cat("", options$results)
- if (options$fig) {
- if (options$eps)
- cat(" eps")
- if (options$pdf)
- cat(" pdf")
- }
- }
- if (!is.null(options$label))
- cat(" (label=", options$label, ")", sep = "")
- cat("\n")
- }
- chunkprefix <- RweaveChunkPrefix(options)
- if (options$split) {
- chunkout <- object$chunkout[chunkprefix][[1]]
- if (is.null(chunkout)) {
- chunkout <- file(paste(chunkprefix, "tex", sep = "."),
- "w")
- if (!is.null(options$label))
- object$chunkout[[chunkprefix]] <- chunkout
- }
- }
- else chunkout <- object$output
- saveopts <- options(keep.source = options$keep.source)
- on.exit(options(saveopts))
- SweaveHooks(options, run = TRUE)
- chunkexps <- try(parse(text = chunk), silent = TRUE)
- RweaveTryStop(chunkexps, options)
- openSinput <- FALSE
- openSchunk <- FALSE
- if (length(chunkexps) == 0)
- return(object)
- srclines <- attr(chunk, "srclines")
- linesout <- integer(0)
- srcline <- srclines[1]
- srcrefs <- attr(chunkexps, "srcref")
- if (options$expand)
- lastshown <- 0
- else lastshown <- srcline - 1
- thisline <- 0
- for (nce in 1:length(chunkexps)) {
- ce <- chunkexps[[nce]]
- if (nce <= length(srcrefs) && !is.null(srcref <- srcrefs[[nce]])) {
- if (options$expand) {
- srcfile <- attr(srcref, "srcfile")
- showfrom <- srcref[1]
- showto <- srcref[3]
- }
- else {
- srcfile <- object$srcfile
- showfrom <- srclines[srcref[1]]
- showto <- srclines[srcref[3]]
- }
- dce <- getSrcLines(srcfile, lastshown + 1, showto)
- leading <- showfrom - lastshown
- lastshown <- showto
- srcline <- srclines[srcref[3]]
- while (length(dce) && length(grep("^[[:blank:]]*$",
- dce[1]))) {
- dce <- dce[-1]
- leading <- leading - 1
- }
- }
- else {
- dce <- deparse(ce, width.cutoff = 0.75 * getOption("width"))
- leading <- 1
- }
- if (object$debug)
- cat("\nRnw> ", paste(dce, collapse = "\n+ "),
- "\n")
- if (options$echo && length(dce)) {
- if (!openSinput) {
- if (!openSchunk) {
- cat("#+BEGIN_LaTeX\n", file = chunkout, append = TRUE)
- cat("\\begin{Schunk}\n", file = chunkout, append = TRUE)
- linesout[thisline + 1:2] <- srcline
- thisline <- thisline + 2
- openSchunk <- TRUE
- }
- cat("\\begin{Sinput}", file = chunkout, append = TRUE)
- openSinput <- TRUE
- }
- cat("\n", paste(getOption("prompt"), dce[1:leading],
- sep = "", collapse = "\n"), file = chunkout,
- append = TRUE, sep = "")
- if (length(dce) > leading)
- cat("\n", paste(getOption("continue"), dce[-(1:leading)],
- sep = "", collapse = "\n"), file = chunkout,
- append = TRUE, sep = "")
- linesout[thisline + 1:length(dce)] <- srcline
- thisline <- thisline + length(dce)
- }
- tmpcon <- file()
- sink(file = tmpcon)
- err <- NULL
- if (options$eval)
- err <- evalFunc(ce, options)
- cat("\n")
- sink()
- output <- readLines(tmpcon)
- close(tmpcon)
- if (length(output) == 1 & output[1] == "")
- output <- NULL
- RweaveTryStop(err, options)
- if (object$debug)
- cat(paste(output, collapse = "\n"))
- if (length(output) > 0 & (options$results != "hide")) {
- if (openSinput) {
- cat("\n\\end{Sinput}\n", file = chunkout, append = TRUE)
- linesout[thisline + 1:2] <- srcline
- thisline <- thisline + 2
- openSinput <- FALSE
- }
- if (options$results == "verbatim") {
- if (!openSchunk) {
- cat("#+BEGIN_LaTeX\n", file = chunkout, append = TRUE)
- cat("\\begin{Schunk}\n", file = chunkout,
- append = TRUE)
- linesout[thisline + 1:2] <- srcline
- thisline <- thisline + 2
- openSchunk <- TRUE
- }
- cat("\\begin{Soutput}\n", file = chunkout,
- append = TRUE)
- linesout[thisline + 1] <- srcline
- thisline <- thisline + 1
- }
- output <- paste(output, collapse = "\n")
- if (options$strip.white %in% c("all", "true")) {
- output <- sub("^[[:space:]]*\n", "", output)
- output <- sub("\n[[:space:]]*$", "", output)
- if (options$strip.white == "all")
- output <- sub("\n[[:space:]]*\n", "\n", output)
- }
- cat(output, file = chunkout, append = TRUE)
- count <- sum(strsplit(output, NULL)[[1]] == "\n")
- if (count > 0) {
- linesout[thisline + 1:count] <- srcline
- thisline <- thisline + count
- }
- remove(output)
- if (options$results == "verbatim") {
- cat("\n\\end{Soutput}\n", file = chunkout,
- append = TRUE)
- linesout[thisline + 1:2] <- srcline
- thisline <- thisline + 2
- }
- }
- }
- if (openSinput) {
- cat("\n\\end{Sinput}\n", file = chunkout, append = TRUE)
- linesout[thisline + 1:2] <- srcline
- thisline <- thisline + 2
- }
- if (openSchunk) {
- cat("\\end{Schunk}\n", file = chunkout, append = TRUE)
- cat("#+END_LaTeX\n", file = chunkout, append = TRUE)
- linesout[thisline + 1:2] <- srcline
- thisline <- thisline + 2
- }
- if (is.null(options$label) & options$split)
- close(chunkout)
- if (options$split & options$include) {
- cat("#+LaTeX: \\input{", chunkprefix, "}\n", sep = "", file = object$output,
- append = TRUE)
- linesout[thisline + 1] <- srcline
- thisline <- thisline + 1
- }
- if (options$fig && options$eval) {
- if (options$eps) {
- grDevices::postscript(file = paste(chunkprefix,
- "eps", sep = "."), width = options$width, height = options$height,
- paper = "special", horizontal = FALSE)
- err <- try({
- SweaveHooks(options, run = TRUE)
- eval(chunkexps, envir = .GlobalEnv)
- })
- grDevices::dev.off()
- if (inherits(err, "try-error"))
- stop(err)
- }
- if (options$pdf) {
- grDevices::pdf(file = paste(chunkprefix, "pdf",
- sep = "."), width = options$width, height = options$height,
- version = options$pdf.version, encoding = options$pdf.encoding)
- err <- try({
- SweaveHooks(options, run = TRUE)
- eval(chunkexps, envir = .GlobalEnv)
- })
- grDevices::dev.off()
- if (inherits(err, "try-error"))
- stop(err)
- }
- if (options$include) {
- chunksuffix <- ifelse(options$eps, "eps", "pdf")
- cat("[[./", paste(chunkprefix, chunksuffix, sep = "."), "]]\n",
- sep = "", file = object$output, append = TRUE)
- linesout[thisline + 1] <- srcline
- thisline <- thisline + 1
- }
- }
- object$linesout <- c(object$linesout, linesout)
- return(object)
- }
- RweaveOrgRuncode
- }
- RweaveOrgRuncode <- makeRweaveOrgCodeRunner()
- RweaveOrgWritedoc <-
- function (object, chunk) {
- linesout <- attr(chunk, "srclines")
- ## This part of the function adds the appropriate \usepackage
- ## directive and begins the document. Skip this for now, but
- ## eventually add in detection for #+LATEX_PREAMBLE
- ### if (length(grep("\\usepackage[^\\}]*Sweave.*\\}", chunk)))
- ### object$havesty <- TRUE
- ### if (!object$havesty) {
- ### begindoc <- "^[[:space:]]*\\\\begin\\{document\\}"
- ### which <- grep(begindoc, chunk)
- ### if (length(which)) {
- ### chunk[which] <- sub(begindoc, paste("\\\\usepackage{",
- ### object$styfile, "}\n\\\\begin{document}", sep = ""),
- ### chunk[which])
- ### linesout <- linesout[c(1:which, which, seq(from = which +
- ### 1, length.out = length(linesout) - which))]
- ### object$havesty <- TRUE
- ### }
- ### }
- while (length(pos <- grep(object$syntax$docexpr, chunk))) {
- cmdloc <- regexpr(object$syntax$docexpr, chunk[pos[1]])
- cmd <- substr(chunk[pos[1]], cmdloc, cmdloc + attr(cmdloc,
- "match.length") - 1)
- cmd <- sub(object$syntax$docexpr, "\\1", cmd)
- if (object$options$eval) {
- val <- as.character(eval(parse(text = cmd), envir = .GlobalEnv))
- if (length(val) == 0)
- val <- ""
- }
- else val <- paste("\\\\verb{<<", cmd, ">>{", sep = "")
- chunk[pos[1]] <- sub(object$syntax$docexpr, val, chunk[pos[1]])
- }
- while (length(pos <- grep(object$syntax$docopt, chunk))) {
- opts <- sub(paste(".*", object$syntax$docopt, ".*", sep = ""),
- "\\1", chunk[pos[1]])
- object$options <- SweaveParseOptions(opts, object$options,
- RweaveOrgOptions)
- if (isTRUE(object$options$concordance) && !object$haveconcordance) {
- savelabel <- object$options$label
- object$options$label <- "concordance"
- prefix <- RweaveChunkPrefix(object$options)
- object$options$label <- savelabel
- object$concordfile <- paste(prefix, "org", sep = ".")
- chunk[pos[1]] <- sub(object$syntax$docopt, paste("\\\\input{",
- prefix, "}", sep = ""), chunk[pos[1]])
- object$haveconcordance <- TRUE
- }
- else chunk[pos[1]] <- sub(object$syntax$docopt, "", chunk[pos[1]])
- }
- cat(chunk, sep = "\n", file = object$output, append = TRUE)
- object$linesout <- c(object$linesout, linesout)
- return(object)
- }
- RweaveOrgFinish <-
- function (object, error = FALSE) {
- outputname <- summary(object$output)$description
- inputname <- object$srcfile$filename
- if (!object$quiet && !error)
- cat("\n", gettextf("You can now run org-export-as-latex on '%s'", outputname),
- "\n", sep = "")
- close(object$output)
- if (length(object$chunkout) > 0)
- for (con in object$chunkout) close(con)
- if (object$haveconcordance) {
- linesout <- object$linesout
- vals <- rle(diff(linesout))
- vals <- c(linesout[1], as.numeric(rbind(vals$lengths,
- vals$values)))
- concordance <- paste(strwrap(paste(vals, collapse = " ")),
- collapse = " %\n")
- special <- paste("\\special{concordance:", outputname,
- ":", inputname, ":%\n", concordance, "}\n", sep = "")
- cat(special, file = object$concordfile)
- }
- invisible(outputname)
- }
- RweaveOrgOptions <- RweaveLatexOptions
|