]> git.donarmstrong.com Git - xtable.git/commitdiff
Merge branch 'master' into repeat_caption_in_longtable repeat_caption_in_longtable
authorDon Armstrong <don@donarmstrong.com>
Mon, 5 Dec 2016 22:18:18 +0000 (14:18 -0800)
committerDon Armstrong <don@donarmstrong.com>
Mon, 5 Dec 2016 22:18:18 +0000 (14:18 -0800)
1  2 
pkg/R/print.xtable.R

index d748924366c5a4ecc434a8aa92eb2e7309e9b7da,ce9c7bc52d0cae77f0f0860d9655b21012f0e4dd..aa1079dd73369d2c0122cfaafaf1a4118b7749e6
@@@ -58,661 -58,562 +58,577 @@@ print.xtable <- function(x
    timestamp = getOption("xtable.timestamp", date()),\r
    ...)\r
  {\r
-     ## If caption is length 2, treat the second value as the "short caption"\r
-     caption <- attr(x,"caption",exact = TRUE)\r
-     short.caption <- NULL\r
-     if (!is.null(caption) && length(caption) > 1){\r
-         short.caption <- caption[2]\r
-       caption <- caption[1]\r
-     }\r
\r
-     ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 hline.after\r
-     ## By default it print an \hline before and after the columns names\r
-     ## independently they are printed or not and at the end of the table\r
-     ## Old code that set hline.after should include c(-1, 0, nrow(x)) in the\r
-     ## hline.after vector\r
-     ## If you do not want any \hline inside the data, set hline.after to NULL\r
-     ## PHEADER instead the string '\\hline\n' is used in the code\r
-     ## Now hline.after counts how many time a position appear\r
-     ## I left an automatic PHEADER in the longtable is this correct?\r
\r
-     ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 include.rownames,\r
-     ## include.colnames\r
-     pos <- 0\r
-     if (include.rownames) pos <- 1\r
\r
-     ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
-     ## hline.after checks\r
-     if (any(hline.after < -1) | any(hline.after > nrow(x))) {\r
-         stop("'hline.after' must be inside [-1, nrow(x)]")\r
-     }\r
\r
-     ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
-     ## add.to.row checks\r
-     if (!is.null(add.to.row)) {\r
-         if (is.list(add.to.row) && length(add.to.row) == 2) {\r
-             if (is.null(names(add.to.row))) {\r
-                 names(add.to.row) <- c('pos', 'command')\r
-             } else if (any(sort(names(add.to.row))!= c('command', 'pos'))) {\r
-                 stop("the names of the elements of 'add.to.row' must be 'pos' and 'command'")\r
-             }\r
-             if (is.list(add.to.row$pos) && is.vector(add.to.row$command,\r
-                                                      mode = 'character')) {\r
-                 if ((npos <- length(add.to.row$pos)) !=\r
-                     length(add.to.row$command)) {\r
-                     stop("the length of 'add.to.row$pos' must be equal to the length of 'add.to.row$command'")\r
-                 }\r
-                 if (any(unlist(add.to.row$pos) < -1) |\r
-                     any(unlist(add.to.row$pos) > nrow(x))) {\r
-                     stop("the values in add.to.row$pos must be inside the interval [-1, nrow(x)]")\r
-                 }\r
-             } else {\r
-                 stop("the first argument ('pos') of 'add.to.row' must be a list, the second argument ('command') must be a vector of mode character")\r
-             }\r
-         } else {\r
-             stop("'add.to.row' argument must be a list of length 2")\r
+   ## If caption is length 2, treat the second value as the "short caption"\r
+   caption <- attr(x,"caption",exact = TRUE)\r
+   short.caption <- NULL\r
+   if (!is.null(caption) && length(caption) > 1){\r
+     short.caption <- caption[2]\r
+     caption <- caption[1]\r
+   }\r
\r
+   ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 hline.after\r
+   ## By default it print an \hline before and after the columns names\r
+   ## independently they are printed or not and at the end of the table\r
+   ## Old code that set hline.after should include c(-1, 0, nrow(x)) in the\r
+   ## hline.after vector\r
+   ## If you do not want any \hline inside the data, set hline.after to NULL\r
+   ## PHEADER instead the string '\\hline\n' is used in the code\r
+   ## Now hline.after counts how many time a position appear\r
+   ## I left an automatic PHEADER in the longtable is this correct?\r
+   \r
+   ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 include.rownames,\r
+   ## include.colnames\r
+   pos <- 0\r
+   if (include.rownames) pos <- 1\r
+   \r
+   ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
+   ## hline.after checks\r
+   if (any(hline.after < -1) | any(hline.after > nrow(x))) {\r
+     stop("'hline.after' must be inside [-1, nrow(x)]")\r
+   }\r
+   \r
+   ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
+   ## add.to.row checks\r
+   if (!is.null(add.to.row)) {\r
+     if (is.list(add.to.row) && length(add.to.row) == 2) {\r
+       if (is.null(names(add.to.row))) {\r
+         names(add.to.row) <- c('pos', 'command')\r
+       } else if (any(sort(names(add.to.row))!= c('command', 'pos'))) {\r
+         stop("the names of the elements of 'add.to.row' must be 'pos' and 'command'")\r
+       }\r
+       if (is.list(add.to.row$pos) && is.vector(add.to.row$command,\r
+                                                mode = 'character')) {\r
+         if ((npos <- length(add.to.row$pos)) !=\r
+             length(add.to.row$command)) {\r
+           stop("the length of 'add.to.row$pos' must be equal to the length of 'add.to.row$command'")\r
+         }\r
+         if (any(unlist(add.to.row$pos) < -1) |\r
+             any(unlist(add.to.row$pos) > nrow(x))) {\r
+           stop("the values in add.to.row$pos must be inside the interval [-1, nrow(x)]")\r
          }\r
+       } else {\r
+         stop("the first argument ('pos') of 'add.to.row' must be a list, the second argument ('command') must be a vector of mode character")\r
+       }\r
      } else {\r
-         add.to.row <- list(pos = list(),\r
-                            command = vector(length = 0, mode = "character"))\r
-         npos <- 0\r
+       stop("'add.to.row' argument must be a list of length 2")\r
      }\r
\r
-     ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 add.to.row\r
-     ## Add further commands at the end of rows\r
-     if (type == "latex") {\r
-         ## Original code before changes in version 1.6-1\r
-         ## PHEADER <- "\\hline\n"\r
\r
-         ## booktabs code from Matthieu Stigler <matthieu.stigler@gmail.com>,\r
-         ## 1 Feb 2012\r
-         if(!booktabs){\r
-             PHEADER <- "\\hline\n"\r
-         } else {\r
-             ## This code replaced to fix bug #2309, David Scott, 8 Jan 2014\r
-             ## PHEADER <- ifelse(-1%in%hline.after, "\\toprule\n", "")\r
-             ## if(0%in%hline.after) {\r
-             ##     PHEADER <- c(PHEADER, "\\midrule\n")\r
-             ## }\r
-             ## if(nrow(x)%in%hline.after) {\r
-             ##     PHEADER <- c(PHEADER, "\\bottomrule\n")\r
-             ## }\r
-             if (is.null(hline.after)){\r
-                 PHEADER <- ""\r
-             } else {\r
-                 hline.after <- sort(hline.after)\r
-                 PHEADER <- rep("\\midrule\n", length(hline.after))\r
-                 if (hline.after[1] == -1) {\r
-                     PHEADER[1] <- "\\toprule\n"\r
-                 }\r
-                 if (hline.after[length(hline.after)] == nrow(x)) {\r
-                     PHEADER[length(hline.after)] <- "\\bottomrule\n"\r
-                 }\r
-             }\r
-         }\r
+   } else {\r
+     add.to.row <- list(pos = list(),\r
+                        command = vector(length = 0, mode = "character"))\r
+     npos <- 0\r
+   }\r
+   \r
+   ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 add.to.row\r
+   ## Add further commands at the end of rows\r
+   if (type == "latex") {\r
+     ## Original code before changes in version 1.6-1\r
+     ## PHEADER <- "\\hline\n"\r
+     \r
+     ## booktabs code from Matthieu Stigler <matthieu.stigler@gmail.com>,\r
+     ## 1 Feb 2012\r
+     if(!booktabs){\r
+       PHEADER <- "\\hline\n"\r
      } else {\r
+       ## This code replaced to fix bug #2309, David Scott, 8 Jan 2014\r
+       ## PHEADER <- ifelse(-1%in%hline.after, "\\toprule\n", "")\r
+       ## if(0%in%hline.after) {\r
+       ##     PHEADER <- c(PHEADER, "\\midrule\n")\r
+       ## }\r
+       ## if(nrow(x)%in%hline.after) {\r
+       ##     PHEADER <- c(PHEADER, "\\bottomrule\n")\r
+       ## }\r
+       if (is.null(hline.after)){\r
          PHEADER <- ""\r
-     }\r
\r
-         lastcol <- rep(" ", nrow(x)+2)\r
-     if (!is.null(hline.after)) {\r
-         ## booktabs change - Matthieu Stigler: fill the hline arguments\r
-         ## separately, 1 Feb 2012\r
-         ##\r
-         ## Code before booktabs change was:\r
-         ##    add.to.row$pos[[npos+1]] <- hline.after\r
\r
-         if (!booktabs){\r
-             add.to.row$pos[[npos+1]] <- hline.after\r
-           } else {\r
-             for(i in 1:length(hline.after)) {\r
-                 add.to.row$pos[[npos+i]] <- hline.after[i]\r
-             }\r
+       } else {\r
+         hline.after <- sort(hline.after)\r
+         PHEADER <- rep("\\midrule\n", length(hline.after))\r
+         if (hline.after[1] == -1) {\r
+           PHEADER[1] <- "\\toprule\n"\r
          }\r
-         add.to.row$command <- c(add.to.row$command, PHEADER)\r
-     }\r
\r
-     if ( length(add.to.row$command) > 0 ) {\r
-         for (i in 1:length(add.to.row$command)) {\r
-             addpos <- add.to.row$pos[[i]]\r
-             freq <- table(addpos)\r
-             addpos <- unique(addpos)\r
-             for (j in 1:length(addpos)) {\r
-                 lastcol[addpos[j]+2] <- paste(lastcol[addpos[j]+2],\r
-                                               paste(rep(add.to.row$command[i],\r
-                                                         freq[j]),\r
-                                                 sep = "", collapse = ""),\r
-                                               sep = " ")\r
-             }\r
+         if (hline.after[length(hline.after)] == nrow(x)) {\r
+           PHEADER[length(hline.after)] <- "\\bottomrule\n"\r
          }\r
+       }\r
      }\r
\r
-     if (length(type)>1) stop("\"type\" must have length 1")\r
-     type <- tolower(type)\r
-     if (!all(!is.na(match(type, c("latex","html"))))) {\r
-         stop("\"type\" must be in {\"latex\", \"html\"}")\r
-     }\r
-     ## Disabling the check on known floating environments as many users\r
-     ## want to use additional environments.\r
-     #    if (!all(!is.na(match(floating.environment,\r
-     #                          c("table","table*","sidewaystable",\r
-     #                            "margintable"))))) {\r
-     #        stop("\"type\" must be in {\"table\", \"table*\", \"sidewaystable\", \"margintable\"}")\r
-     #    }\r
-     if (("margintable" %in% floating.environment)\r
-         & (!is.null(table.placement))) {\r
-         warning("margintable does not allow for table placement; setting table.placement to NULL")\r
-         table.placement <- NULL\r
+   } else {\r
+     PHEADER <- ""\r
+   }\r
+   \r
+   lastcol <- rep(" ", nrow(x)+2)\r
+   if (!is.null(hline.after)) {\r
+     ## booktabs change - Matthieu Stigler: fill the hline arguments\r
+     ## separately, 1 Feb 2012\r
+     ##\r
+     ## Code before booktabs change was:\r
+     ##    add.to.row$pos[[npos+1]] <- hline.after\r
+     \r
+     if (!booktabs){\r
+       add.to.row$pos[[npos+1]] <- hline.after\r
+     } else {\r
+       for(i in 1:length(hline.after)) {\r
+         add.to.row$pos[[npos+i]] <- hline.after[i]\r
+       }\r
      }\r
-     if (!is.null(table.placement) &&\r
-         !all(!is.na(match(unlist(strsplit(table.placement,  split = "")),\r
-                           c("H","h","t","b","p","!"))))) {\r
-         stop("\"table.placement\" must contain only elements of {\"h\",\"t\",\"b\",\"p\",\"!\"}")\r
+     add.to.row$command <- c(add.to.row$command, PHEADER)\r
+   }\r
+   \r
+   if ( length(add.to.row$command) > 0 ) {\r
+     for (i in 1:length(add.to.row$command)) {\r
+       addpos <- add.to.row$pos[[i]]\r
+       freq <- table(addpos)\r
+       addpos <- unique(addpos)\r
+       for (j in 1:length(addpos)) {\r
+         lastcol[addpos[j]+2] <- paste(lastcol[addpos[j]+2],\r
+                                       paste(rep(add.to.row$command[i],\r
+                                                 freq[j]),\r
+                                             sep = "", collapse = ""),\r
+                                       sep = " ")\r
+       }\r
      }\r
-     if (!all(!is.na(match(caption.placement, c("bottom","top"))))) {\r
-         stop("\"caption.placement\" must be either {\"bottom\",\"top\"}")\r
+   }\r
+   \r
+   if (length(type)>1) stop("\"type\" must have length 1")\r
+   type <- tolower(type)\r
+   if (!all(!is.na(match(type, c("latex","html"))))) {\r
+     stop("\"type\" must be in {\"latex\", \"html\"}")\r
+   }\r
+   ## Disabling the check on known floating environments as many users\r
+   ## want to use additional environments.\r
+   ##    if (!all(!is.na(match(floating.environment,\r
+   ##                          c("table","table*","sidewaystable",\r
+   ##                            "margintable"))))) {\r
+   ##        stop("\"type\" must be in {\"table\", \"table*\", \"sidewaystable\", \"margintable\"}")\r
+   ##    }\r
+   if (("margintable" %in% floating.environment)\r
+       & (!is.null(table.placement))) {\r
+     warning("margintable does not allow for table placement; setting table.placement to NULL")\r
+     table.placement <- NULL\r
+   }\r
+   if (!is.null(table.placement) &&\r
+       !all(!is.na(match(unlist(strsplit(table.placement,  split = "")),\r
+                         c("H","h","t","b","p","!"))))) {\r
+     stop("\"table.placement\" must contain only elements of {\"h\",\"t\",\"b\",\"p\",\"!\"}")\r
+   }\r
+   if (!all(!is.na(match(caption.placement, c("bottom","top"))))) {\r
+     stop("\"caption.placement\" must be either {\"bottom\",\"top\"}")\r
+   }\r
+   \r
+   if (type == "latex") {\r
+     BCOMMENT <- "% "\r
+     ECOMMENT <- "\n"\r
+     ## See e-mail from "John S. Walker <jsw9c@uic.edu>" dated 5-19-2003\r
+     ## regarding "texfloat"\r
+     ## See e-mail form "Fernando Henrique Ferraz P. da Rosa"\r
+     ## <academic@feferraz.net>" dated 10-28-2005 regarding "longtable"\r
+     if ( tabular.environment == "longtable" & floating == TRUE ) {\r
+       warning("Attempt to use \"longtable\" with floating = TRUE. Changing to FALSE.")\r
+       floating <- FALSE\r
      }\r
\r
-     if (type == "latex") {\r
-         BCOMMENT <- "% "\r
-         ECOMMENT <- "\n"\r
-         ## See e-mail from "John S. Walker <jsw9c@uic.edu>" dated 5-19-2003\r
-         ## regarding "texfloat"\r
-         ## See e-mail form "Fernando Henrique Ferraz P. da Rosa"\r
-         ## <academic@feferraz.net>" dated 10-28-2005 regarding "longtable"\r
-         if ( tabular.environment == "longtable" & floating == TRUE ) {\r
-             warning("Attempt to use \"longtable\" with floating = TRUE. Changing to FALSE.")\r
-             floating <- FALSE\r
-         }\r
-         if ( floating == TRUE ) {\r
-             ## See e-mail from "Pfaff, Bernhard <Bernhard.Pfaff@drkw.com>"\r
-             ## dated 7-09-2003 regarding "suggestion for an amendment of\r
-             ## the source"\r
-             ## See e-mail from "Mitchell, David"\r
-             ## <David.Mitchell@dotars.gov.au>" dated 2003-07-09 regarding\r
-             ## "Additions to R xtable package"\r
-             ## See e-mail from "Garbade, Sven"\r
-             ## <Sven.Garbade@med.uni-heidelberg.de> dated 2006-05-22\r
-             ## regarding the floating environment.\r
-             BTABLE <- paste("\\begin{", floating.environment, "}",\r
-                             ifelse(!is.null(table.placement),\r
-                                    paste("[", table.placement, "]", sep = ""),\r
-                                    ""), "\n", sep = "")\r
-             if ( is.null(latex.environments) ||\r
-                 (length(latex.environments) == 0) ) {\r
-                 BENVIRONMENT <- ""\r
-                 EENVIRONMENT <- ""\r
-             } else {\r
-                 BENVIRONMENT <- ""\r
-                 EENVIRONMENT <- ""\r
-                 if ("center" %in% latex.environments){\r
-                     BENVIRONMENT <- paste(BENVIRONMENT, "\\centering\n",\r
-                                           sep = "")\r
-                 }\r
-                 for (i in 1:length(latex.environments)) {\r
-                     if (latex.environments[i] == "") next\r
-                     if (latex.environments[i] != "center"){\r
-                         BENVIRONMENT <- paste(BENVIRONMENT,\r
-                                               "\\begin{", latex.environments[i],\r
-                                               "}\n", sep = "")\r
-                         EENVIRONMENT <- paste("\\end{", latex.environments[i],\r
-                                               "}\n", EENVIRONMENT, sep = "")\r
-                     }\r
-                 }\r
-             }\r
-             ETABLE <- paste("\\end{", floating.environment, "}\n", sep = "")\r
-         } else {\r
-             BTABLE <- ""\r
-             ETABLE <- ""\r
-             BENVIRONMENT <- ""\r
-             EENVIRONMENT <- ""\r
-         }\r
\r
-         tmp.index.start <- 1\r
-         if ( ! include.rownames ) {\r
-             while ( attr(x, "align", exact = TRUE)[tmp.index.start] == '|' )\r
-                 tmp.index.start <- tmp.index.start + 1\r
-             tmp.index.start <- tmp.index.start + 1\r
-         }\r
-         ## Added "width" argument for use with "tabular*" or\r
-         ## "tabularx" environments - CR, 7/2/12\r
-         if (is.null(width)){\r
-             WIDTH <-""\r
-         } else if (is.element(tabular.environment,\r
-                               c("tabular", "longtable"))){\r
-             warning("Ignoring 'width' argument.  The 'tabular' and 'longtable' environments do not support a width specification.  Use another environment such as 'tabular*' or 'tabularx' to specify the width.")\r
-             WIDTH <- ""\r
-         } else {\r
-             WIDTH <- paste("{", width, "}", sep = "")\r
-         }\r
\r
-         BTABULAR <-\r
-             paste("\\begin{", tabular.environment, "}",\r
-                   WIDTH, "{",\r
-                   paste(c(attr(x, "align",\r
-                                exact = TRUE)[\r
-                                tmp.index.start:length(attr(x, "align",\r
-                                                            exact = TRUE))],\r
-                           "}\n"),\r
-                         sep = "", collapse = ""),\r
-                   sep = "")\r
\r
-         ## fix 10-26-09 (robert.castelo@upf.edu) the following\r
-         ## 'if' condition is added here to support\r
-         ## a caption on the top of a longtable\r
-         if (tabular.environment == "longtable" && caption.placement == "top") {\r
-             if (is.null(short.caption)){\r
-                 BCAPTION <- "\\caption{"\r
-             } else {\r
-                 BCAPTION <- paste("\\caption[", short.caption, "]{", sep = "")\r
-             }\r
-             ECAPTION <- "} \\\\ \n"\r
-             if ((!is.null(caption)) && (type == "latex")) {\r
-                 BTABULAR <- paste(BTABULAR,  BCAPTION, caption, ECAPTION,\r
-                                   sep = "")\r
-             }\r
-         }\r
-         ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
-         ## add.to.row position -1\r
-         BTABULAR <- paste(BTABULAR, lastcol[1], sep = "")\r
-         ## the \hline at the end, if present, is set in full matrix\r
-         ETABULAR <- paste("\\end{", tabular.environment, "}\n", sep = "")\r
\r
-         ## Add scalebox - CR, 7/2/12\r
-         if (!is.null(scalebox)){\r
-             BTABULAR <- paste("\\scalebox{", scalebox, "}{\n", BTABULAR,\r
-                               sep = "")\r
-             ETABULAR <- paste(ETABULAR, "}\n", sep = "")\r
-         }\r
\r
-         ## BSIZE contributed by Benno <puetz@mpipsykl.mpg.de> in e-mail\r
-         ## dated Wednesday, December 01, 2004\r
-         if (is.null(size) || !is.character(size)) {\r
-             BSIZE <- ""\r
-             ESIZE <- ""\r
-         } else {\r
-             if(length(grep("^\\\\", size)) == 0){\r
-                 size <- paste("\\", size, sep = "")\r
-             }\r
-             BSIZE <- paste("{", size, "\n", sep = "")\r
-             ESIZE <- "}\n"\r
-         }\r
-         BLABEL <- "\\label{"\r
-         ELABEL <- "}\n"\r
-         ## Added caption width (jeff.laake@nooa.gov)\r
-           if(!is.null(caption.width)){\r
-               BCAPTION <- paste("\\parbox{",caption.width,"}{",sep="")\r
-               ECAPTION <- "}"\r
-           } else {\r
-               BCAPTION <- NULL\r
-               ECAPTION <- NULL\r
-           }\r
-           if (is.null(short.caption)){\r
-                  BCAPTION <- paste(BCAPTION,"\\caption{",sep="")\r
-           } else {\r
-                  BCAPTION <- paste(BCAPTION,"\\caption[", short.caption, "]{", sep="")\r
-           }\r
-         ECAPTION <- paste(ECAPTION,"} \n",sep="")\r
-         BROW <- ""\r
-         EROW <- " \\\\ \n"\r
-         BTH <- ""\r
-         ETH <- ""\r
-         STH <- " & "\r
-         BTD1 <- " & "\r
-         BTD2 <- ""\r
-         BTD3 <- ""\r
-         ETD  <- ""\r
-         ## Based on contribution from Jonathan Swinton\r
-         ## <jonathan@swintons.net> in e-mail dated Wednesday, January 17, 2007\r
-         sanitize <- function(str) {\r
-             result <- str\r
-             result <- gsub("\\\\", "SANITIZE.BACKSLASH", result)\r
-             result <- gsub("$", "\\$", result, fixed = TRUE)\r
-             result <- gsub(">", "$>$", result, fixed = TRUE)\r
-             result <- gsub("<", "$<$", result, fixed = TRUE)\r
-             result <- gsub("|", "$|$", result, fixed = TRUE)\r
-             result <- gsub("{", "\\{", result, fixed = TRUE)\r
-             result <- gsub("}", "\\}", result, fixed = TRUE)\r
-             result <- gsub("%", "\\%", result, fixed = TRUE)\r
-             result <- gsub("&", "\\&", result, fixed = TRUE)\r
-             result <- gsub("_", "\\_", result, fixed = TRUE)\r
-             result <- gsub("#", "\\#", result, fixed = TRUE)\r
-             result <- gsub("^", "\\verb|^|", result, fixed = TRUE)\r
-             result <- gsub("~", "\\~{}", result, fixed = TRUE)\r
-             result <- gsub("SANITIZE.BACKSLASH", "$\\backslash$",\r
-                            result, fixed = TRUE)\r
-             return(result)\r
-         }\r
-         sanitize.numbers <- function(x) {\r
-             result <- x\r
-             if ( math.style.negative ) {\r
-                 ## Jake Bowers <jwbowers@illinois.edu> in e-mail\r
-                 ## from 2008-08-20 suggested disabling this feature to avoid\r
-                 ## problems with LaTeX's dcolumn package.\r
-                 ## by Florian Wickelmaier <florian.wickelmaier@uni-tuebingen.de>\r
-                 ## in e-mail from 2008-10-03 requested the ability to use the\r
-                 ## old behavior.\r
-                 for(i in 1:length(x)) {\r
-                     result[i] <- gsub("-", "$-$", result[i], fixed = TRUE)\r
-                 }\r
-             }\r
-             if (is.logical(math.style.exponents) && ! math.style.exponents ) {\r
-             } else if (is.logical(math.style.exponents) && math.style.exponents ||\r
-                        math.style.exponents == "$$"\r
-                        ) {\r
-                 for(i in 1:length(x)) {\r
-                     result[i] <- gsub("^\\$?(-?)\\$?([0-9.]+)[eE]\\$?(-?)\\+?\\$?0*(\\d+)$",\r
-                                       "$\\1\\2 \\\\times 10^{\\3\\4}$", result[i])\r
-                 }\r
-             } else if (math.style.exponents == "ensuremath") {\r
-                 for(i in 1:length(x)) {\r
-                     result[i] <- gsub("^\\$?(-?)\\$?([0-9.]+)[eE]\\$?(-?)\\+?\\$?0*(\\d+)$",\r
-                                       "\\\\ensuremath{\\1\\2 \\\\times 10^{\\3\\4}}", result[i])\r
-                 }\r
-             } else if (math.style.exponents == "UTF8" ||\r
-                        math.style.exponents == "UTF-8") {\r
-                 for(i in 1:length(x)) {\r
-                     ## this code turns 1e5 into 1×10⁵x\r
-                     if (all(grepl("^\\$?(-?)\\$?([0-9.]+)[eE]\\$?(-?)\\+?\\$?0*(\\d+)$",result[i]))) {\r
-                         temp <- strsplit(result[i],"eE",result[i])\r
-                         result[i] <-\r
-                             paste0(temp[1],\r
-                                    "\u00d710",\r
-                                    chartr("-1234567890","\u207b\u00b9\u00b2\u00b3\u2074\u2075\u20746\u20747\u20748\u20749\u2070",temp[2]))\r
-                     }\r
-                 }\r
-             }\r
-             return(result)\r
-         }\r
-         sanitize.final <- function(result) {\r
-             return(result)\r
-         }\r
-     } else {\r
-         BCOMMENT <- "<!-- "\r
-         ECOMMENT <- " -->\n"\r
-         BTABLE <- paste("<table ", html.table.attributes, ">\n", sep = "")\r
-         ETABLE <- "</table>\n"\r
+     if ( floating == TRUE ) {\r
+       ## See e-mail from "Pfaff, Bernhard <Bernhard.Pfaff@drkw.com>"\r
+       ## dated 7-09-2003 regarding "suggestion for an amendment of\r
+       ## the source"\r
+       ## See e-mail from "Mitchell, David"\r
+       ## <David.Mitchell@dotars.gov.au>" dated 2003-07-09 regarding\r
+       ## "Additions to R xtable package"\r
+       ## See e-mail from "Garbade, Sven"\r
+       ## <Sven.Garbade@med.uni-heidelberg.de> dated 2006-05-22\r
+       ## regarding the floating environment.\r
+       BTABLE <- paste("\\begin{", floating.environment, "}",\r
+                       ifelse(!is.null(table.placement),\r
+                              paste("[", table.placement, "]", sep = ""),\r
+                              ""), "\n", sep = "")\r
+       if ( is.null(latex.environments) ||\r
+            (length(latex.environments) == 0) ) {\r
          BENVIRONMENT <- ""\r
          EENVIRONMENT <- ""\r
-         BTABULAR <- ""\r
-         ETABULAR <- ""\r
-         BSIZE <- ""\r
-         ESIZE <- ""\r
-         BLABEL <- "<a name="\r
-         ELABEL <- "></a>\n"\r
-         BCAPTION <- paste("<caption align=\"", caption.placement, "\"> ",\r
-                           sep = "")\r
-         ECAPTION <- " </caption>\n"\r
-         BROW <- "<tr>"\r
-         EROW <- " </tr>\n"\r
-         BTH <- " <th> "\r
-         ETH <- " </th> "\r
-         STH <- " </th> <th> "\r
-         BTD1 <- " <td align=\""\r
-         align.tmp <- attr(x, "align", exact = TRUE)\r
-         align.tmp <- align.tmp[align.tmp!="|"]\r
-         BTD2 <- matrix(align.tmp[(2-pos):(ncol(x)+1)],\r
-                        nrow = nrow(x), ncol = ncol(x)+pos, byrow = TRUE)\r
-         ## Based on contribution from Jonathan Swinton <jonathan@swintons.net>\r
-         ## in e-mail dated Wednesday, January 17, 2007\r
-         BTD2[regexpr("^p", BTD2)>0] <- "left"\r
-         BTD2[BTD2 == "r"] <- "right"\r
-         BTD2[BTD2 == "l"] <- "left"\r
-         BTD2[BTD2 == "c"] <- "center"\r
-         BTD3 <- "\"> "\r
-         ETD  <- " </td>"\r
-         sanitize <- function(str) {\r
-             result <- str\r
-             ## Changed as suggested in bug report #2795\r
-             ## That is replacement of "&" is "&amp;"\r
-             ## instead of previous "&amp" etc\r
-             ## result <- gsub("&", "&amp ", result, fixed = TRUE)\r
-             ## result <- gsub(">", "&gt ", result, fixed = TRUE)\r
-             ## result <- gsub("<", "&lt ", result, fixed = TRUE)\r
-             result <- gsub("&", "&amp;", result, fixed = TRUE)\r
-             result <- gsub(">", "&gt;", result, fixed = TRUE)\r
-             result <- gsub("<", "&lt;", result, fixed = TRUE)\r
-             ## Kurt Hornik <Kurt.Hornik@wu-wien.ac.at> on 2006/10/05\r
-             ## recommended not escaping underscores.\r
-             ## result <- gsub("_", "\\_", result, fixed=TRUE)\r
-             return(result)\r
-         }\r
-         sanitize.numbers <- function(x) {\r
-             return(x)\r
+       } else {\r
+         BENVIRONMENT <- ""\r
+         EENVIRONMENT <- ""\r
+         if ("center" %in% latex.environments){\r
+           BENVIRONMENT <- paste(BENVIRONMENT, "\\centering\n",\r
+                                 sep = "")\r
          }\r
-         sanitize.final <- function(result) {\r
-             ## Suggested by Uwe Ligges <ligges@statistik.uni-dortmund.de>\r
-             ## in e-mail dated 2005-07-30.\r
-             result$text <- gsub("  *", " ",  result$text, fixed = TRUE)\r
-             result$text <- gsub(' align="left"',  "", result$text,\r
-                                 fixed = TRUE)\r
-             return(result)\r
+         for (i in 1:length(latex.environments)) {\r
+           if (latex.environments[i] == "") next\r
+           if (latex.environments[i] != "center"){\r
+             BENVIRONMENT <- paste(BENVIRONMENT,\r
+                                   "\\begin{", latex.environments[i],\r
+                                   "}\n", sep = "")\r
+             EENVIRONMENT <- paste("\\end{", latex.environments[i],\r
+                                   "}\n", EENVIRONMENT, sep = "")\r
+           }\r
          }\r
+       }\r
+       ETABLE <- paste("\\end{", floating.environment, "}\n", sep = "")\r
+     } else {\r
+       BTABLE <- ""\r
+       ETABLE <- ""\r
+       BENVIRONMENT <- ""\r
+       EENVIRONMENT <- ""\r
      }\r
\r
-     result <- string("", file = file, append = append)\r
-     info <- R.Version()\r
-     ## modified Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
-     ## to set automatically the package version\r
-       if (comment){\r
-         result <- result + BCOMMENT + type + " table generated in " +\r
-               info$language + " " + info$major + "." + info$minor +\r
-               " by xtable " +  packageDescription('xtable')$Version +\r
-               " package" + ECOMMENT\r
-         if (!is.null(timestamp)){\r
-             result <- result + BCOMMENT + timestamp + ECOMMENT\r
-         }\r
+     \r
+     tmp.index.start <- 1\r
+     if ( ! include.rownames ) {\r
+       while ( attr(x, "align", exact = TRUE)[tmp.index.start] == '|' )\r
+         tmp.index.start <- tmp.index.start + 1\r
+       tmp.index.start <- tmp.index.start + 1\r
      }\r
-     ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 only.contents\r
-     if (!only.contents) {\r
-         result <- result + BTABLE\r
-         result <- result + BENVIRONMENT\r
-         if ( floating == TRUE ) {\r
-             if ((!is.null(caption)) &&\r
-                 (type == "html" ||caption.placement == "top")) {\r
-                 result <- result + BCAPTION + caption + ECAPTION\r
-             }\r
-             if (!is.null(attr(x, "label", exact = TRUE)) &&\r
-                 (type == "latex" && caption.placement == "top")) {\r
-                 result <- result + BLABEL +\r
-                           attr(x, "label", exact = TRUE) + ELABEL\r
-             }\r
-         }\r
-         result <- result + BSIZE\r
-         result <- result + BTABULAR\r
+     ## Added "width" argument for use with "tabular*" or\r
+     ## "tabularx" environments - CR, 7/2/12\r
+     if (is.null(width)){\r
+       WIDTH <-""\r
+     } else if (is.element(tabular.environment,\r
+                           c("tabular", "longtable"))){\r
+       warning("Ignoring 'width' argument.  The 'tabular' and 'longtable' environments do not support a width specification.  Use another environment such as 'tabular*' or 'tabularx' to specify the width.")\r
+       WIDTH <- ""\r
+     } else {\r
+       WIDTH <- paste("{", width, "}", sep = "")\r
+     }\r
+     \r
+     BTABULAR <-\r
+       paste("\\begin{", tabular.environment, "}",\r
+             WIDTH, "{",\r
+             paste(c(attr(x, "align",\r
+                          exact = TRUE)[\r
+               tmp.index.start:length(attr(x, "align",\r
+                                           exact = TRUE))],\r
+               "}\n"),\r
+               sep = "", collapse = ""),\r
+             sep = "")\r
+     \r
+     ## fix 10-26-09 (robert.castelo@upf.edu) the following\r
+     ## 'if' condition is added here to support\r
+     ## a caption on the top of a longtable\r
+     if (tabular.environment == "longtable" && caption.placement == "top") {\r
+       if (is.null(short.caption)){\r
+         BCAPTION <- "\\caption{"\r
+       } else {\r
+         BCAPTION <- paste("\\caption[", short.caption, "]{", sep = "")\r
+       }\r
+       ECAPTION <- "} \\\\ \n"\r
+       if ((!is.null(caption)) && (type == "latex")) {\r
+         BTABULAR <- paste(BTABULAR,  BCAPTION, caption, ECAPTION,\r
+                           sep = "")\r
+       }\r
      }\r
      ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
-     ## include.colnames, include.rownames\r
-     if (include.colnames) {\r
-         COLNAMES <- string("", file = file, append = append)\r
\r
-         COLNAMES <- COLNAMES + BROW + BTH\r
-         if (include.rownames) {\r
-             COLNAMES <- COLNAMES + STH\r
-       }\r
-         ## David G. Whiting in e-mail 2007-10-09\r
-         if (is.null(sanitize.colnames.function)) {\r
-             CNAMES <- sanitize(names(x))\r
-       } else {\r
-             CNAMES <- sanitize.colnames.function(names(x))\r
-       }\r
-         if (rotate.colnames) {\r
-             ##added by Markus Loecher, 2009-11-16\r
-             CNAMES <- paste("\\begin{sideways}", CNAMES, "\\end{sideways}")\r
-       }\r
-         COLNAMES <- COLNAMES + paste(CNAMES, collapse = STH)\r
\r
-         COLNAMES <- COLNAMES + ETH + EROW\r
-         result <- result + COLNAMES\r
-         if (tabular.environment=="longtable") {\r
-             result <- result + "\\endfirsthead\n"\r
-             if (booktabs) {\r
-                 if (!is.null(caption)) {\r
-                     result <- result + "\\caption[]{"+caption+"} \\\\\n"\r
-                 }\r
-                 result <- result + "\\toprule\n"+ COLNAMES + "\\midrule\n\\endhead\n"\r
-             } else {\r
-                 if (!is.null(caption)) {\r
-                     result <- result + "\\caption[]{"+caption+"}\n"\r
-                 }\r
-                 result <- result + COLNAMES + "\\endhead\n"\r
-             }\r
-         }\r
+     ## add.to.row position -1\r
+     BTABULAR <- paste(BTABULAR, lastcol[1], sep = "")\r
+     ## the \hline at the end, if present, is set in full matrix\r
+     ETABULAR <- paste("\\end{", tabular.environment, "}\n", sep = "")\r
+     \r
+     ## Add scalebox - CR, 7/2/12\r
+     if (!is.null(scalebox)){\r
+       BTABULAR <- paste("\\scalebox{", scalebox, "}{\n", BTABULAR,\r
+                         sep = "")\r
+       ETABULAR <- paste(ETABULAR, "}\n", sep = "")\r
      }\r
\r
-     cols <- matrix("", nrow = nrow(x), ncol = ncol(x)+pos)\r
+     \r
+     ## BSIZE contributed by Benno <puetz@mpipsykl.mpg.de> in e-mail\r
+     ## dated Wednesday, December 01, 2004\r
+     if (is.null(size) || !is.character(size)) {\r
+       BSIZE <- ""\r
+       ESIZE <- ""\r
+     } else {\r
+       if(length(grep("^\\\\", size)) == 0){\r
+         size <- paste("\\", size, sep = "")\r
+       }\r
+       ## Change suggested by Claudius Loehnert reported in Bug #6260\r
+       ## BSIZE <- paste("{", size, "\n", sep = "")\r
+       ## ESIZE <- "{\n"\r
+       BSIZE <- paste("\\begingroup", size, "\n", sep = "")\r
+       ESIZE <- "\\endgroup\n"\r
+     }\r
+     BLABEL <- "\\label{"\r
+     ELABEL <- "}\n"\r
+     ## Added caption width (jeff.laake@nooa.gov)\r
+     if(!is.null(caption.width)){\r
+       BCAPTION <- paste("\\parbox{",caption.width,"}{",sep="")\r
+       ECAPTION <- "}"\r
+     } else {\r
+       BCAPTION <- NULL\r
+       ECAPTION <- NULL\r
+     }\r
+     if (is.null(short.caption)){\r
+       BCAPTION <- paste(BCAPTION,"\\caption{",sep="")\r
+     } else {\r
+       BCAPTION <- paste(BCAPTION,"\\caption[", short.caption, "]{", sep="")\r
+     }\r
+     ECAPTION <- paste(ECAPTION,"} \n",sep="")\r
+     BROW <- ""\r
+     EROW <- " \\\\ \n"\r
+     BTH <- ""\r
+     ETH <- ""\r
+     STH <- " & "\r
+     BTD1 <- " & "\r
+     BTD2 <- ""\r
+     BTD3 <- ""\r
+     ETD  <- ""\r
+     } else {\r
+       BCOMMENT <- "<!-- "\r
+       ECOMMENT <- " -->\n"\r
+       BTABLE <- paste("<table ", html.table.attributes, ">\n", sep = "")\r
+       ETABLE <- "</table>\n"\r
+       BENVIRONMENT <- ""\r
+       EENVIRONMENT <- ""\r
+       BTABULAR <- ""\r
+       ETABULAR <- ""\r
+       BSIZE <- ""\r
+       ESIZE <- ""\r
+       BLABEL <- "<a name="\r
+       ELABEL <- "></a>\n"\r
+       BCAPTION <- paste("<caption align=\"", caption.placement, "\"> ",\r
+                         sep = "")\r
+       ECAPTION <- " </caption>\n"\r
+       BROW <- "<tr>"\r
+       EROW <- " </tr>\n"\r
+       BTH <- " <th> "\r
+       ETH <- " </th> "\r
+       STH <- " </th> <th> "\r
+       BTD1 <- " <td align=\""\r
+       align.tmp <- attr(x, "align", exact = TRUE)\r
+       align.tmp <- align.tmp[align.tmp!="|"]\r
+       if (nrow(x) == 0) {\r
+         BTD2 <- matrix(nrow = 0, ncol = ncol(x)+pos)\r
+       } else {\r
+         BTD2 <- matrix(align.tmp[(2-pos):(ncol(x)+1)],\r
+                        nrow = nrow(x), ncol = ncol(x)+pos, byrow = TRUE)\r
+       }\r
+       ## Based on contribution from Jonathan Swinton <jonathan@swintons.net>\r
+       ## in e-mail dated Wednesday, January 17, 2007\r
+       BTD2[regexpr("^p", BTD2)>0] <- "left"\r
+       BTD2[BTD2 == "r"] <- "right"\r
+       BTD2[BTD2 == "l"] <- "left"\r
+       BTD2[BTD2 == "c"] <- "center"\r
+       BTD3 <- "\"> "\r
+       ETD  <- " </td>"\r
+     }\r
+   \r
+   result <- string("", file = file, append = append)\r
+   info <- R.Version()\r
+   ## modified Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
+   ## to set automatically the package version\r
+   if (comment){\r
+     result <- result + BCOMMENT + type + " table generated in " +\r
+       info$language + " " + info$major + "." + info$minor +\r
+       " by xtable " +  packageDescription('xtable')$Version +\r
+                                                   " package" + ECOMMENT\r
+     if (!is.null(timestamp)){\r
+       result <- result + BCOMMENT + timestamp + ECOMMENT\r
+     }\r
+   }\r
+   ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28 only.contents\r
+   if (!only.contents) {\r
+     result <- result + BTABLE\r
+     result <- result + BENVIRONMENT\r
+     if ( floating == TRUE ) {\r
+       if ((!is.null(caption)) &&\r
+           (type == "html" ||caption.placement == "top")) {\r
+         result <- result + BCAPTION + caption + ECAPTION\r
+       }\r
+       if (!is.null(attr(x, "label", exact = TRUE)) &&\r
+           (type == "latex" && caption.placement == "top")) {\r
+         result <- result + BLABEL +\r
+           attr(x, "label", exact = TRUE) + ELABEL\r
+       }\r
+     }\r
+     result <- result + BSIZE\r
+     result <- result + BTABULAR\r
+   }\r
+   ## Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
+   ## include.colnames, include.rownames\r
+   if (include.colnames) {\r
 -    result <- result + BROW + BTH\r
++    COLNAMES <- string("", file = file, append = append)\r
++    COLNAMES <- COLNAMES + BROW + BTH\r
      if (include.rownames) {\r
-         ## David G. Whiting in e-mail 2007-10-09\r
-         if (is.null(sanitize.rownames.function)) {\r
-             RNAMES <- sanitize(row.names(x))\r
-         } else {\r
-             RNAMES <- sanitize.rownames.function(row.names(x))\r
-         }\r
-         if (rotate.rownames) {\r
-             ##added by Markus Loecher, 2009-11-16\r
-             RNAMES <- paste("\\begin{sideways}", RNAMES, "\\end{sideways}")\r
-       }\r
-       cols[, 1] <- RNAMES\r
 -      result <- result + STH\r
++      COLNAMES <- COLNAMES + STH\r
      }\r
\r
- ## Begin vectorizing the formatting code by Ian Fellows [ian@fellstat.com]\r
- ## 06 Dec 2011\r
- ##\r
- ##  disp <- function(y) {\r
- ##    if (is.factor(y)) {\r
- ##      y <- levels(y)[y]\r
- ##    }\r
- ##    if (is.list(y)) {\r
- ##      y <- unlist(y)\r
- ##    }\r
- ##    return(y)\r
- ##  }\r
-     varying.digits <- is.matrix( attr( x, "digits", exact = TRUE ) )\r
-     ## Code for letting "digits" be a matrix was provided by\r
-     ## Arne Henningsen <ahenningsen@agric-econ.uni-kiel.de>\r
-     ## in e-mail dated 2005-06-04.\r
-     ##if( !varying.digits ) {\r
-     ## modified Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
-     ##  attr(x,"digits") <- matrix( attr( x, "digits",exact=TRUE ),\r
-     ## nrow = nrow(x), ncol = ncol(x)+1, byrow = TRUE )\r
-     ##}\r
-     for(i in 1:ncol(x)) {\r
-       xcol <- x[, i]\r
-       if(is.factor(xcol))\r
-             xcol <- as.character(xcol)\r
-       if(is.list(xcol))\r
-             xcol <- sapply(xcol, unlist)\r
-         ina <- is.na(xcol)\r
-         is.numeric.column <- is.numeric(xcol)\r
\r
-       if(is.character(xcol)) {\r
-             cols[, i+pos] <- xcol\r
-       } else {\r
-             if (is.null(format.args)){\r
-                 format.args <- list()\r
-             }\r
-             if (is.null(format.args$decimal.mark)){\r
-                 format.args$decimal.mark <- options()$OutDec\r
-             }\r
-             if(!varying.digits){\r
-               curFormatArgs <-\r
-                     c(list(\r
-                       x = xcol,\r
-                       format =\r
-                       ifelse(attr(x, "digits", exact = TRUE )[i+1] < 0, "E",\r
-                                    attr(x, "display", exact = TRUE )[i+1]),\r
-                       digits = abs(attr(x, "digits", exact = TRUE )[i+1])),\r
-                       format.args)\r
-                 cols[, i+pos] <- do.call("formatC", curFormatArgs)\r
-             }else{\r
-               for( j in 1:nrow( cols ) ) {\r
-                     curFormatArgs <-\r
-                         c(list(\r
-                           x = xcol[j],\r
-                           format =\r
-                           ifelse(attr(x, "digits", exact = TRUE )[j, i+1] < 0,\r
-                                  "E", attr(x, "display", exact = TRUE )[i+1]),\r
-                           digits =\r
-                           abs(attr(x, "digits", exact = TRUE )[j, i+1])),\r
-                           format.args)\r
-                     cols[j, i+pos] <- do.call("formatC", curFormatArgs)\r
-               }\r
+     ## David G. Whiting in e-mail 2007-10-09\r
+     if (is.null(sanitize.colnames.function)) {\r
+       CNAMES <- sanitize(names(x), type = type)\r
+     } else {\r
+       CNAMES <- sanitize.colnames.function(names(x))\r
+     }\r
+     if (rotate.colnames) {\r
+       ##added by Markus Loecher, 2009-11-16\r
+       CNAMES <- paste("\\begin{sideways}", CNAMES, "\\end{sideways}")\r
+     }\r
 -    result <- result + paste(CNAMES, collapse = STH)\r
++    COLNAMES <- COLNAMES + paste(CNAMES, collapse = STH)\r
+     \r
 -    result <- result + ETH + EROW\r
++    COLNAMES <- COLNAMES + ETH + EROW\r
++    result <- result + COLNAMES\r
++    if (tabular.environment=="longtable") {\r
++        result <- result + "\\endfirsthead\n"\r
++        if (booktabs) {\r
++            if (!is.null(caption)) {\r
++                result <- result + "\\caption[]{"+caption+"} \\\\\n"\r
 +            }\r
-       }\r
-       ## End Ian Fellows changes\r
\r
-         if ( any(ina) ) cols[ina, i+pos] <- NA.string\r
-         ## Based on contribution from Jonathan Swinton <jonathan@swintons.net>\r
-         ## in e-mail dated Wednesday, January 17, 2007\r
-         if ( is.numeric.column ) {\r
-             cols[, i+pos] <- sanitize.numbers(cols[, i+pos])\r
++            result <- result + "\\toprule\n"+ COLNAMES + "\\midrule\n\\endhead\n"\r
 +        } else {\r
-             if (is.null(sanitize.text.function)) {\r
-                 cols[, i+pos] <- sanitize(cols[, i+pos])\r
-             } else {\r
-                 cols[, i+pos] <- sanitize.text.function(cols[, i+pos])\r
++            if (!is.null(caption)) {\r
++                result <- result + "\\caption[]{"+caption+"}\n"\r
 +            }\r
++            result <- result + COLNAMES + "\\endhead\n"\r
 +        }\r
 +    }\r
\r
-     multiplier <- 5\r
-     full <- matrix("", nrow = nrow(x), ncol = multiplier*(ncol(x)+pos)+2)\r
-     full[, 1] <- BROW\r
-     full[, multiplier*(0:(ncol(x)+pos-1))+2] <- BTD1\r
-     full[, multiplier*(0:(ncol(x)+pos-1))+3] <- BTD2\r
-     full[, multiplier*(0:(ncol(x)+pos-1))+4] <- BTD3\r
-     full[, multiplier*(0:(ncol(x)+pos-1))+5] <- cols\r
-     full[, multiplier*(0:(ncol(x)+pos-1))+6] <- ETD\r
\r
-     full[, multiplier*(ncol(x)+pos)+2] <- paste(EROW, lastcol[-(1:2)],\r
-                                                 sep = " ")\r
\r
-     if (type == "latex") full[, 2] <- ""\r
-     result <- result + lastcol[2] + paste(t(full), collapse = "")\r
-     if (!only.contents) {\r
-         if (tabular.environment == "longtable") {\r
-             ## booktabs change added the if() - 1 Feb 2012\r
-             if(!booktabs) {\r
-                 result <- result + PHEADER\r
-             }\r
\r
-             ## fix 10-27-09 Liviu Andronic (landronimirc@gmail.com) the\r
-             ## following 'if' condition is inserted in order to avoid\r
-             ## that bottom caption interferes with a top caption of a longtable\r
-             if(caption.placement == "bottom"){\r
-                 if ((!is.null(caption)) && (type == "latex")) {\r
-                     result <- result + BCAPTION + caption + ECAPTION\r
-                 }\r
-             }\r
-             if (!is.null(attr(x, "label", exact = TRUE))) {\r
-                 result <- result + BLABEL + attr(x, "label", exact = TRUE) +\r
-                     ELABEL\r
-             }\r
-             ETABULAR <- "\\end{longtable}\n"\r
+   }\r
 -  \r
+   cols <- matrix("", nrow = nrow(x), ncol = ncol(x)+pos)\r
+   if (include.rownames) {\r
+     ## David G. Whiting in e-mail 2007-10-09\r
+     if (is.null(sanitize.rownames.function)) {\r
+       RNAMES <- sanitize(row.names(x), type = type)\r
+     } else {\r
+       RNAMES <- sanitize.rownames.function(row.names(x))\r
+     }\r
+     if (rotate.rownames) {\r
+       ##added by Markus Loecher, 2009-11-16\r
+       RNAMES <- paste("\\begin{sideways}", RNAMES, "\\end{sideways}")\r
+     }\r
+     cols[, 1] <- RNAMES\r
+   }\r
\r
+   ## Begin vectorizing the formatting code by Ian Fellows [ian@fellstat.com]\r
+   ## 06 Dec 2011\r
+   ##\r
+   ##  disp <- function(y) {\r
+   ##    if (is.factor(y)) {\r
+   ##      y <- levels(y)[y]\r
+   ##    }\r
+   ##    if (is.list(y)) {\r
+   ##      y <- unlist(y)\r
+   ##    }\r
+   ##    return(y)\r
+   ##  }\r
+   varying.digits <- is.matrix( attr( x, "digits", exact = TRUE ) )\r
+   ## Code for letting "digits" be a matrix was provided by\r
+   ## Arne Henningsen <ahenningsen@agric-econ.uni-kiel.de>\r
+   ## in e-mail dated 2005-06-04.\r
+   ##if( !varying.digits ) {\r
+   ## modified Claudio Agostinelli <claudio@unive.it> dated 2006-07-28\r
+   ##  attr(x,"digits") <- matrix( attr( x, "digits",exact=TRUE ),\r
+   ## nrow = nrow(x), ncol = ncol(x)+1, byrow = TRUE )\r
+   ##}\r
+   for(i in 1:ncol(x)) {\r
+     xcol <- x[, i]\r
+     if(is.factor(xcol))\r
+       xcol <- as.character(xcol)\r
+     if(is.list(xcol))\r
+       xcol <- sapply(xcol, unlist)\r
+     ina <- is.na(xcol)\r
+     is.numeric.column <- is.numeric(xcol)\r
+     \r
+     if(is.character(xcol)) {\r
+       cols[, i+pos] <- xcol\r
+     } else {\r
+       if (is.null(format.args)){\r
+         format.args <- list()\r
+       }\r
+       if (is.null(format.args$decimal.mark)){\r
+         format.args$decimal.mark <- options()$OutDec\r
+       }\r
+       if(!varying.digits){\r
+         curFormatArgs <-\r
+           c(list(\r
+             x = xcol,\r
+             format =\r
+               ifelse(attr(x, "digits", exact = TRUE )[i+1] < 0, "E",\r
+                      attr(x, "display", exact = TRUE )[i+1]),\r
+             digits = abs(attr(x, "digits", exact = TRUE )[i+1])),\r
+             format.args)\r
+         cols[, i+pos] <- do.call("formatC", curFormatArgs)\r
+       }else{\r
+         for( j in 1:nrow( cols ) ) {\r
+           curFormatArgs <-\r
+             c(list(\r
+               x = xcol[j],\r
+               format =\r
+                 ifelse(attr(x, "digits", exact = TRUE )[j, i+1] < 0,\r
+                        "E", attr(x, "display", exact = TRUE )[i+1]),\r
+               digits =\r
+                 abs(attr(x, "digits", exact = TRUE )[j, i+1])),\r
+               format.args)\r
+           cols[j, i+pos] <- do.call("formatC", curFormatArgs)\r
          }\r
-         result <- result + ETABULAR\r
-         result <- result + ESIZE\r
-         if ( floating == TRUE ) {\r
-             if ((!is.null(caption)) &&\r
-                 (type == "latex" && caption.placement == "bottom")) {\r
-                 result <- result + BCAPTION + caption + ECAPTION\r
-             }\r
-             if (!is.null(attr(x, "label", exact = TRUE)) &&\r
-                 caption.placement == "bottom") {\r
-                 result <- result + BLABEL + attr(x, "label", exact = TRUE) +\r
-                     ELABEL\r
-             }\r
+       }\r
+     }\r
+     ## End Ian Fellows changes\r
\r
+     if ( any(ina) ) cols[ina, i+pos] <- NA.string\r
+     ## Based on contribution from Jonathan Swinton <jonathan@swintons.net>\r
+     ## in e-mail dated Wednesday, January 17, 2007\r
+     if ( is.numeric.column ) {\r
+       cols[, i+pos] <-\r
+         sanitize.numbers(cols[, i+pos], type = type,\r
+                          math.style.negative = math.style.negative,\r
+                          math.style.exponents = math.style.exponents)\r
+     } else {\r
+       if (is.null(sanitize.text.function)) {\r
+         cols[, i+pos] <- sanitize(cols[, i+pos], type = type)\r
+       } else {\r
+         cols[, i+pos] <- sanitize.text.function(cols[, i+pos])\r
+       }\r
+     }\r
+   }\r
+   \r
+   multiplier <- 5\r
+   full <- matrix("", nrow = nrow(x), ncol = multiplier*(ncol(x)+pos)+2)\r
+   full[, 1] <- BROW\r
+   full[, multiplier*(0:(ncol(x)+pos-1))+2] <- BTD1\r
+   full[, multiplier*(0:(ncol(x)+pos-1))+3] <- BTD2\r
+   full[, multiplier*(0:(ncol(x)+pos-1))+4] <- BTD3\r
+   full[, multiplier*(0:(ncol(x)+pos-1))+5] <- cols\r
+   full[, multiplier*(0:(ncol(x)+pos-1))+6] <- ETD\r
+   \r
+   full[, multiplier*(ncol(x)+pos)+2] <- paste(EROW, lastcol[-(1:2)],\r
+                                               sep = " ")\r
+   \r
+   if (type == "latex") full[, 2] <- ""\r
+   result <- result + lastcol[2] + paste(t(full), collapse = "")\r
+   if (!only.contents) {\r
+     if (tabular.environment == "longtable") {\r
+       ## booktabs change added the if() - 1 Feb 2012\r
+       if(!booktabs) {\r
+         result <- result + PHEADER\r
+       }\r
\r
+       ## fix 10-27-09 Liviu Andronic (landronimirc@gmail.com) the\r
+       ## following 'if' condition is inserted in order to avoid\r
+       ## that bottom caption interferes with a top caption of a longtable\r
+       if(caption.placement == "bottom"){\r
+         if ((!is.null(caption)) && (type == "latex")) {\r
+           result <- result + BCAPTION + caption + ECAPTION\r
          }\r
-         result <- result + EENVIRONMENT\r
-         result <- result + ETABLE\r
+       }\r
+       if (!is.null(attr(x, "label", exact = TRUE))) {\r
+         result <- result + BLABEL + attr(x, "label", exact = TRUE) +\r
+           ELABEL\r
+       }\r
+       ETABULAR <- "\\end{longtable}\n"\r
      }\r
-     result <- sanitize.final(result)\r
\r
-     if (print.results){\r
-       print(result)\r
+     result <- result + ETABULAR\r
+     result <- result + ESIZE\r
+     if ( floating == TRUE ) {\r
+       if ((!is.null(caption)) &&\r
+           (type == "latex" && caption.placement == "bottom")) {\r
+         result <- result + BCAPTION + caption + ECAPTION\r
+       }\r
+       if (!is.null(attr(x, "label", exact = TRUE)) &&\r
+           caption.placement == "bottom") {\r
+         result <- result + BLABEL + attr(x, "label", exact = TRUE) +\r
+           ELABEL\r
+       }\r
      }\r
\r
-     return(invisible(result$text))\r
+     result <- result + EENVIRONMENT\r
+     result <- result + ETABLE\r
+   }\r
+   result <- sanitize.final(result, type = type)\r
+   \r
+   if (print.results){\r
+     print(result)\r
+   }\r
+   \r
+   return(invisible(result$text))\r
  }\r
  \r
  "+.string" <- function(x, y) {\r