diff --git a/R/kable_styling.R b/R/kable_styling.R
index 1d357b2..2d4d148 100644
--- a/R/kable_styling.R
+++ b/R/kable_styling.R
@@ -113,7 +113,7 @@
                              latex_options = "basic",
                              full_width = F,
                              position = c("center", "left", "right",
-                                       "float_left", "float_right"),
+                                          "float_left", "float_right"),
                              font_size = NULL) {
 
   latex_options <- match.arg(
@@ -122,55 +122,151 @@
     several.ok = T
   )
 
-  out = NULL
+  out <- NULL
   out <- as.character(kable_input)
   table_info <- magic_mirror(kable_input)
-  valign <- sub("\\[", "\\\\[", table_info$valign)
-  valign <- sub("\\]", "\\\\]", valign)
-  begin_tabular <- paste0("\\\\begin\\{", table_info$tabular, "\\}", valign)
-  end_tabular <- paste0("\\\\end\\{", table_info$tabular, "\\}")
+  table_info$valign2 <- sub("\\[", "\\\\[", table_info$valign)
+  table_info$valign2 <- sub("\\]", "\\\\]", table_info$valign2)
+  table_info$valign3 <- sub("\\[", "", table_info$valign)
+  table_info$valign3 <- sub("\\]", "", table_info$valign3)
+  table_info$begin_tabular <- paste0("\\\\begin\\{", table_info$tabular, "\\}",
+                                     table_info$valign2)
+  table_info$end_tabular <- paste0("\\\\end\\{", table_info$tabular, "\\}")
 
 
   if ("striped" %in% latex_options) {
-    usepackage_latex("xcolor", "table")
-    out <- paste0(
-      # gray!6 is the same as shadecolor ({RGB}{248, 248, 248}) in pdf_document
-      "\\rowcolors{2}{gray!6}{white}\n",
-      out,
-      "\n\\rowcolors{2}{white}{white}"
-    )
+    out <- styling_latex_striped(out)
   }
 
   # hold_position is only meaningful in a table environment
   if ("hold_position" %in% latex_options & table_info$table_env) {
-    table_env <- "\\\\begin\\{table\\}"
-    out <- sub("\\\\begin\\{table\\}", "\\\\begin\\{table\\}[!h]", out)
+    out <- styling_latex_hold_position(out)
   }
 
-  if ("scale_down" %in% latex_options | full_width) {
-    out <- sub(begin_tabular,
-               paste0("\\\\resizebox\\{\\\\textwidth\\}\\{\\!\\}\\{",
-                      begin_tabular),
-               out)
-    out <- sub(end_tabular, paste0(end_tabular, "\\}"), out)
+  if ("scale_down" %in% latex_options) {
+    out <- styling_latex_scale_down(out, table_info)
   }
 
   if (full_width) {
-    size_matrix <- sapply(sapply(table_info$contents, str_split, " & "), nchar)
-    col_max_length <- apply(size_matrix, 1, max) + 4
-    col_ratio <- round(col_max_length / sum(col_max_length) * 0.9, 2)
-    col_align <- paste0("p{", col_ratio, "\\\\hsize}")
-    col_align <- paste0("{", paste(col_align, collapse = ""), "}")
+    out <- styling_latex_full_width(out, table_info)
+  }
 
-    out <- sub(paste0(begin_tabular, "\\{[^\\\\n]*\\}"), begin_tabular, out)
-    out <- sub(begin_tabular, paste0(begin_tabular, col_align), out)
+  if (!is.null(font_size)) {
+    out <- styling_latex_font_size(out, table_info, font_size)
   }
 
   position <- match.arg(position)
-  if (position == "right") {
-    warning("Right a")
-  }
+  out <- styling_latex_position(out, table_info, position, latex_options)
 
   out <- structure(out, format = "latex", class = "knitr_kable")
   return(out)
 }
+
+styling_latex_striped <- function(x) {
+  usepackage_latex("xcolor", "table")
+  paste0(
+    # gray!6 is the same as shadecolor ({RGB}{248, 248, 248}) in pdf_document
+    "\\rowcolors{2}{gray!6}{white}\n", x, "\n\\rowcolors{2}{white}{white}")
+}
+
+styling_latex_hold_position <- function(x) {
+  sub("\\\\begin\\{table\\}", "\\\\begin\\{table\\}[!h]", x)
+}
+
+styling_latex_scale_down <- function(x, table_info) {
+  # You cannot put longtable in a resizebox
+  # http://tex.stackexchange.com/questions/83457/how-to-resize-or-scale-a-longtable-revised
+  if (table_info$tabular == "longtable") {
+    warning("Longtable cannot be resized.")
+    return(x)
+  }
+  x <- sub(table_info$begin_tabular,
+           paste0("\\\\resizebox\\{\\\\textwidth\\}\\{\\!\\}\\{",
+                  table_info$begin_tabular),
+           x)
+  sub(table_info$end_tabular, paste0(table_info$end_tabular, "\\}"), x)
+}
+
+styling_latex_full_width <- function(x, table_info) {
+  size_matrix <- sapply(sapply(table_info$contents, str_split, " & "), nchar)
+  col_max_length <- apply(size_matrix, 1, max) + 4
+  col_ratio <- round(col_max_length / sum(col_max_length), 2)
+  col_align <- paste0("p{\\\\dimexpr", col_ratio,
+                      "\\\\linewidth-2\\\\tabcolsep}")
+  col_align <- paste0("{", paste(col_align, collapse = ""), "}")
+  x <- sub(paste0(table_info$begin_tabular, "\\{[^\\\\n]*\\}"),
+           table_info$begin_tabular, x)
+  sub(table_info$begin_tabular,
+      paste0(table_info$begin_tabular, col_align), x)
+}
+
+styling_latex_position <- function(x, table_info, position, latex_options) {
+  hold_position <- "hold_position" %in% latex_options
+  switch(
+    position,
+    center = styling_latex_position_center(x, table_info, hold_position),
+    left = styling_latex_position_left(x, table_info),
+    right = styling_latex_position_right(x, table_info, hold_position),
+    float_left = styling_latex_position_float(x, table_info, "l"),
+    float_right = styling_latex_position_float(x, table_info, "r")
+  )
+}
+
+styling_latex_position_center <- function(x, table_info, hold_position) {
+  if (!table_info$table_env & table_info$tabular == "tabular") {
+    table_env_setup <- "\\begin{table}"
+    if (hold_position) {
+      table_env_setup <- paste0(table_env_setup, "[!h]")
+    }
+    return(paste0(table_env_setup, "\n\\centering", x, "\n\\end{table}"))
+  }
+  return(x)
+}
+
+styling_latex_position_left <- function(x, table_info) {
+  if (table_info$tabular != "longtable") return(sub("\\\\centering\\n", "", x))
+  longtable_option <- "\\[l\\]"
+  sub(paste0("\\\\begin\\{longtable\\}", table_info$valign2),
+      paste0("\\\\begin\\{longtable\\}", longtable_option), x)
+}
+
+styling_latex_position_right <- function(x, table_info, hold_position) {
+  warning("Position = right is only supported for longtable in LaTeX. ",
+          "Setting back to center...")
+  styling_latex_position_center(x, table_info, hold_position)
+}
+
+styling_latex_position_float <- function(x, table_info, option) {
+  if (table_info$tabular == "longtable") {
+    warning("wraptable is not supported for longtable.")
+    if (option == "l") return(styling_latex_position_left(x, table_info))
+    if (option == "r") return(styling_latex_position_right(x, table_info, F))
+  }
+  if (table_info$table_env) {
+    usepackage_latex("wrapfig")
+    size_matrix <- sapply(sapply(table_info$contents, str_split, " & "), nchar)
+    col_max_length <- apply(size_matrix, 1, max) + 4
+    option <- sprintf("\\\\begin\\{wraptable\\}\\{%s\\}", option)
+    option <- paste0(option, "\\{",sum(col_max_length) * 0.15, "cm\\}")
+    x <- sub("\\\\begin\\{table\\}\\[\\!h\\]", "\\\\begin\\{table\\}", x)
+    x <- sub("\\\\begin\\{table\\}", option, x)
+    x <- sub("\\\\end\\{table\\}", "\\\\end\\{wraptable\\}", x)
+    return(x)
+  }
+}
+
+styling_latex_font_size <- function(x, table_info, font_size) {
+  row_height <- font_size + 2
+  if (table_info$tabular == "tabular" & table_info$table_env) {
+    return(sub(table_info$begin_tabular,
+               paste0("\\\\fontsize\\{", font_size, "\\}\\{", row_height,
+                      "\\}\\\\selectfont\n", table_info$begin_tabular),
+               x))
+  }
+  # For longtable and tabular without table environment. Simple wrap around
+  # fontsize is good enough
+  return(paste0(
+    "\\begingroup\\fontsize{", font_size, "}{", row_height, "}\\selectfont\n", x,
+    "\\endgroup"
+  ))
+}
