Add support for global options
diff --git a/R/add_footnote.R b/R/add_footnote.R
index 5977104..dd1bd4b 100644
--- a/R/add_footnote.R
+++ b/R/add_footnote.R
@@ -17,15 +17,24 @@
 #'
 #' @export
 add_footnote <- function(input, label = NULL,
-                         notation = c("alphabet", "number", "symbol"),
+                         notation = "alphabet",
                          threeparttable = FALSE) {
   if (is.null(label)) return(input)
 
-  notation <- match.arg(notation)
+  if (notation == "alphabet") {
+    notation <- getOption("kable_footnote_notation", "alphabet")
+  }
+  if (!threeparttable) {
+    threeparttable <- getOption("kable_footnote_threeparttable", FALSE)
+  }
+
+  notation <- match.arg(notation, c("alphabet", "number", "symbol"))
   if (notation == "symbol") {
     notation <- paste0(notation, ".", attr(input, "format"))
   }
 
+  table_info <- NULL
+
   ids.ops <- read.csv(system.file("symbol_index.csv", package = "kableExtra"))
   ids <- ids.ops[, notation]
   ids.intable <- gsub("\\*", "\\\\*", ids)
@@ -86,8 +95,8 @@
     label <- escape_latex(label)
     label <- gsub("\\\\", "\\\\\\\\", label)
 
-    kable_info <- magic_mirror(input)
-    if (kable_info$tabular == "longtable") {
+    table_info <- magic_mirror(input)
+    if (table_info$tabular == "longtable") {
       if (notation != "number") {
         warning("Notation is set to 'number' and other formats are not supported.")
         notation <- "number"
@@ -104,8 +113,8 @@
       # See http://tex.stackexchange.com/questions/50151/footnotes-in-longtable-captions
 
       count.in.caption.note <- 0
-      if (!is.na(kable_info$caption)) {
-        count.in.caption.note <- str_count(kable_info$caption, "\\[note\\]")
+      if (!is.na(table_info$caption)) {
+        count.in.caption.note <- str_count(table_info$caption, "\\[note\\]")
       }
       if (count.in.caption.note != 0) {
         caption.footnote <- paste0("\\\\addtocounter{footnote}{-",
@@ -173,17 +182,17 @@
       } else {
         table.width <- max(nchar(
           str_replace_all(
-            str_replace_all(kable_info$contents, "\\[note\\]", ""),
-            "\\[note[0-9]{1,2}\\]", ""))) + 2 * (kable_info$ncol - 1)
+            str_replace_all(table_info$contents, "\\[note\\]", ""),
+            "\\[note[0-9]{1,2}\\]", ""))) + 2 * (table_info$ncol - 1)
         footer <- ""
         for (i in 1:count.label) {
           label.wrap <- strwrap(label[i], table.width)
-          footer <- paste0(footer, "\\\\multicolumn{", kable_info$ncol,
+          footer <- paste0(footer, "\\\\multicolumn{", table_info$ncol,
                            "}{l}{\\\\textsuperscript{", ids[i], "} ",
                            label.wrap[1], "}\\\\\\\\\n")
           if (length(label.wrap) > 1) {
             for (j in 2:length(label.wrap)) {
-              footer <- paste0(footer, "\\\\multicolumn{", kable_info$ncol,
+              footer <- paste0(footer, "\\\\multicolumn{", table_info$ncol,
                                "}{l}{", label.wrap[j], "}\\\\\\\\\n")
             }
           }
@@ -198,8 +207,8 @@
   # HTML Tables -------------------
   if (attr(input, "format") == "html") {
     # Clean the entry for labels
+    table_info <- magic_mirror(input)
     label <- escape_html(label)
-
     # Replace in-table notation with appropriate symbol
     for (i in 1:count.intablenote) {
       export <- sub("\\[note\\]",
@@ -226,5 +235,6 @@
     # Paste footer to the table
     export[1] <- gsub("</tbody>\n", paste0("</tbody>\n", footer), export[1])
   }
+  attr(export, "original_kable_meta") <- table_info
   return(export)
 }
diff --git a/R/add_header_above.R b/R/add_header_above.R
index baba605..5c9531b 100644
--- a/R/add_header_above.R
+++ b/R/add_header_above.R
@@ -30,6 +30,7 @@
 # HTML
 htmlTable_add_header_above <- function(kable_input, header = NULL) {
   if (is.null(header)) return(kable_input)
+  table_info <- magic_mirror(kable_input)
   kable_xml <- read_xml(as.character(kable_input), options = c("COMPACT"))
   # somehow xml2 cannot directly search by name here (it will result in a crash)
   kable_xml_thead <- xml_child(kable_xml, 1)
@@ -49,8 +50,10 @@
 
   new_header_row <- htmlTable_new_header_generator(header)
   xml_add_child(kable_xml_thead, new_header_row, .where = 0)
-  return(structure(as.character(kable_xml), format = "html",
-                   class = "knitr_kable"))
+  out <- structure(as.character(kable_xml), format = "html",
+                   class = "knitr_kable")
+  attr(out, "original_kable_meta") <- table_info
+  return()
 }
 
 standardize_header_input <- function(header) {
@@ -88,6 +91,7 @@
                     pdfTable_new_header_generator(header, table_info$booktabs)),
              as.character(kable_input))
   out <- structure(out, format = "latex", class = "knitr_kable")
+  attr(out, "original_kable_meta") <- table_info
   return(out)
 }
 
diff --git a/R/kable_styling.R b/R/kable_styling.R
index 33027a0..44b4d0f 100644
--- a/R/kable_styling.R
+++ b/R/kable_styling.R
@@ -37,16 +37,34 @@
                           bootstrap_options = "basic",
                           latex_options = "basic",
                           full_width = NULL,
-                          position = c("center", "left", "right",
-                                       "float_left", "float_right"),
+                          position = "center",
                           font_size = NULL) {
+
+  if (length(bootstrap_options) == 1 && bootstrap_options == "basic") {
+    bootstrap_options <- getOption("kable_styling_bootstrap_options", "basic")
+  }
+  if (length(latex_options) == 1 && latex_options == "basic") {
+    latex_options <- getOption("kable_styling_latex_options", "basic")
+  }
+  if (position == "center") {
+    position <- getOption("kable_styling_position", "center")
+  }
+  position <- match.arg(position,
+                        c("center", "left", "right", "float_left", "float_right"))
+  if (is.null(font_size)) {
+    font_size <- getOption("kable_styling_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
+    if (is.null(full_width)) {
+      full_width <- getOption("kable_styling_full_width", T)
+    }
     return(htmlTable_styling(kable_input,
                              bootstrap_options = bootstrap_options,
                              full_width = full_width,
@@ -54,7 +72,9 @@
                              font_size = font_size))
   }
   if (kable_format == "latex") {
-    if (is.null(full_width)) full_width <- F
+    if (is.null(full_width)) {
+      full_width <- getOption("kable_styling_full_width", F)
+    }
     return(pdfTable_styling(kable_input,
                             latex_options = latex_options,
                             full_width = full_width,
@@ -70,7 +90,7 @@
                               position = c("center", "left", "right",
                                            "float_left", "float_right"),
                               font_size = NULL) {
-
+  table_info <- magic_mirror(kable_input)
   kable_xml <- read_xml(as.character(kable_input), options = c("COMPACT"))
 
   # Modify class
@@ -121,8 +141,11 @@
   if (length(kable_xml_style) != 0) {
     xml_attr(kable_xml, "style") <- paste(kable_xml_style, collapse = " ")
   }
-  return(structure(as.character(kable_xml), format = "html",
-                   class = "knitr_kable"))
+
+  out <- structure(as.character(kable_xml), format = "html",
+                   class = "knitr_kable")
+  attr(out, "original_kable_meta") <- table_info
+  return(out)
 }
 
 # LaTeX table style
@@ -176,6 +199,7 @@
   out <- styling_latex_position(out, table_info, position, latex_options)
 
   out <- structure(out, format = "latex", class = "knitr_kable")
+  attr(out, "original_kable_meta") <- table_info
   return(out)
 }
 
diff --git a/R/magic_mirror.R b/R/magic_mirror.R
index 9b88457..eeeb896 100644
--- a/R/magic_mirror.R
+++ b/R/magic_mirror.R
@@ -10,6 +10,9 @@
     warning("magic_mirror may not be able to produce correct result if the",
             " input table is not rendered by knitr::kable. ")
   }
+  if ("original_kable_meta" %in% names(attributes(kable_input))) {
+    return(attr(kable_input, "original_kable_meta"))
+  }
   kable_format <- attr(kable_input, "format")
   if (kable_format == "latex") {
     kable_info <- magic_mirror_latex(kable_input)
@@ -95,4 +98,3 @@
 }
 
 
-