keep working on style
diff --git a/R/add_header_above.R b/R/add_header_above.R
index d3634fa..4c83a8e 100644
--- a/R/add_header_above.R
+++ b/R/add_header_above.R
@@ -94,7 +94,9 @@
   cline_end <- cumsum(header_df$colspan)
   cline_start <- c(0, cline_end) + 1
   cline_start <- cline_start[-length(cline_start)]
-  cline_type <- switch(booktabs + 1, "\\\\cline{", "\\\\cmidrule(l{2pt}r{2pt}){")
+  cline_type <- switch(booktabs + 1,
+                       "\\\\cline{",
+                       "\\\\cmidrule(l{2pt}r{2pt}){")
   cline <- paste0(cline_type, cline_start, "-", cline_end, "}")
   cline <- cline[trimws(header_df$header) != ""]
   cline <- paste(cline, collapse = " ")
diff --git a/R/kableExtra-package.R b/R/kableExtra-package.R
index cb4d739..11528b5 100644
--- a/R/kableExtra-package.R
+++ b/R/kableExtra-package.R
@@ -1,6 +1,6 @@
 #' kableExtra
 #'
-#' @importFrom stringr str_count
+#' @importFrom stringr str_count str_split
 #' @importFrom xml2 read_xml xml_attr xml_has_attr xml_attr<- read_html
 #' xml_child xml_children xml_name xml_add_sibling xml_add_child
 #' @importFrom rvest html_table
diff --git a/R/kable_styling.R b/R/kable_styling.R
index 9bde4f0..1d357b2 100644
--- a/R/kable_styling.R
+++ b/R/kable_styling.R
@@ -11,36 +11,38 @@
 #' "condensed" and "responsive".
 #' @param full_width A `TRUE` or `FALSE` variable controlling whether the HTML
 #' table should have 100\% width.
-#' @param float A character string determining whether and how the HTML table
+#' @param position A character string determining whether and how the HTML table
 #' should float on the page. Values could be "left", "center", "right"
 #' @param font_size A numeric input for table font size
 #'
 #' @export
 kable_styling <- function(kable_input,
                           bootstrap_options = "basic",
-                          full_width = T,
-                          float = c("center", "left", "right"),
-                          font_size = NULL,
-                          latex_hold_position = F,
-                          latex_scale_down = F) {
+                          latex_options = "basic",
+                          full_width = NULL,
+                          position = c("center", "left", "right",
+                                       "float_left", "float_right"),
+                          font_size = NULL) {
   kable_format <- attr(kable_input, "format")
   if (!kable_format %in% c("html", "latex")) {
     stop("Please specify output format in your kable function. Currently ",
          "generic markdown table using pandoc is not supported.")
   }
   if (kable_format == "html") {
+    if (is.null(full_width)) full_width <- T
     return(htmlTable_styling(kable_input,
                              bootstrap_options = bootstrap_options,
                              full_width = full_width,
-                             float = float,
+                             position = position,
                              font_size = font_size))
   }
   if (kable_format == "latex") {
-    return(pdfTable_styling(full_width = full_width,
-                            float = float,
-                            font_size = font_size,
-                            latex_hold_position = latex_hold_position,
-                            latex_scale_down = latex_scale_down))
+    if (is.null(full_width)) full_width <- F
+    return(pdfTable_styling(kable_input,
+                            latex_options = latex_options,
+                            full_width = full_width,
+                            position = position,
+                            font_size = font_size))
   }
 }
 
@@ -48,8 +50,10 @@
 htmlTable_styling <- function(kable_input,
                               bootstrap_options = "basic",
                               full_width = T,
-                              float = c("center", "left", "right"),
+                              position = c("center", "left", "right",
+                                           "float_left", "float_right"),
                               font_size = NULL) {
+
   kable_xml <- read_xml(as.character(kable_input), options = c("COMPACT"))
 
   # Modify class
@@ -86,15 +90,17 @@
     kable_xml_style <- c(kable_xml_style, "width: auto !important;")
   }
 
-  float <- match.arg(float)
-  if (float == "center") {
-    kable_xml_style <- c(kable_xml_style,
-                         "margin-left:auto; margin-right:auto;")
-  }
-  if (float == "right") {
-    kable_xml_style <- c(kable_xml_style,
-                         "float: right;")
-  }
+  position <- match.arg(position)
+  position_style <- switch(
+    position,
+    center = "margin-left: auto; margin-right: auto;",
+    left = "text-align: right;",
+    right = "margin-right: 0; margin-left: auto",
+    float_left = "float: left; margin-right: 10px;",
+    float_right = "float: right; margin-left: 10px;"
+  )
+  kable_xml_style <- c(kable_xml_style, position_style)
+
   if (length(kable_xml_style) != 0) {
     xml_attr(kable_xml, "style") <- paste(kable_xml_style, collapse = " ")
   }
@@ -104,10 +110,67 @@
 
 # LaTeX table style
 pdfTable_styling <- function(kable_input,
-                             full_width = T,
-                             float = c("center", "left", "right"),
-                             font_size = NULL,
-                             latex_hold_position = F,
-                             latex_scale_down = F) {
+                             latex_options = "basic",
+                             full_width = F,
+                             position = c("center", "left", "right",
+                                       "float_left", "float_right"),
+                             font_size = NULL) {
 
+  latex_options <- match.arg(
+    latex_options,
+    c("basic", "striped", "hold_position", "scale_down"),
+    several.ok = T
+  )
+
+  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, "\\}")
+
+
+  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}"
+    )
+  }
+
+  # 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)
+  }
+
+  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 (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 <- sub(paste0(begin_tabular, "\\{[^\\\\n]*\\}"), begin_tabular, out)
+    out <- sub(begin_tabular, paste0(begin_tabular, col_align), out)
+  }
+
+  position <- match.arg(position)
+  if (position == "right") {
+    warning("Right a")
+  }
+
+  out <- structure(out, format = "latex", class = "knitr_kable")
+  return(out)
 }
diff --git a/R/magic_mirror.R b/R/magic_mirror.R
index 6502296..a926b25 100644
--- a/R/magic_mirror.R
+++ b/R/magic_mirror.R
@@ -22,19 +22,23 @@
 #' Magic mirror for latex tables --------------
 #' @param input The output of kable
 magic_mirror_latex <- function(input){
-  kable_info <- list(tabular = NULL, booktabs = NULL, align = NULL,
-                     ncol=NULL, nrow=NULL, colnames = NULL, rownames = NULL,
-                     caption = NULL, contents = NULL)
+  kable_info <- list(tabular = NULL, booktabs = FALSE, align = NULL,
+                     valign = NULL, ncol = NULL, nrow = NULL, colnames = NULL,
+                     rownames = NULL, caption = NULL, contents = NULL,
+                     centering = FALSE, table_env = FALSE)
   # Tabular
   kable_info$tabular <- ifelse(
     grepl("\\\\begin\\{tabular\\}", input),
     "tabular", "longtable"
   )
   # Booktabs
-  kable_info$booktabs <- ifelse(grepl("\\\\toprule", input), TRUE, FALSE)
+  kable_info$booktabs <- grepl("\\\\toprule", input)
   # Align
   kable_info$align <- gsub("\\|", "", str_match(
     input, paste0("\\\\begin\\{", kable_info$tabular,"\\}.*\\{(.*?)\\}"))[2])
+  # valign
+  kable_info$valign <- gsub("\\|", "", str_match(
+    input, paste0("\\\\begin\\{", kable_info$tabular,"\\}(.*)\\{.*?\\}"))[2])
   # N of columns
   kable_info$ncol <- nchar(kable_info$align)
   # Caption
@@ -55,6 +59,11 @@
   kable_info$colnames <- str_split(kable_info$contents[1], " \\& ")[[1]]
   # Row names
   kable_info$rownames <- str_extract(kable_info$contents, "^[^ &]*")
+
+  kable_info$centering <- grepl("\\\\centering", input)
+
+  kable_info$table_env <- (!is.na(kable_info$caption) &
+                             kable_info$tabular != "longtable")
   return(kable_info)
 }
 
@@ -63,7 +72,7 @@
 #' @param input The output of kable
 magic_mirror_html <- function(input){
   kable_info <- list(table.attr = NULL, align = NULL,
-                     ncol=NULL, nrow=NULL, colnames = NULL, rownames = NULL,
+                     ncol = NULL, nrow = NULL, colnames = NULL, rownames = NULL,
                      caption = NULL, contents = NULL)
   kable_data <- html_table(read_html(input))
   # Caption