R/latex.R

Defines functions SubfigureGenerator

Documented in SubfigureGenerator

#' Generate LaTeX subfigure code
#'
#' Generate LaTeX subfigure code for a bunch of supplied image paths,
#' subcaptions, label and subfigure layout.
#' Supports splitting the figures over several pages or using landscape layout.
#'
#' @param images        vector with full paths to images (png-files or other LaTeX-compatible format)
#'                      to be put in a LaTeX subfigure environment
#' @param subcaptions   vector with subcaptions for each subfigure
#' @param mainlabel     string with LaTeX label for the main figure environment
#'                      should be set individually if SubfigureGenerator() is called more than once from the same document
#' @param perpage       maximum number of images on one page, one A4 page fits six images with subcaptions
#' @param ncol          LaTeX subfigure is setup with ncol columns
#' @param landscape     set this to TRUE if pages are set in landscape mode
#'
#' @return a string with LaTeX code
#' @export
SubfigureGenerator <- function(images,
                               subcaptions,
                               mainlabel = "fig:mainfig",
                               perpage = 6,
                               ncol = 2,
                               landscape = FALSE) {
   # Collect all LaTeX code in a textconnection
   # that's dumped to a vector before return
   zzstring <- ""
   zz <- textConnection("zzstring", "w")

   # If landscape is TRUE, set pagewidth to \textheight
   #    pagewidth <- ifelse(landscape == TRUE, "\\textheight", "\\textwidth")
   pagewidth <- "\\textwidth"

   # Check that the vector of images is non-empty
   if (length(images) > 0) {
      # keep track of the number of pages the images are split across
      page.counter <- 1
      # Calculate width of subfigure based on ncol-value
      subfigure.width <- 1 / ncol - 0.02

      # begin figure
      if (landscape == TRUE) {
         cat("\\begin{sidewaysfigure}\\centering\n", file = zz)
      } else {
         cat("\\begin{figure}[hb]\\centering\n", file = zz)
      }

      # display images in a X-by-Y grid
      for (i in 1:length(images)) {
         cat(paste("\\begin{subfigure}[b]{", round(subfigure.width, 2),
                   pagewidth, "}\\centering\n", sep = ""), file = zz)
         # this includes the i-th image in a subfigure
         cat(paste("\\includegraphics[width=\\linewidth]{",
                   images[i], "}\n", sep = ""), file = zz)
         cat(paste("\\caption{", subcaptions[i],
                   "}\n", sep = ""), file = zz)
         cat(paste("\\label{", mainlabel, ":sfig-", int2padstr(ii = i, pchr = "0", w = 3),
                   "}\n", sep = ""), file = zz)
         cat("\\end{subfigure}", file = zz)
         #
         if (!(i %% (perpage)) && length(images) != (perpage*page.counter)) {
            cat("\\caption{Main figure caption.}\n", file = zz)
            cat(paste("\\label{", mainlabel, "-",
                      int2padstr(ii = page.counter, pchr = "0", w = 3),
                      "}\n", sep = ""), file = zz)
            if (landscape == TRUE) {
               cat("\\end{sidewaysfigure}\n", file = zz)
            } else {
               cat("\\end{figure}\n", file = zz)
            }
            cat("\n", file = zz)
            if (landscape == TRUE) {
               cat("\\begin{sidewaysfigure}\\centering\n", file = zz)
            } else {
               cat("\\begin{figure}[tb]\\centering\n", file = zz)
            }
            # Step-up page.counter
            page.counter <- page.counter + 1
         } else {
            if (i %% ncol) {
               # odd number -- add inter-column space
               cat("\\,\n", file = zz)
            }
            if (!(i %% ncol)) {
               # even number -- add newline and some vspace
               cat("\\\\[6pt]\n", file = zz)
            }
         }
      }
      #
      # end figure
      cat("\\caption{Main caption.}\n", file = zz)
      cat(paste("\\label{", mainlabel, "-",
                int2padstr(ii= page.counter, pchr = "0", w = 3),
                "}\n", sep = ""), file = zz)
      if (landscape == TRUE) {
         cat("\\end{sidewaysfigure}\n", file = zz)
      } else {
         cat("\\end{figure}\n", file = zz)
      }
   }

   zzstring <- textConnectionValue(zz)
   close(zz)
   return(zzstring)
}
chepec/R-common documentation built on July 27, 2023, 11:33 a.m.