]> code.delx.au - gnu-emacs/blobdiff - lisp/org/org-latex.el
Spelling fixes.
[gnu-emacs] / lisp / org / org-latex.el
index ffec1be7a561fbaab9a56aa70dfcc6bb8c2f5c69..7abf85a7092c8940849b3ee4effc6e2068ecf900 100644 (file)
@@ -1,10 +1,10 @@
 ;;; org-latex.el --- LaTeX exporter for org-mode
 ;;
-;; Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 2007-2011 Free Software Foundation, Inc.
 ;;
 ;; Emacs Lisp Archive Entry
 ;; Filename: org-latex.el
-;; Version: 6.33x
+;; Version: 7.7
 ;; Author: Bastien Guerry <bzg AT altern DOT org>
 ;; Maintainer: Carsten Dominik <carsten.dominik AT gmail DOT com>
 ;; Keywords: org, wp, tex
 (require 'org)
 (require 'org-exp)
 (require 'org-macs)
+(require 'org-beamer)
 
 ;;; Variables:
 (defvar org-export-latex-class nil)
+(defvar org-export-latex-class-options nil)
 (defvar org-export-latex-header nil)
 (defvar org-export-latex-append-header nil)
 (defvar org-export-latex-options-plist nil)
@@ -63,6 +65,8 @@
 (defvar org-export-latex-display-custom-times nil)
 (defvar org-export-latex-all-targets-re nil)
 (defvar org-export-latex-add-level 0)
+(defvar org-export-latex-footmark-seen nil
+  "List of footnotes markers seen so far by exporter.")
 (defvar org-export-latex-sectioning "")
 (defvar org-export-latex-sectioning-depth 0)
 (defvar org-export-latex-special-keyword-regexp
@@ -71,9 +75,8 @@
          org-closed-string"\\)")
   "Regexp matching special time planning keywords plus the time after it.")
 
-(defvar latexp)    ; dynamically scoped from org.el
-(defvar re-quote)  ; dynamically scoped from org.el
-(defvar commentsp) ; dynamically scoped from org.el
+(defvar org-re-quote)  ; dynamically scoped from org.el
+(defvar org-commentsp) ; dynamically scoped from org.el
 
 ;;; User variables:
 
 
 (defcustom org-export-latex-classes
   '(("article"
-     "\\documentclass[11pt]{article}
-\\usepackage[utf8]{inputenc}
-\\usepackage[T1]{fontenc}
-\\usepackage{graphicx}
-\\usepackage{longtable}
-\\usepackage{float}
-\\usepackage{wrapfig}
-\\usepackage{soul}
-\\usepackage{amssymb}
-\\usepackage{hyperref}"
+     "\\documentclass[11pt]{article}"
      ("\\section{%s}" . "\\section*{%s}")
      ("\\subsection{%s}" . "\\subsection*{%s}")
      ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
      ("\\paragraph{%s}" . "\\paragraph*{%s}")
      ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
     ("report"
-     "\\documentclass[11pt]{report}
-\\usepackage[utf8]{inputenc}
-\\usepackage[T1]{fontenc}
-\\usepackage{graphicx}
-\\usepackage{longtable}
-\\usepackage{float}
-\\usepackage{wrapfig}
-\\usepackage{soul}
-\\usepackage{amssymb}
-\\usepackage{hyperref}"
+     "\\documentclass[11pt]{report}"
      ("\\part{%s}" . "\\part*{%s}")
      ("\\chapter{%s}" . "\\chapter*{%s}")
      ("\\section{%s}" . "\\section*{%s}")
      ("\\subsection{%s}" . "\\subsection*{%s}")
      ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))
     ("book"
-     "\\documentclass[11pt]{book}
-\\usepackage[utf8]{inputenc}
-\\usepackage[T1]{fontenc}
-\\usepackage{graphicx}
-\\usepackage{longtable}
-\\usepackage{float}
-\\usepackage{wrapfig}
-\\usepackage{soul}
-\\usepackage{amssymb}
-\\usepackage{hyperref}"
+     "\\documentclass[11pt]{book}"
      ("\\part{%s}" . "\\part*{%s}")
      ("\\chapter{%s}" . "\\chapter*{%s}")
      ("\\section{%s}" . "\\section*{%s}")
      ("\\subsection{%s}" . "\\subsection*{%s}")
-     ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
+     ("\\subsubsection{%s}" . "\\subsubsection*{%s}"))
+    ("beamer"
+     "\\documentclass{beamer}"
+     org-beamer-sectioning
+     ))
   "Alist of LaTeX classes and associated header and structure.
 If #+LaTeX_CLASS is set in the buffer, use its value and the
 associated information.  Here is the structure of each cell:
@@ -145,11 +125,60 @@ associated information.  Here is the structure of each cell:
     (numbered-section . unnumbered-section\)
     ...\)
 
-A %s formatter is mandatory in each section string and will be
-replaced by the title of the section.
+The header string
+-----------------
+
+The HEADER-STRING is the header that will be inserted into the LaTeX file.
+It should contain the \\documentclass macro, and anything else that is needed
+for this setup.  To this header, the following commands will be added:
+
+- Calls to \\usepackage for all packages mentioned in the variables
+  `org-export-latex-default-packages-alist' and
+  `org-export-latex-packages-alist'.  Thus, your header definitions should
+  avoid to also request these packages.
+
+- Lines specified via \"#+LaTeX_HEADER:\"
+
+If you need more control about the sequence in which the header is built
+up, or if you want to exclude one of these building blocks for a particular
+class, you can use the following macro-like placeholders.
+
+ [DEFAULT-PACKAGES]      \\usepackage statements for default packages
+ [NO-DEFAULT-PACKAGES]   do not include any of the default packages
+ [PACKAGES]              \\usepackage statements for packages
+ [NO-PACKAGES]           do not include the packages
+ [EXTRA]                 the stuff from #+LaTeX_HEADER
+ [NO-EXTRA]              do not include #+LaTeX_HEADER stuff
+ [BEAMER-HEADER-EXTRA]   the beamer extra headers
+
+So a header like
+
+  \\documentclass{article}
+  [NO-DEFAULT-PACKAGES]
+  [EXTRA]
+  \\providecommand{\\alert}[1]{\\textbf{#1}}
+  [PACKAGES]
+
+will omit the default packages, and will include the #+LaTeX_HEADER lines,
+then have a call to \\providecommand, and then place \\usepackage commands
+based on the content of `org-export-latex-packages-alist'.
+
+If your header or `org-export-latex-default-packages-alist' inserts
+\"\\usepackage[AUTO]{inputenc}\", AUTO will automatically be replaced with
+a coding system derived from `buffer-file-coding-system'.  See also the
+variable `org-export-latex-inputenc-alist' for a way to influence this
+mechanism.
+
+The sectioning structure
+------------------------
+
+The sectioning structure of the class is given by the elements following
+the header string.  For each sectioning level, a number of strings is
+specified.  A %s formatter is mandatory in each section string and will
+be replaced by the title of the section.
 
 Instead of a cons cell (numbered . unnumbered), you can also provide a list
-of 2-4 elements,
+of 2 or 4 elements,
 
   (numbered-open numbered-close)
 
@@ -157,9 +186,15 @@ or
 
   (numbered-open numbered-close unnumbered-open unnumbered-close)
 
-providing opening and closing strings for an environment that should
+providing opening and closing strings for a LaTeX environment that should
 represent the document section.  The opening clause should have a %s
-to represent the section title."
+to represent the section title.
+
+Instead of a list of sectioning commands, you can also specify a
+function name.  That function will be called with two parameters,
+the (reduced) level of the headline, and the headline text.  The function
+must return a cons cell with the (possibly modified) headline text, and the
+sectioning list in the cdr."
   :group 'org-export-latex
   :type '(repeat
          (list (string :tag "LaTeX class")
@@ -167,27 +202,44 @@ to represent the section title."
                (repeat :tag "Levels" :inline t
                        (choice
                         (cons :tag "Heading"
-                              (string :tag "numbered")
-                              (string :tag "unnumbered)"))
+                              (string :tag "  numbered")
+                              (string :tag "unnumbered"))
                         (list :tag "Environment"
-                              (string :tag "Opening (numbered)  ")
-                              (string :tag "Closing (numbered)  ")
+                              (string :tag "Opening   (numbered)")
+                              (string :tag "Closing   (numbered)")
                               (string :tag "Opening (unnumbered)")
-                              (string :tag "Closing (unnumbered)")))))))
+                              (string :tag "Closing (unnumbered)"))
+                        (function :tag "Hook computing sectioning"))))))
+
+(defcustom org-export-latex-inputenc-alist nil
+  "Alist of inputenc coding system names, and what should really be used.
+For example, adding an entry
+
+      (\"utf8\" . \"utf8x\")
+
+will cause \\usepackage[utf8x]{inputenc} to be used for buffers that
+are written as utf8 files."
+  :group 'org-export-latex
+  :type '(repeat
+         (cons
+          (string :tag "Derived from buffer")
+          (string :tag "Use this instead"))))
+
 
 (defcustom org-export-latex-emphasis-alist
   '(("*" "\\textbf{%s}" nil)
     ("/" "\\emph{%s}" nil)
     ("_" "\\underline{%s}" nil)
     ("+" "\\st{%s}" nil)
-    ("=" "\\verb" t)
+    ("=" "\\protectedtexttt" t)
     ("~" "\\verb" t))
   "Alist of LaTeX expressions to convert emphasis fontifiers.
 Each element of the list is a list of three elements.
 The first element is the character used as a marker for fontification.
 The second element is a formatting string to wrap fontified text with.
 If it is \"\\verb\", Org will automatically select a delimiter
-character that is not in the string.
+character that is not in the string.  \"\\protectedtexttt\" will use \\texttt
+to typeset and try to protect special characters.
 The third element decides whether to protect converted text from other
 conversions."
   :group 'org-export-latex
@@ -208,7 +260,7 @@ For example \orgTITLE for #+TITLE."
   :type 'boolean)
 
 (defcustom org-export-latex-date-format
-  "%d %B %Y"
+  "\\today"
   "Format string for \\date{...}."
   :group 'org-export-latex
   :type 'string)
@@ -230,16 +282,73 @@ markup defined, the first one in the association list will be used."
                   (string :tag "Keyword")
                   (string :tag "Markup")))))
 
+(defcustom org-export-latex-tag-markup "\\textbf{%s}"
+  "Markup for tags, as a printf format."
+  :group 'org-export-latex
+  :type 'string)
+
 (defcustom org-export-latex-timestamp-markup "\\textit{%s}"
   "A printf format string to be applied to time stamps."
   :group 'org-export-latex
   :type 'string)
 
+(defcustom org-export-latex-timestamp-inactive-markup "\\textit{%s}"
+  "A printf format string to be applied to inactive time stamps."
+  :group 'org-export-latex
+  :type 'string)
+
 (defcustom org-export-latex-timestamp-keyword-markup "\\texttt{%s}"
   "A printf format string to be applied to time stamps."
   :group 'org-export-latex
   :type 'string)
 
+(defcustom org-export-latex-href-format "\\href{%s}{%s}"
+  "A printf format string to be applied to href links.
+The format must contain either two %s instances or just one.
+If it contains two %s instances, the first will be filled with
+the link, the second with the link description.  If it contains
+only one, the %s will be filled with the link."
+  :group 'org-export-latex
+  :type 'string)
+
+(defcustom org-export-latex-hyperref-format "\\hyperref[%s]{%s}"
+  "A printf format string to be applied to hyperref links.
+The format must contain one or two %s instances.  The first one
+will be filled with the link, the second with its description."
+  :group 'org-export-latex
+  :type 'string)
+
+(defcustom org-export-latex-footnote-separator "\\textsuperscript{,}\\,"
+  "Text used to separate footnotes."
+  :group 'org-export-latex
+  :type 'string)
+
+(defcustom org-export-latex-quotes
+  '(("fr" ("\\(\\s-\\|[[(]\\)\"" . "«~") ("\\(\\S-\\)\"" . "~»") ("\\(\\s-\\|(\\)'" . "'"))
+    ("en" ("\\(\\s-\\|[[(]\\)\"" . "``") ("\\(\\S-\\)\"" . "''") ("\\(\\s-\\|(\\)'" . "`")))
+  "Alist for quotes to use when converting english double-quotes.
+
+The CAR of each item in this alist is the language code.
+The CDR of each item in this alist is a list of three CONS:
+- the first CONS defines the opening quote;
+- the second CONS defines the closing quote;
+- the last CONS defines single quotes.
+
+For each item in a CONS, the first string is a regexp
+for allowed characters before/after the quote, the second
+string defines the replacement string for this quote."
+  :group 'org-export-latex
+  :type '(list
+         (cons :tag "Opening quote"
+               (string :tag "Regexp for char before")
+               (string :tag "Replacement quote     "))
+         (cons :tag "Closing quote"
+               (string :tag "Regexp for char after ")
+               (string :tag "Replacement quote     "))
+         (cons :tag "Single quote"
+               (string :tag "Regexp for char before")
+               (string :tag "Replacement quote     "))))
+
 (defcustom org-export-latex-tables-verbatim nil
   "When non-nil, tables are exported verbatim."
   :group 'org-export-latex
@@ -284,7 +393,7 @@ string should be like \"\\end{itemize\"."
                 (string :tag "Use a section string" :value "\\subparagraph{%s}")))
 
 (defcustom org-export-latex-list-parameters
-  '(:cbon "$\\boxtimes$" :cboff "$\\Box$")
+  '(:cbon "$\\boxtimes$" :cboff "$\\Box$" :cbtrans "$\\boxminus$")
   "Parameters for the LaTeX list exporter.
 These parameters will be passed on to `org-list-to-latex', which in turn
 will pass them (combined with the LaTeX default list parameters) to
@@ -305,7 +414,7 @@ Defaults to \\begin{verbatim} and \\end{verbatim}."
               (string :tag "Close")))
 
 (defcustom org-export-latex-listings nil
-  "Non-nil means, export source code using the listings package.
+  "Non-nil means export source code using the listings package.
 This package will fontify source code, possibly even with color.
 If you want to use this, you also need to make LaTeX use the
 listings package, and if you want to have color, the color
@@ -314,12 +423,30 @@ for example using customize, or with something like
 
   (require 'org-latex)
   (add-to-list 'org-export-latex-packages-alist '(\"\" \"listings\"))
-  (add-to-list 'org-export-latex-packages-alist '(\"\" \"color\"))"
+  (add-to-list 'org-export-latex-packages-alist '(\"\" \"color\"))
+
+Alternatively,
+
+  (setq org-export-latex-listings 'minted)
+
+causes source code to be exported using the minted package as
+opposed to listings.  If you want to use minted, you need to add
+the minted package to `org-export-latex-packages-alist', for
+example using customize, or with
+
+  (require 'org-latex)
+  (add-to-list 'org-export-latex-packages-alist '(\"\" \"minted\"))
+
+In addition, it is necessary to install
+pygments (http://pygments.org), and to configure the variable
+`org-latex-to-pdf-process' so that the -shell-escape option is
+passed to pdflatex.
+"
   :group 'org-export-latex
   :type 'boolean)
 
 (defcustom org-export-latex-listings-langs
-  '((emacs-lisp "Lisp") (lisp "Lisp")
+  '((emacs-lisp "Lisp") (lisp "Lisp") (clojure "Lisp")
     (c "C") (cc "C++")
     (fortran "fortran")
     (perl "Perl") (cperl "Perl") (python "Python") (ruby "Ruby")
@@ -328,7 +455,7 @@ for example using customize, or with something like
     (shell-script "bash")
     (gnuplot "Gnuplot")
     (ocaml "Caml") (caml "Caml")
-    (sql "SQL"))
+    (sql "SQL") (sqlite "sql"))
   "Alist mapping languages to their listing language counterpart.
 The key is a symbol, the major mode symbol without the \"-mode\".
 The value is the string that should be inserted as the language parameter
@@ -341,9 +468,102 @@ hurt if it is present."
           (symbol :tag "Major mode       ")
           (string :tag "Listings language"))))
 
+(defcustom org-export-latex-listings-w-names t
+  "Non-nil means export names of named code blocks.
+Code blocks exported with the listings package (controlled by the
+`org-export-latex-listings' variable) can be named in the style
+of noweb."
+  :group 'org-export-latex
+  :type 'boolean)
+
+(defcustom org-export-latex-minted-langs
+  '((emacs-lisp "common-lisp")
+    (cc "c++")
+    (cperl "perl")
+    (shell-script "bash")
+    (caml "ocaml"))
+  "Alist mapping languages to their minted language counterpart.
+The key is a symbol, the major mode symbol without the \"-mode\".
+The value is the string that should be inserted as the language parameter
+for the minted package.  If the mode name and the listings name are
+the same, the language does not need an entry in this list - but it does not
+hurt if it is present.
+
+Note that minted uses all lower case for language identifiers,
+and that the full list of language identifiers can be obtained
+with:
+pygmentize -L lexers
+"
+  :group 'org-export-latex
+  :type '(repeat
+         (list
+          (symbol :tag "Major mode       ")
+          (string :tag "Listings language"))))
+
+(defcustom org-export-latex-listings-options nil
+  "Association list of options for the latex listings package.
+
+These options are supplied as a comma-separated list to the
+\\lstset command. Each element of the association list should be
+a list containing two strings: the name of the option, and the
+value. For example,
+
+  (setq org-export-latex-listings-options
+    '((\"basicstyle\" \"\\small\")
+      (\"keywordstyle\" \"\\color{black}\\bfseries\\underbar\")))
+
+will typeset the code in a small size font with underlined, bold
+black keywords.
+
+Note that the same options will be applied to blocks of all
+languages."
+  :group 'org-export-latex
+  :type '(repeat
+         (list
+          (string :tag "Listings option name ")
+          (string :tag "Listings option value"))))
+
+(defcustom org-export-latex-minted-options nil
+  "Association list of options for the latex minted package.
+
+These options are supplied within square brackets in
+\\begin{minted} environments. Each element of the alist should be
+a list containing two strings: the name of the option, and the
+value. For example,
+
+  (setq org-export-latex-minted-options
+    '((\"bgcolor\" \"bg\") (\"frame\" \"lines\")))
+
+will result in src blocks being exported with
+
+\\begin{minted}[bgcolor=bg,frame=lines]{<LANG>}
+
+as the start of the minted environment. Note that the same
+options will be applied to blocks of all languages."
+  :group 'org-export-latex
+  :type '(repeat
+         (list
+          (string :tag "Minted option name ")
+          (string :tag "Minted option value"))))
+
+(defvar org-export-latex-custom-lang-environments nil
+  "Association list mapping languages to language-specific latex
+  environments used during export of src blocks by the listings
+  and minted latex packages. For example,
+
+  (setq org-export-latex-custom-lang-environments
+     '((python \"pythoncode\")))
+
+  would have the effect that if org encounters begin_src python
+  during latex export it will output
+
+  \\begin{pythoncode}
+  <src block body>
+  \\end{pythoncode}")
+
 (defcustom org-export-latex-remove-from-headlines
   '(:todo nil :priority nil :tags nil)
-  "A plist of keywords to remove from headlines. OBSOLETE.
+  "A plist of keywords to remove from headlines.  OBSOLETE.
 Non-nil means remove this keyword type from the headline.
 
 Don't remove the keys, just change their values.
@@ -354,66 +574,119 @@ and `org-export-with-tags' instead."
   :type 'plist
   :group 'org-export-latex)
 
-(defcustom org-export-latex-image-default-option "width=10em"
+(defcustom org-export-latex-image-default-option "width=.9\\linewidth"
   "Default option for images."
   :group 'org-export-latex
   :type 'string)
 
+(defcustom org-latex-default-figure-position "htb"
+  "Default position for latex figures."
+  :group 'org-export-latex
+  :type 'string)
+
+(defcustom org-export-latex-tabular-environment "tabular"
+  "Default environment used to build tables."
+  :group 'org-export-latex
+  :type 'string)
+
 (defcustom org-export-latex-inline-image-extensions
   '("pdf" "jpeg" "jpg" "png" "ps" "eps")
   "Extensions of image files that can be inlined into LaTeX.
 Note that the image extension *actually* allowed depend on the way the
 LaTeX file is processed.  When used with pdflatex, pdf, jpg and png images
-are OK.  When processing through dvi to Postscript, only ps and eps are
+are OK.  When processing through dvi to PostScript, only ps and eps are
 allowed.  The default we use here encompasses both."
   :group 'org-export-latex
   :type '(repeat (string :tag "Extension")))
 
 (defcustom org-export-latex-coding-system nil
-  "Coding system for the exported LaTex file."
+  "Coding system for the exported LaTeX file."
   :group 'org-export-latex
   :type 'coding-system)
 
 (defgroup org-export-pdf nil
   "Options for exporting Org-mode files to PDF, via LaTeX."
-  :tag "Org Export LaTeX"
+  :tag "Org Export PDF"
   :group 'org-export-latex
   :group 'org-export)
 
 (defcustom org-latex-to-pdf-process
-  '("pdflatex -interaction nonstopmode %s"
-    "pdflatex -interaction nonstopmode %s")
+  '("pdflatex -interaction nonstopmode -output-directory %o %f"
+    "pdflatex -interaction nonstopmode -output-directory %o %f"
+    "pdflatex -interaction nonstopmode -output-directory %o %f")
   "Commands to process a LaTeX file to a PDF file.
 This is a list of strings, each of them will be given to the shell
-as a command.  %s in the command will be replaced by the full file name, %b
-by the file base name (i.e. without extension).
+as a command.  %f in the command will be replaced by the full file name, %b
+by the file base name (i.e. without extension) and %o by the base directory
+of the file.
+
 The reason why this is a list is that it usually takes several runs of
-pdflatex, maybe mixed with a call to bibtex.  Org does not have a clever
+`pdflatex', maybe mixed with a call to `bibtex'.  Org does not have a clever
 mechanism to detect which of these commands have to be run to get to a stable
 result, and it also does not do any error checking.
 
+By default, Org uses 3 runs of `pdflatex' to do the processing.  If you
+have texi2dvi on your system and if that does not cause the infamous
+egrep/locale bug:
+
+     http://lists.gnu.org/archive/html/bug-texinfo/2010-03/msg00031.html
+
+then `texi2dvi' is the superior choice.  Org does offer it as one
+of the customize options.
+
 Alternatively, this may be a Lisp function that does the processing, so you
 could use this to apply the machinery of AUCTeX or the Emacs LaTeX mode.
 This function should accept the file name as its single argument."
-  :group 'org-export-latex
-  :type '(choice (repeat :tag "Shell command sequence"
+  :group 'org-export-pdf
+  :type '(choice
+         (repeat :tag "Shell command sequence"
                  (string :tag "Shell command"))
-                (function)))
+         (const :tag "2 runs of pdflatex"
+                ("pdflatex -interaction nonstopmode -output-directory %o %f"
+                  "pdflatex -interaction nonstopmode -output-directory %o %f"))
+         (const :tag "3 runs of pdflatex"
+                ("pdflatex -interaction nonstopmode -output-directory %o %f"
+                  "pdflatex -interaction nonstopmode -output-directory %o %f"
+                  "pdflatex -interaction nonstopmode -output-directory %o %f"))
+         (const :tag "pdflatex,bibtex,pdflatex,pdflatex"
+                ("pdflatex -interaction nonstopmode -output-directory %o %f"
+                  "bibtex %b"
+                  "pdflatex -interaction nonstopmode -output-directory %o %f"
+                  "pdflatex -interaction nonstopmode -output-directory %o %f"))
+         (const :tag "texi2dvi"
+                ("texi2dvi -p -b -c -V %f"))
+         (const :tag "rubber"
+                ("rubber -d --into %o %f"))
+         (function)))
+
+(defcustom org-export-pdf-logfiles
+  '("aux" "idx" "log" "out" "toc" "nav" "snm" "vrb")
+  "The list of file extensions to consider as LaTeX logfiles."
+  :group 'org-export-pdf
+  :type '(repeat (string :tag "Extension")))
 
 (defcustom org-export-pdf-remove-logfiles t
-  "Non-nil means, remove the logfiles produced by PDF production.
+  "Non-nil means remove the logfiles produced by PDF production.
 These are the .aux, .log, .out, and .toc files."
   :group 'org-export-pdf
   :type 'boolean)
 
 ;;; Hooks
 
+(defvar org-export-latex-after-initial-vars-hook nil
+  "Hook run before LaTeX export.
+The exact moment is after the initial variables like org-export-latex-class
+have been determined from the environment.")
+
 (defvar org-export-latex-after-blockquotes-hook nil
   "Hook run during LaTeX export, after blockquote, verse, center are done.")
 
 (defvar org-export-latex-final-hook nil
   "Hook run in the finalized LaTeX buffer.")
 
+(defvar org-export-latex-after-save-hook nil
+  "Hook run in the finalized LaTeX buffer, after it has been saved.")
+
 ;;; Autoload functions:
 
 ;;;###autoload
@@ -477,7 +750,7 @@ a Lisp program could call this function in the following way:
 When called interactively, the output buffer is selected, and shown
 in a window.  A non-interactive call will only return the buffer."
   (interactive "r\nP")
-  (when (interactive-p)
+  (when (org-called-interactively-p 'any)
     (setq buffer "*Org LaTeX Export*"))
   (let ((transient-mark-mode t) (zmacs-regions t)
        ext-plist rtn)
@@ -489,7 +762,7 @@ in a window.  A non-interactive call will only return the buffer."
               nil nil ext-plist
               buffer body-only))
     (if (fboundp 'deactivate-mark) (deactivate-mark))
-    (if (and (interactive-p) (bufferp rtn))
+    (if (and (org-called-interactively-p 'any) (bufferp rtn))
        (switch-to-buffer-other-window rtn)
       rtn)))
 
@@ -510,10 +783,13 @@ non-nil, create a buffer with that name and export to that
 buffer.  If TO-BUFFER is the symbol `string', don't leave any
 buffer behind but just return the resulting LaTeX as a string.
 When BODY-ONLY is set, don't produce the file header and footer,
-simply return the content of \begin{document}...\end{document},
-without even the \begin{document} and \end{document} commands.
+simply return the content of \\begin{document}...\\end{document},
+without even the \\begin{document} and \\end{document} commands.
 when PUB-DIR is set, use this as the publishing directory."
   (interactive "P")
+  (when (and (not body-only) arg (listp arg)) (setq body-only t))
+  (run-hooks 'org-export-first-hook)
+
   ;; Make sure we have a file name when we need it.
   (when (and (not (or to-buffer body-only))
             (not buffer-file-name))
@@ -525,12 +801,20 @@ when PUB-DIR is set, use this as the publishing directory."
 
   (message "Exporting to LaTeX...")
   (org-unmodified
-   (remove-text-properties (point-min) (point-max)
-                          '(:org-license-to-kill nil)))
+   (let ((inhibit-read-only t))
+     (remove-text-properties (point-min) (point-max)
+                            '(:org-license-to-kill nil))))
   (org-update-radio-target-regexp)
   (org-export-latex-set-initial-vars ext-plist arg)
+  (setq org-export-opt-plist org-export-latex-options-plist
+       org-export-footnotes-data (org-footnote-all-labels 'with-defs)
+       org-export-footnotes-seen nil
+       org-export-latex-footmark-seen nil)
+  (org-install-letbind)
+  (run-hooks 'org-export-latex-after-initial-vars-hook)
   (let* ((wcf (current-window-configuration))
-        (opt-plist org-export-latex-options-plist)
+        (opt-plist
+         (org-export-process-option-filters org-export-latex-options-plist))
         (region-p (org-region-active-p))
         (rbeg (and region-p (region-beginning)))
         (rend (and region-p (region-end)))
@@ -547,27 +831,40 @@ when PUB-DIR is set, use this as the publishing directory."
                              (org-export-add-subtree-options opt-plist rbeg)
                            opt-plist)))
         ;; Make sure the variable contains the updated values.
-        (org-export-latex-options-plist opt-plist)
+        (org-export-latex-options-plist (setq org-export-opt-plist opt-plist))
+        ;; The following two are dynamically scoped into other
+        ;; routines below.
+        (org-current-export-dir
+         (or pub-dir (org-export-directory :html opt-plist)))
+        (org-current-export-file buffer-file-name)
         (title (or (and subtree-p (org-export-get-title-from-subtree))
                    (plist-get opt-plist :title)
                    (and (not
                          (plist-get opt-plist :skip-before-1st-heading))
                         (org-export-grab-title-from-buffer))
-                   (file-name-sans-extension
-                    (file-name-nondirectory buffer-file-name))))
-        (filename (concat (file-name-as-directory
-                           (or pub-dir
-                               (org-export-directory :LaTeX ext-plist)))
-                          (file-name-sans-extension
-                           (or (and subtree-p
-                                    (org-entry-get rbeg "EXPORT_FILE_NAME" t))
-                               (file-name-nondirectory ;sans-extension
-                                buffer-file-name)))
-                          ".tex"))
-        (filename (if (equal (file-truename filename)
-                             (file-truename buffer-file-name))
-                      (concat filename ".tex")
-                    filename))
+                   (and buffer-file-name
+                        (file-name-sans-extension
+                         (file-name-nondirectory buffer-file-name)))
+                   "No Title"))
+        (filename
+         (and (not to-buffer)
+              (concat
+               (file-name-as-directory
+                (or pub-dir
+                    (org-export-directory :LaTeX ext-plist)))
+               (file-name-sans-extension
+                (or (and subtree-p
+                         (org-entry-get rbeg "EXPORT_FILE_NAME" t))
+                    (file-name-nondirectory ;sans-extension
+                     (or buffer-file-name
+                         (error "Don't know which export file to use")))))
+               ".tex")))
+        (filename
+         (and filename
+              (if (equal (file-truename filename)
+                         (file-truename (or buffer-file-name "dummy.org")))
+                  (concat filename ".tex")
+                filename)))
         (buffer (if to-buffer
                     (cond
                      ((eq to-buffer 'string) (get-buffer-create
@@ -602,11 +899,30 @@ when PUB-DIR is set, use this as the publishing directory."
         (region (buffer-substring
                  (if region-p (region-beginning) (point-min))
                  (if region-p (region-end) (point-max))))
+        (text
+         (and text (string-match "\\S-" text)
+              (org-export-preprocess-string
+               text
+               :emph-multiline t
+               :for-backend 'latex
+               :comments nil
+               :tags (plist-get opt-plist :tags)
+               :priority (plist-get opt-plist :priority)
+               :footnotes (plist-get opt-plist :footnotes)
+               :drawers (plist-get opt-plist :drawers)
+               :timestamps (plist-get opt-plist :timestamps)
+               :todo-keywords (plist-get opt-plist :todo-keywords)
+               :tasks (plist-get opt-plist :tasks)
+               :add-text nil
+               :skip-before-1st-heading skip
+               :select-tags nil
+               :exclude-tags nil
+               :LaTeX-fragments nil)))
         (string-for-export
          (org-export-preprocess-string
           region
           :emph-multiline t
-          :for-LaTeX t
+          :for-backend 'latex
           :comments nil
           :tags (plist-get opt-plist :tags)
           :priority (plist-get opt-plist :priority)
@@ -614,6 +930,7 @@ when PUB-DIR is set, use this as the publishing directory."
           :drawers (plist-get opt-plist :drawers)
           :timestamps (plist-get opt-plist :timestamps)
           :todo-keywords (plist-get opt-plist :todo-keywords)
+          :tasks (plist-get opt-plist :tasks)
           :add-text (if (eq to-buffer 'string) nil text)
           :skip-before-1st-heading skip
           :select-tags (plist-get opt-plist :select-tags)
@@ -638,7 +955,7 @@ when PUB-DIR is set, use this as the publishing directory."
               "\n\n"))
 
     ;; insert lines before the first headline
-    (unless skip
+    (unless (or skip (string-match "^\\*" first-lines))
       (insert first-lines))
 
     ;; export the content of headlines
@@ -656,6 +973,11 @@ when PUB-DIR is set, use this as the publishing directory."
     ;; finalization
     (unless body-only (insert "\n\\end{document}"))
 
+    ;; Attach description terms to the \item macro
+    (goto-char (point-min))
+    (while (re-search-forward "^[ \t]*\\\\item\\([ \t]+\\)\\[" nil t)
+      (delete-region (match-beginning 1) (match-end 1)))
+
     ;; Relocate the table of contents
     (goto-char (point-min))
     (when (re-search-forward "\\[TABLE-OF-CONTENTS\\]" nil t)
@@ -666,8 +988,25 @@ when PUB-DIR is set, use this as the publishing directory."
       (and (re-search-forward "\\[TABLE-OF-CONTENTS\\]" nil t)
           (replace-match "\\tableofcontents" t t)))
 
+    ;; Cleanup forced line ends in items where they are not needed
+    (goto-char (point-min))
+    (while (re-search-forward
+           "^[ \t]*\\\\item\\>.*\\(\\\\\\\\\\)[ \t]*\\(\n\\\\label.*\\)*\n\\\\begin"
+           nil t)
+      (delete-region (match-beginning 1) (match-end 1)))
+    (goto-char (point-min))
+    (while (re-search-forward
+           "^[ \t]*\\\\item\\>.*\\(\\\\\\\\\\)[ \t]*\\(\n\\\\label.*\\)*"
+           nil t)
+      (if (looking-at "[\n \t]+")
+         (replace-match "\n")))
+
     (run-hooks 'org-export-latex-final-hook)
-    (or to-buffer (save-buffer))
+    (if to-buffer
+       (unless (eq major-mode 'latex-mode) (latex-mode))
+      (save-buffer))
+    (org-export-latex-fix-inputenc)
+    (run-hooks 'org-export-latex-after-save-hook)
     (goto-char (point-min))
     (or (org-export-push-to-kill-ring "LaTeX")
        (message "Exporting to LaTeX...done"))
@@ -690,49 +1029,91 @@ when PUB-DIR is set, use this as the publishing directory."
         (file (buffer-file-name lbuf))
         (base (file-name-sans-extension (buffer-file-name lbuf)))
         (pdffile (concat base ".pdf"))
-        (cmds org-latex-to-pdf-process)
+        (cmds (if (eq org-export-latex-listings 'minted)
+                  ;; automatically add -shell-escape when needed
+                  (mapcar (lambda (cmd)
+                            (replace-regexp-in-string
+                             "pdflatex " "pdflatex -shell-escape " cmd))
+                          org-latex-to-pdf-process)
+                org-latex-to-pdf-process))
         (outbuf (get-buffer-create "*Org PDF LaTeX Output*"))
         (bibtex-p (with-current-buffer lbuf
                     (save-excursion
                       (goto-char (point-min))
                       (re-search-forward "\\\\bibliography{" nil t))))
-        cmd)
+        cmd output-dir errors)
     (with-current-buffer outbuf (erase-buffer))
-    (and (file-exists-p pdffile) (delete-file pdffile))
-    (message "Processing LaTeX file...")
-    (if (and cmds (symbolp cmds))
-       (funcall cmds file)
-      (while cmds
-       (setq cmd (pop cmds))
-       (while (string-match "%b" cmd)
-         (setq cmd (replace-match
-                    (save-match-data
-                      (shell-quote-argument base))
-                    t t cmd)))
-       (while (string-match "%s" cmd)
-         (setq cmd (replace-match
-                    (save-match-data
-                      (shell-quote-argument file))
-                    t t cmd)))
-       (shell-command cmd outbuf outbuf)))
-    (message "Processing LaTeX file...done")
+    (message (concat "Processing LaTeX file " file "..."))
+    (setq output-dir (file-name-directory file))
+    (with-current-buffer lbuf
+      (save-excursion
+       (if (and cmds (symbolp cmds))
+           (funcall cmds (shell-quote-argument file))
+         (while cmds
+           (setq cmd (pop cmds))
+           (while (string-match "%b" cmd)
+             (setq cmd (replace-match
+                        (save-match-data
+                          (shell-quote-argument base))
+                        t t cmd)))
+           (while (string-match "%f" cmd)
+             (setq cmd (replace-match
+                        (save-match-data
+                          (shell-quote-argument file))
+                        t t cmd)))
+           (while (string-match "%o" cmd)
+             (setq cmd (replace-match
+                        (save-match-data
+                          (shell-quote-argument output-dir))
+                        t t cmd)))
+           (shell-command cmd outbuf)))))
+    (message (concat "Processing LaTeX file " file "...done"))
+    (setq errors (org-export-latex-get-error outbuf))
     (if (not (file-exists-p pdffile))
-       (error "PDF file was not produced")
+       (error (concat "PDF file " pdffile " was not produced"
+                      (if errors (concat ":" errors "") "")))
       (set-window-configuration wconfig)
       (when org-export-pdf-remove-logfiles
-       (dolist (ext '("aux" "log" "out" "toc"))
+       (dolist (ext org-export-pdf-logfiles)
          (setq file (concat base "." ext))
          (and (file-exists-p file) (delete-file file))))
-      (message "Exporting to PDF...done")
+      (message (concat
+               "Exporting to PDF...done"
+               (if errors
+                   (concat ", with some errors:" errors)
+                 "")))
       pdffile)))
 
+(defun org-export-latex-get-error (buf)
+  "Collect the kinds of errors that remain in pdflatex processing."
+  (with-current-buffer buf
+    (save-excursion
+      (goto-char (point-max))
+      (when (re-search-backward "^[ \t]*This is pdf.*?TeX.*?Version" nil t)
+       ;; OK, we are at the location of the final run
+       (let ((pos (point)) (errors "") (case-fold-search t))
+         (if (re-search-forward "Reference.*?undefined" nil t)
+             (setq errors (concat errors " [undefined reference]")))
+         (goto-char pos)
+         (if (re-search-forward "Citation.*?undefined" nil t)
+             (setq errors (concat errors " [undefined citation]")))
+         (goto-char pos)
+         (if (re-search-forward "Undefined control sequence" nil t)
+             (setq errors (concat errors " [undefined control sequence]")))
+         (and (org-string-nw-p errors) errors))))))
+
 ;;;###autoload
 (defun org-export-as-pdf-and-open (arg)
   "Export as LaTeX, then process through to PDF, and open."
   (interactive "P")
   (let ((pdffile (org-export-as-pdf arg)))
     (if pdffile
-       (org-open-file pdffile)
+       (progn
+         (org-open-file pdffile)
+         (when org-export-kill-product-buffer-when-displayed
+           (kill-buffer (find-buffer-visiting
+                         (concat (file-name-sans-extension (buffer-file-name))
+                                 ".tex")))))
       (error "PDF file was not produced"))))
 
 ;;; Parsing functions:
@@ -745,7 +1126,7 @@ Return a list reflecting the document structure."
     (goto-char (point-min))
     (let* ((cnt 0) output
           (depth org-export-latex-sectioning-depth))
-      (while (re-search-forward
+      (while (org-re-search-forward-unprotected
              (concat "^\\(\\(?:\\*\\)\\{"
                      (number-to-string (+ (if odd 2 1) level))
                      "\\}\\) \\(.*\\)$")
@@ -753,7 +1134,7 @@ Return a list reflecting the document structure."
              (when (> level 0)
                (save-excursion
                  (save-match-data
-                   (re-search-forward
+                   (org-re-search-forward-unprotected
                     (concat "^\\(\\(?:\\*\\)\\{"
                             (number-to-string level)
                             "\\}\\) \\(.*\\)$") nil t)))) t)
@@ -765,7 +1146,7 @@ Return a list reflecting the document structure."
            (narrow-to-region
             (point)
             (save-match-data
-              (if (re-search-forward
+              (if (org-re-search-forward-unprotected
                    (concat "^\\(\\(?:\\*\\)\\{"
                            (number-to-string (+ (if odd 2 1) level))
                            "\\}\\) \\(.*\\)$") nil t)
@@ -789,7 +1170,7 @@ Return a list reflecting the document structure."
 (defun org-export-latex-parse-content ()
   "Extract the content of a section."
   (let ((beg (point))
-       (end (if (re-search-forward "^\\(\\*\\)+ .*$" nil t)
+       (end (if (org-re-search-forward-unprotected "^\\(\\*\\)+ .*$" nil t)
                 (progn (beginning-of-line) (point))
               (point-max))))
     (buffer-substring beg end)))
@@ -797,7 +1178,7 @@ Return a list reflecting the document structure."
 (defun org-export-latex-parse-subcontent (level odd)
   "Extract the subcontent of a section at LEVEL.
 If ODD Is non-nil, assume subcontent only contains odd sections."
-  (if (not (re-search-forward
+  (if (not (org-re-search-forward-unprotected
            (concat "^\\(\\(?:\\*\\)\\{"
                    (number-to-string (+ (if odd 4 2) level))
                    "\\}\\) \\(.*\\)$")
@@ -823,9 +1204,10 @@ and its content."
 
 (defun org-export-latex-subcontent (subcontent num)
   "Export each cell of SUBCONTENT to LaTeX.
-If NUM, export sections as numerical sections."
-  (let* ((heading (org-export-latex-fontify-headline
-                  (cdr (assoc 'heading subcontent))))
+If NUM is non-nil export numbered sections, otherwise use unnumbered
+sections.  If NUM is an integer, export the highest NUM levels as
+numbered sections and lower levels as unnumbered sections."
+  (let* ((heading (cdr (assoc 'heading subcontent)))
         (level (- (cdr (assoc 'level subcontent))
                   org-export-latex-add-level))
         (occur (number-to-string (cdr (assoc 'occur subcontent))))
@@ -833,32 +1215,64 @@ If NUM, export sections as numerical sections."
         (subcontent (cadr (assoc 'subcontent subcontent)))
         (label (org-get-text-property-any 0 'target heading))
         (label-list (cons label (cdr (assoc label
-                                            org-export-target-aliases)))))
+                                            org-export-target-aliases))))
+        (sectioning org-export-latex-sectioning)
+        (depth org-export-latex-sectioning-depth)
+        main-heading sub-heading)
+    (when (symbolp (car sectioning))
+      (setq sectioning (funcall (car sectioning) level heading))
+      (when sectioning
+       (setq heading (car sectioning)
+             sectioning (cdr sectioning)
+             ;; target property migh have changed...
+             label (org-get-text-property-any 0 'target heading)
+             label-list (cons label (cdr (assoc label
+                                                org-export-target-aliases)))))
+      (if sectioning (setq sectioning (make-list 10 sectioning)))
+      (setq depth (if sectioning 10000 0)))
+    (if (string-match "[ \t]*\\\\\\\\[ \t]*" heading)
+       (setq main-heading (substring heading 0 (match-beginning 0))
+             sub-heading (substring heading (match-end 0))))
+    (setq heading (org-export-latex-fontify-headline heading)
+         sub-heading (and sub-heading
+                          (org-export-latex-fontify-headline sub-heading))
+         main-heading (and main-heading
+                           (org-export-latex-fontify-headline main-heading)))
     (cond
      ;; Normal conversion
-     ((<= level org-export-latex-sectioning-depth)
-      (let* ((sec (nth (1- level) org-export-latex-sectioning))
+     ((<= level depth)
+      (let* ((sec (nth (1- level) sectioning))
+            (num (if (integerp num)
+                     (>= num level)
+                   num))
             start end)
        (if (consp (cdr sec))
            (setq start (nth (if num 0 2) sec)
                  end (nth (if num 1 3) sec))
          (setq start (if num (car sec) (cdr sec))))
-       (insert (format start heading) "\n")
+       (insert (format start (if main-heading main-heading heading)
+                       (or sub-heading "")))
+       (insert "\n")
        (when label
          (insert (mapconcat (lambda (l) (format "\\label{%s}" l))
                             label-list "\n") "\n"))
        (insert (org-export-latex-content content))
        (cond ((stringp subcontent) (insert subcontent))
-             ((listp subcontent) (org-export-latex-sub subcontent)))
-       (if end (insert end "\n"))))
+             ((listp subcontent)
+              (while (org-looking-back "\n\n") (backward-delete-char 1))
+              (org-export-latex-sub subcontent)))
+       (when (and end (string-match "[^ \t]" end))
+         (let ((hook (org-get-text-property-any 0 'org-insert-hook end)))
+           (and (functionp hook) (funcall hook)))
+         (insert end "\n"))))
      ;; At a level under the hl option: we can drop this subsection
-     ((> level org-export-latex-sectioning-depth)
+     ((> level depth)
       (cond ((eq org-export-latex-low-levels 'description)
             (if (string-match "% ends low level$"
                               (buffer-substring (point-at-bol 0) (point)))
                 (delete-region (point-at-bol 0) (point))
               (insert "\\begin{description}\n"))
-            (insert (format "\n\\item[%s]%s~\n\n"
+            (insert (format "\n\\item[%s]%s~\n"
                             heading
                             (if label (format "\\label{%s}" label) "")))
             (insert (org-export-latex-content content))
@@ -871,7 +1285,7 @@ If NUM, export sections as numerical sections."
                 (delete-region (point-at-bol 0) (point))
               (insert (format "\\begin{%s}\n"
                               (symbol-name org-export-latex-low-levels))))
-            (insert (format "\n\\item %s\\\\\n%s\n"
+            (insert (format "\n\\item %s\\\\\n%s%%"
                             heading
                             (if label (format "\\label{%s}" label) "")))
             (insert (org-export-latex-content content))
@@ -926,10 +1340,23 @@ LEVEL indicates the default depth for export."
              (save-restriction
                (widen)
                (goto-char (point-min))
-               (and (re-search-forward "^#\\+LaTeX_CLASS:[ \t]*\\([a-zA-Z]+\\)" nil t)
+               (and (re-search-forward "^#\\+LaTeX_CLASS:[ \t]*\\(-[a-zA-Z]+\\)" nil t)
                     (match-string 1))))
            (plist-get org-export-latex-options-plist :latex-class)
            org-export-latex-default-class)
+       org-export-latex-class-options
+       (or (and (org-region-active-p)
+                (save-excursion
+                  (goto-char (region-beginning))
+                  (and (looking-at org-complex-heading-regexp)
+                       (org-entry-get nil "LaTeX_CLASS_OPTIONS" 'selective))))
+           (save-excursion
+             (save-restriction
+               (widen)
+               (goto-char (point-min))
+               (and (re-search-forward "^#\\+LaTeX_CLASS_OPTIONS:[ \t]*\\(.*?\\)[ \t]*$" nil t)
+                    (match-string 1))))
+           (plist-get org-export-latex-options-plist :latex-class-options))
        org-export-latex-class
        (or (car (assoc org-export-latex-class org-export-latex-classes))
            (error "No definition for class `%s' in `org-export-latex-classes'"
@@ -943,44 +1370,60 @@ LEVEL indicates the default depth for export."
            (let ((hl-levels
                   (plist-get org-export-latex-options-plist :headline-levels))
                  (sec-depth (length org-export-latex-sectioning)))
-             (if (> hl-levels sec-depth) sec-depth hl-levels)))))
+             (if (> hl-levels sec-depth) sec-depth hl-levels))))
+  (when (and org-export-latex-class-options
+            (string-match "\\S-" org-export-latex-class-options)
+            (string-match "^[ \t]*\\(\\\\documentclass\\)\\(\\[.*?\\]\\)?"
+                          org-export-latex-header))
+    (setq org-export-latex-header
+         (concat (substring org-export-latex-header 0 (match-end 1))
+                 org-export-latex-class-options
+                 (substring org-export-latex-header (match-end 0))))))
+
+(defvar org-export-latex-format-toc-function
+  'org-export-latex-format-toc-default
+  "The function formatting returning the string to create the table of contents.
+The function mus take one parameter, the depth of the table of contents.")
 
 (defun org-export-latex-make-header (title opt-plist)
   "Make the LaTeX header and return it as a string.
 TITLE is the current title from the buffer or region.
 OPT-PLIST is the options plist for current buffer."
   (let ((toc (plist-get opt-plist :table-of-contents))
-       (author (plist-get opt-plist :author)))
+       (author (org-export-apply-macros-in-string
+                (plist-get opt-plist :author)))
+       (email (replace-regexp-in-string
+               "_" "\\\\_"
+               (org-export-apply-macros-in-string
+                (plist-get opt-plist :email)))))
     (concat
      (if (plist-get opt-plist :time-stamp-file)
         (format-time-string "%% Created %Y-%m-%d %a %H:%M\n"))
-     ;; insert LaTeX custom header
-     (org-export-apply-macros-in-string org-export-latex-header)
-     "\n"
-     ;; insert information on LaTeX packages
-     (when org-export-latex-packages-alist
-       (mapconcat (lambda(p)
-                   (if (equal "" (car p))
-                       (format "\\usepackage{%s}" (cadr p))
-                     (format "\\usepackage[%s]{%s}"
-                             (car p) (cadr p))))
-                 org-export-latex-packages-alist "\n"))
-     ;; insert additional commands in the header
-     (org-export-apply-macros-in-string
-      (plist-get opt-plist :latex-header-extra))
+     ;; insert LaTeX custom header and packages from the list
+     (org-splice-latex-header
+      (org-export-apply-macros-in-string org-export-latex-header)
+      org-export-latex-default-packages-alist
+      org-export-latex-packages-alist nil
+      (org-export-apply-macros-in-string
+       (plist-get opt-plist :latex-header-extra)))
+     ;; append another special variable
      (org-export-apply-macros-in-string org-export-latex-append-header)
+     ;; define alert if not yet defined
+     "\n\\providecommand{\\alert}[1]{\\textbf{#1}}"
      ;; insert the title
      (format
       "\n\n\\title{%s}\n"
-      ;; convert the title
-      (org-export-latex-content
-       title '(lists tables fixed-width keywords)))
+      (org-export-latex-fontify-headline title))
      ;; insert author info
      (if (plist-get opt-plist :author-info)
-        (format "\\author{%s}\n"
-                (org-export-latex-fontify-headline (or author user-full-name)))
+        (format "\\author{%s%s}\n"
+                (org-export-latex-fontify-headline (or author user-full-name))
+                (if (and (plist-get opt-plist :email-info) email
+                         (string-match "\\S-" email))
+                    (format "\\thanks{%s}" email)
+                  ""))
        (format "%%\\author{%s}\n"
-              (or author user-full-name)))
+              (org-export-latex-fontify-headline (or author user-full-name))))
      ;; insert the date
      (format "\\date{%s}\n"
             (format-time-string
@@ -997,13 +1440,15 @@ OPT-PLIST is the options plist for current buffer."
      ;; table of contents
      (when (and org-export-with-toc
                (plist-get opt-plist :section-numbers))
-       (cond ((numberp toc)
-             (format "\\setcounter{tocdepth}{%s}\n\\tableofcontents\n\\vspace*{1cm}\n"
-                     (min toc (plist-get opt-plist :headline-levels))))
-            (toc (format "\\setcounter{tocdepth}{%s}\n\\tableofcontents\n\\vspace*{1cm}\n"
-                         (plist-get opt-plist :headline-levels)))))
-     (when (plist-get opt-plist :preserve-breaks)
-       "\\obeylines\n"))))
+       (funcall org-export-latex-format-toc-function
+               (cond ((numberp toc)
+                      (min toc (plist-get opt-plist :headline-levels)))
+                     (toc  (plist-get opt-plist :headline-levels))))))))
+
+(defun org-export-latex-format-toc-default (depth)
+  (when depth
+    (format "\\setcounter{tocdepth}{%s}\n\\tableofcontents\n\\vspace*{1cm}\n"
+           depth)))
 
 (defun org-export-latex-first-lines (opt-plist &optional beg end)
   "Export the first lines before first headline.
@@ -1012,14 +1457,15 @@ If END is non-nil, it is the end of the region."
   (save-excursion
     (goto-char (or beg (point-min)))
     (let* ((pt (point))
-          (end (if (re-search-forward "^\\*+ " end t)
+          (end (if (re-search-forward
+                    (concat "^" (org-get-limited-outline-regexp)) end t)
                    (goto-char (match-beginning 0))
                  (goto-char (or end (point-max))))))
       (prog1
          (org-export-latex-content
           (org-export-preprocess-string
            (buffer-substring pt end)
-           :for-LaTeX t
+           :for-backend 'latex
            :emph-multiline t
            :add-text nil
            :comments nil
@@ -1028,13 +1474,23 @@ If END is non-nil, it is the end of the region."
            :timestamps (plist-get opt-plist :timestamps)
            :footnotes (plist-get opt-plist :footnotes)))
        (org-unmodified
-        (add-text-properties pt (max pt (1- end))
-                             '(:org-license-to-kill t)))))))
+        (let ((inhibit-read-only t)
+              (limit (max pt (1- end))))
+          (add-text-properties pt limit
+                               '(:org-license-to-kill t))
+          (save-excursion
+            (goto-char pt)
+            (while (re-search-forward "^[ \t]*#\\+.*\n?" limit t)
+              (let ((case-fold-search t))
+                (unless (org-string-match-p
+                         "^[ \t]*#\\+\\(attr_\\|caption\\>\\|label\\>\\)"
+                         (match-string 0))
+                  (remove-text-properties (match-beginning 0) (match-end 0)
+                                          '(:org-license-to-kill t))))))))))))
+
 
 (defvar org-export-latex-header-defs nil
   "The header definitions that might be used in the LaTeX body.")
-(defvar org-export-latex-header-defs-re nil
-  "The header definitions that might be used in the LaTeX body.")
 
 (defun org-export-latex-content (content &optional exclude-list)
   "Convert CONTENT string to LaTeX.
@@ -1042,31 +1498,32 @@ Don't perform conversions that are in EXCLUDE-LIST.  Recognized
 conversion types are: quotation-marks, emphasis, sub-superscript,
 links, keywords, lists, tables, fixed-width"
   (with-temp-buffer
-   (insert content)
-   (unless (memq 'timestamps exclude-list)
-     (org-export-latex-time-stamps))
-   (unless (memq 'quotation-marks exclude-list)
-     (org-export-latex-quotation-marks))
-   (unless (memq 'emphasis exclude-list)
-     (when (plist-get org-export-latex-options-plist :emphasize)
-       (org-export-latex-fontify)))
-   (unless (memq 'sub-superscript exclude-list)
-     (org-export-latex-special-chars
-      (plist-get org-export-latex-options-plist :sub-superscript)))
-   (unless (memq 'links exclude-list)
-     (org-export-latex-links))
-   (unless (memq 'keywords exclude-list)
-     (org-export-latex-keywords))
-   (unless (memq 'lists exclude-list)
-     (org-export-latex-lists))
-   (unless (memq 'tables exclude-list)
-     (org-export-latex-tables
-      (plist-get org-export-latex-options-plist :tables)))
-   (unless (memq 'fixed-width exclude-list)
-     (org-export-latex-fixed-width
-      (plist-get org-export-latex-options-plist :fixed-width)))
+    (org-install-letbind)
+    (insert content)
+    (unless (memq 'timestamps exclude-list)
+      (org-export-latex-time-stamps))
+    (unless (memq 'quotation-marks exclude-list)
+      (org-export-latex-quotation-marks))
+    (unless (memq 'emphasis exclude-list)
+      (when (plist-get org-export-latex-options-plist :emphasize)
+       (org-export-latex-fontify)))
+    (unless (memq 'sub-superscript exclude-list)
+      (org-export-latex-special-chars
+       (plist-get org-export-latex-options-plist :sub-superscript)))
+    (unless (memq 'links exclude-list)
+      (org-export-latex-links))
+    (unless (memq 'keywords exclude-list)
+      (org-export-latex-keywords))
+    (unless (memq 'lists exclude-list)
+      (org-export-latex-lists))
+    (unless (memq 'tables exclude-list)
+      (org-export-latex-tables
+       (plist-get org-export-latex-options-plist :tables)))
+    (unless (memq 'fixed-width exclude-list)
+      (org-export-latex-fixed-width
+       (plist-get org-export-latex-options-plist :fixed-width)))
    ;; return string
-   (buffer-substring (point-min) (point-max))))
+    (buffer-substring (point-min) (point-max))))
 
 (defun org-export-latex-protect-string (s)
   "Add the org-protected property to string S."
@@ -1101,23 +1558,24 @@ links, keywords, lists, tables, fixed-width"
                        (cdr todo-markup) (car todo-markup)))
                   (t (cdr (or (assoc (match-string 1) todo-markup)
                               (car todo-markup))))))
-       (replace-match (format fmt (match-string 1)) t t)))
+       (replace-match (org-export-latex-protect-string
+                       (format fmt (match-string 1))) t t)))
     ;; convert priority string
     (when (re-search-forward "\\[\\\\#.\\]" nil t)
       (if (plist-get remove-list :priority)
          (replace-match "")
        (replace-match (format "\\textbf{%s}" (match-string 0)) t t)))
     ;; convert tags
-    (when (re-search-forward "\\(:[a-zA-Z0-9_@]+\\)+:" nil t)
+    (when (re-search-forward "\\(:[a-zA-Z0-9_@#%]+\\)+:" nil t)
       (if (or (not org-export-with-tags)
              (plist-get remove-list :tags))
          (replace-match "")
        (replace-match
         (org-export-latex-protect-string
-         (format "\\textbf{%s}"
+         (format org-export-latex-tag-markup
                  (save-match-data
                    (replace-regexp-in-string
-                    "_" "\\\\_" (match-string 0)))))
+                    "\\([_#]\\)" "\\\\\\1" (match-string 0)))))
         t t)))))
 
 (defun org-export-latex-fontify-headline (string)
@@ -1126,18 +1584,54 @@ links, keywords, lists, tables, fixed-width"
     ;; FIXME: org-inside-LaTeX-fragment-p doesn't work when the $...$ is at
     ;; the beginning of the buffer - inserting "\n" is safe here though.
     (insert "\n" string)
+
+    ;; Preserve math snippets
+
+    (let* ((matchers (plist-get org-format-latex-options :matchers))
+          (re-list org-latex-regexps)
+          beg end re e m n block off)
+      ;; Check the different regular expressions
+      (while (setq e (pop re-list))
+       (setq m (car e) re (nth 1 e) n (nth 2 e)
+             block (if (nth 3 e) "\n\n" ""))
+       (setq off (if (member m '("$" "$1")) 1 0))
+       (when (and (member m matchers) (not (equal m "begin")))
+         (goto-char (point-min))
+         (while (re-search-forward re nil t)
+           (setq beg (+ (match-beginning 0) off) end (- (match-end 0) 0))
+           (add-text-properties beg end
+                                '(org-protected t org-latex-math t))))))
+
+    ;; Convert LaTeX to \LaTeX{} and TeX to \TeX{}
+    (goto-char (point-min))
+    (let ((case-fold-search nil))
+      (while (re-search-forward "\\<\\(\\(La\\)?TeX\\)\\>" nil t)
+       (unless (eq (char-before (match-beginning 1)) ?\\)
+         (org-if-unprotected-1
+          (replace-match (org-export-latex-protect-string
+                          (concat "\\" (match-string 1)
+                                  "{}")) t t)))))
     (goto-char (point-min))
-    (let ((re (concat "\\\\[a-zA-Z]+\\(?:"
-                     "\\[.*\\]"
-                     "\\)?"
-                     (org-create-multibrace-regexp "{" "}" 3))))
+    (let ((re (concat "\\\\\\([a-zA-Z]+\\)"
+                     "\\(?:<[^<>\n]*>\\)*"
+                     "\\(?:\\[[^][\n]*?\\]\\)*"
+                     "\\(?:<[^<>\n]*>\\)*"
+                     "\\("
+                     (org-create-multibrace-regexp "{" "}" 3)
+                     "\\)\\{1,3\\}")))
       (while (re-search-forward re nil t)
-       (unless (save-excursion (goto-char (match-beginning 0))
-                               (equal (char-after (point-at-bol)) ?#))
+       (unless (or
+                ;; check for comment line
+                (save-excursion (goto-char (match-beginning 0))
+                                (org-in-indented-comment-line))
+                ;; Check if this is a defined entity, so that is may need conversion
+                (org-entity-get (match-string 1)))
          (add-text-properties (match-beginning 0) (match-end 0)
                               '(org-protected t)))))
     (when (plist-get org-export-latex-options-plist :emphasize)
       (org-export-latex-fontify))
+    (org-export-latex-time-stamps)
+    (org-export-latex-quotation-marks)
     (org-export-latex-keywords-maybe)
     (org-export-latex-special-chars
      (plist-get org-export-latex-options-plist :sub-superscript))
@@ -1152,27 +1646,26 @@ links, keywords, lists, tables, fixed-width"
       (org-if-unprotected-at (1- (point))
        (replace-match
        (org-export-latex-protect-string
-        (format org-export-latex-timestamp-markup
+        (format (if (string= "<" (substring (match-string 0) 0 1))
+                    org-export-latex-timestamp-markup
+                  org-export-latex-timestamp-inactive-markup)
                 (substring (org-translate-time (match-string 0)) 1 -1)))
        t t)))))
 
 (defun org-export-latex-quotation-marks ()
   "Export quotation marks depending on language conventions."
-  (let* ((lang (plist-get org-export-latex-options-plist :language))
-        (quote-rpl (if (equal lang "fr")
-                       '(("\\(\\s-\\)\"" "«~")
-                         ("\\(\\S-\\)\"" "~»")
-                         ("\\(\\s-\\)'" "`"))
-                     '(("\\(\\s-\\|[[(]\\)\"" "``")
-                       ("\\(\\S-\\)\"" "''")
-                       ("\\(\\s-\\|(\\)'" "`")))))
-    (mapc (lambda(l) (goto-char (point-min))
-           (while (re-search-forward (car l) nil t)
-             (let ((rpl (concat (match-string 1)
-                                (org-export-latex-protect-string
-                                 (copy-sequence (cadr l))))))
-               (org-if-unprotected-1
-                (replace-match rpl t t))))) quote-rpl)))
+  (mapc (lambda(l)
+         (goto-char (point-min))
+         (while (re-search-forward (car l) nil t)
+           (let ((rpl (concat (match-string 1)
+                              (org-export-latex-protect-string
+                               (copy-sequence (cdr l))))))
+             (org-if-unprotected-1
+              (replace-match rpl t t)))))
+       (cdr (or (assoc (plist-get org-export-latex-options-plist :language)
+                       org-export-latex-quotes)
+                ;; falls back on english
+                (assoc "en" org-export-latex-quotes)))))
 
 (defun org-export-latex-special-chars (sub-superscript)
   "Export special characters to LaTeX.
@@ -1183,7 +1676,8 @@ See the `org-export-latex.el' code for a complete conversion table."
          (goto-char (point-min))
          (while (re-search-forward c nil t)
            ;; Put the point where to check for org-protected
-           (unless (get-text-property (match-beginning 2) 'org-protected)
+           (unless (or (get-text-property (match-beginning 2) 'org-protected)
+                       (save-match-data (org-at-table.el-p)))
              (cond ((member (match-string 2) '("\\$" "$"))
                     (if (equal (match-string 2) "\\$")
                         nil
@@ -1192,7 +1686,8 @@ See the `org-export-latex.el' code for a complete conversion table."
                     (if (equal (match-string 1) "\\")
                         (replace-match (match-string 2) t t)
                       (replace-match (concat (match-string 1) "\\"
-                                             (match-string 2)) t t)))
+                                             (match-string 2)) t t)
+                      (backward-char 1)))
                    ((equal (match-string 2) "...")
                     (replace-match
                      (concat (match-string 1)
@@ -1216,7 +1711,19 @@ See the `org-export-latex.el' code for a complete conversion table."
                                            (org-export-latex-treat-backslash-char
                                             (match-string 1)
                                             (or (match-string 3) "")))
-                                         "") t t))
+                                         "") t t)
+                      (when (and (get-text-property (1- (point)) 'org-entity)
+                                 (looking-at "{}"))
+                        ;; OK, this was an entity replacement, and the user
+                        ;; had terminated the entity with {}.  Make sure
+                        ;; {} is protected as well, and remove the extra {}
+                        ;; inserted by the conversion.
+                        (put-text-property (point) (+ 2 (point)) 'org-protected t)
+                        (if (save-excursion (goto-char (max (- (point) 2) (point-min)))
+                                            (looking-at "{}"))
+                            (replace-match ""))
+                        (forward-char 2))
+                      (backward-char 1))
                      ((member (match-string 2) '("_" "^"))
                       (replace-match (or (save-match-data
                                            (org-export-latex-treat-sub-super-char
@@ -1227,15 +1734,9 @@ See the `org-export-latex.el' code for a complete conversion table."
                       (backward-char 1)))))))
        '(;"^\\([^\n$]*?\\|^\\)\\(\\\\?\\$\\)\\([^\n$]*\\)$"
          "\\(\\(\\\\?\\$\\)\\)"
-         "\\([a-za-z0-9]+\\|[ \t\n]\\|\\b\\|\\\\\\)\\(_\\|\\^\\)\\({[^{}]+}\\|[a-za-z0-9]+\\|[ \t\n]\\|[:punct:]\\|)\\|{[a-za-z0-9]+}\\|([a-za-z0-9]+)\\)"
-         "\\(.\\|^\\)\\(\\\\\\)\\([ \t\n]\\|[a-zA-Z&#%{}\"]+\\)"
-         "\\(.\\|^\\)\\(&\\)"
-         "\\(.\\|^\\)\\(#\\)"
-         "\\(.\\|^\\)\\(%\\)"
-         "\\(.\\|^\\)\\({\\)"
-         "\\(.\\|^\\)\\(}\\)"
-         "\\(.\\|^\\)\\(~\\)"
-         "\\(.\\|^\\)\\(\\.\\.\\.\\)"
+         "\\([a-zA-Z0-9()]+\\|[ \t\n]\\|\\b\\|\\\\\\)\\(_\\|\\^\\)\\({[^{}]+}\\|[a-zA-Z0-9]+\\|[ \t\n]\\|[:punct:]\\|)\\|{[a-zA-Z0-9]+}\\|([a-zA-Z0-9]+)\\)"
+         "\\(.\\|^\\)\\(\\\\\\)\\([ \t\n]\\|\\([&#%{}\"]\\|[a-zA-Z][a-zA-Z0-9]*\\)\\)"
+         "\\(^\\|.\\)\\([&#%{}~]\\|\\.\\.\\.\\)"
          ;; (?\< . "\\textless{}")
          ;; (?\> . "\\textgreater{}")
          )))
@@ -1264,7 +1765,9 @@ Convert CHAR depending on STRING-BEFORE and STRING-AFTER."
               ((and (> (length string-after) 1)
                     (or (eq subsup t)
                         (and (equal subsup '{}) (eq (string-to-char string-after) ?\{)))
-                    (string-match "[({]?\\([^)}]+\\)[)}]?" string-after))
+                    (or (string-match "[{]?\\([^}]+\\)[}]?" string-after)
+                        (string-match "[(]?\\([^)]+\\)[)]?" string-after)))
+
                (org-export-latex-protect-string
                 (format "%s$%s{%s}$" string-before char
                         (if (and (> (match-end 1) (1+ (match-beginning 1)))
@@ -1280,29 +1783,35 @@ Convert CHAR depending on STRING-BEFORE and STRING-AFTER."
 (defun org-export-latex-treat-backslash-char (string-before string-after)
   "Convert the \"$\" special character to LaTeX.
 The conversion is made depending of STRING-BEFORE and STRING-AFTER."
-  (cond ((member (list string-after) org-html-entities)
-        ;; backslash is part of a special entity (like "\alpha")
-        (concat string-before "$\\"
-                (or (cdar (member (list string-after) org-html-entities))
-                    string-after) "$"))
-       ((and (not (string-match "^[ \n\t]" string-after))
-             (not (string-match "[ \t]\\'\\|^" string-before)))
-        ;; backslash is inside a word
-        (org-export-latex-protect-string
-         (concat string-before "\\textbackslash{}" string-after)))
-       ((not (or (equal string-after "")
-                 (string-match "^[ \t\n]" string-after)))
-        ;; backslash might escape a character (like \#) or a user TeX
-        ;; macro (like \setcounter)
-        (org-export-latex-protect-string
-         (concat string-before "\\" string-after)))
-       ((and (string-match "^[ \t\n]" string-after)
-             (string-match "[ \t\n]\\'" string-before))
-        ;; backslash is alone, convert it to $\backslash$
-        (org-export-latex-protect-string
-         (concat string-before "\\textbackslash{}" string-after)))
-       (t (org-export-latex-protect-string
-           (concat string-before "\\textbackslash{}" string-after)))))
+  (let  ((ass (org-entity-get string-after)))
+    (cond
+     (ass (org-add-props
+             (if (nth 2 ass)
+                 (concat string-before
+                         (org-export-latex-protect-string
+                          (concat "$" (nth 1 ass) "$")))
+               (concat string-before (org-export-latex-protect-string
+                                      (nth 1 ass))))
+             nil 'org-entity t))
+     ((and (not (string-match "^[ \n\t]" string-after))
+          (not (string-match "[ \t]\\'\\|^" string-before)))
+      ;; backslash is inside a word
+      (concat string-before
+             (org-export-latex-protect-string
+              (concat "\\textbackslash{}" string-after))))
+     ((not (or (equal string-after "")
+              (string-match "^[ \t\n]" string-after)))
+      ;; backslash might escape a character (like \#) or a user TeX
+      ;; macro (like \setcounter)
+      (concat string-before
+             (org-export-latex-protect-string (concat "\\" string-after))))
+     ((and (string-match "^[ \t\n]" string-after)
+          (string-match "[ \t\n]\\'" string-before))
+      ;; backslash is alone, convert it to $\backslash$
+      (org-export-latex-protect-string
+       (concat string-before "\\textbackslash{}" string-after)))
+     (t (org-export-latex-protect-string
+        (concat string-before "\\textbackslash{}" string-after))))))
 
 (defun org-export-latex-keywords ()
   "Convert special keywords to LaTeX."
@@ -1312,34 +1821,42 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
                           (match-string 0)) t t)
     (save-excursion
       (beginning-of-line 1)
-      (unless (looking-at ".*\\\\newline[ \t]*$")
+      (unless (looking-at ".*\n[ \t]*\n")
        (end-of-line 1)
-       (insert "\\newline")))))
+       (insert "\n")))))
 
 (defun org-export-latex-fixed-width (opt)
   "When OPT is non-nil convert fixed-width sections to LaTeX."
   (goto-char (point-min))
   (while (re-search-forward "^[ \t]*:\\([ \t]\\|$\\)" nil t)
-    (if opt
-       (progn (goto-char (match-beginning 0))
-              (insert "\\begin{verbatim}\n")
-              (while (looking-at "^\\([ \t]*\\):\\(\\([ \t]\\|$\\).*\\)$")
-                (replace-match (concat (match-string 1)
-                                       (match-string 2)) t t)
-                (forward-line))
-              (insert "\\end{verbatim}\n\n"))
-      (progn (goto-char (match-beginning 0))
-            (while (looking-at "^\\([ \t]*\\):\\(\\([ \t]\\|$\\).*\\)$")
-              (replace-match (concat "%" (match-string 1)
-                                     (match-string 2)) t t)
-              (forward-line))))))
-
+    (unless (get-text-property (point) 'org-example)
+     (if opt
+        (progn (goto-char (match-beginning 0))
+               (insert "\\begin{verbatim}\n")
+               (while (looking-at "^\\([ \t]*\\):\\(\\([ \t]\\|$\\).*\\)$")
+                 (replace-match (concat (match-string 1)
+                                        (match-string 2)) t t)
+                 (forward-line))
+               (insert "\\end{verbatim}\n\n"))
+       (progn (goto-char (match-beginning 0))
+             (while (looking-at "^\\([ \t]*\\):\\(\\([ \t]\\|$\\).*\\)$")
+               (replace-match (concat "%" (match-string 1)
+                                      (match-string 2)) t t)
+               (forward-line)))))))
 
 (defvar org-table-last-alignment) ; defined in org-table.el
 (defvar org-table-last-column-widths) ; defined in org-table.el
 (declare-function orgtbl-to-latex "org-table" (table params) t)
 (defun org-export-latex-tables (insert)
   "Convert tables to LaTeX and INSERT it."
+  ;; First, get the table.el tables
+  (goto-char (point-min))
+  (while (re-search-forward "^[ \t]*\\(\\+-[-+]*\\+\\)[ \t]*\n[ \t]*|" nil t)
+    (org-if-unprotected
+     (require 'table)
+     (org-export-latex-convert-table.el-table)))
+
+  ;; And now the Org-mode tables
   (goto-char (point-min))
   (while (re-search-forward "^\\([ \t]*\\)|" nil t)
     (org-if-unprotected-at (1- (point))
@@ -1351,7 +1868,8 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
              (org-table-last-column-widths (copy-sequence
                                             org-table-last-column-widths))
              fnum fields line lines olines gr colgropen line-fmt align
-             caption label attr floatp longtblp)
+             caption width shortn label attr floatp placement
+            longtblp tblenv tabular-env)
         (if org-export-latex-tables-verbatim
             (let* ((tbl (concat "\\begin{verbatim}\n" raw-table
                                 "\\end{verbatim}\n")))
@@ -1360,16 +1878,37 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
           (progn
             (setq caption (org-find-text-property-in-string
                            'org-caption raw-table)
+                 shortn (org-find-text-property-in-string
+                         'org-caption-shortn raw-table)
                   attr (org-find-text-property-in-string
                         'org-attributes raw-table)
                   label (org-find-text-property-in-string
                          'org-label raw-table)
                   longtblp (and attr (stringp attr)
                                 (string-match "\\<longtable\\>" attr))
+                 tblenv (if (and attr (stringp attr)
+                                 (or (string-match (regexp-quote "table*") attr)
+                                     (string-match "\\<multicolumn\\>" attr)))
+                            "table*" "table")
+                 tabular-env
+                 (if (and attr (stringp attr)
+                          (string-match "\\(tabular.\\)" attr))
+                     (match-string 1 attr)
+                   org-export-latex-tabular-environment)
+                 width (and attr (stringp attr)
+                             (string-match "\\<width=\\([^ \t\n\r]+\\)" attr)
+                             (match-string 1 attr))
                   align (and attr (stringp attr)
-                             (string-match "\\<align=\\([^ \t\n\r,]+\\)" attr)
+                             (string-match "\\<align=\\([^ \t\n\r]+\\)" attr)
                              (match-string 1 attr))
-                  floatp (or caption label))
+                  floatp (or caption label (string= "table*" tblenv))
+                 placement     (if (and attr
+                                        (stringp attr)
+                                        (string-match "[ \t]*\\<placement=\\(\\S-+\\)" attr))
+                                   (match-string 1 attr)
+                                 (concat
+                                  "[" org-latex-default-figure-position "]")))
+           (setq caption (and caption (org-export-latex-fontify-headline caption)))
             (setq lines (org-split-string raw-table "\n"))
             (apply 'delete-region (list beg end))
             (when org-export-table-remove-special-lines
@@ -1416,23 +1955,31 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
                   (mapcar
                    (lambda(elem)
                      (or (and (string-match "[ \t]*|-+" elem) 'hline)
-                         (org-split-string (org-trim elem) "|")))
+                         (org-split-string
+                         (progn (set-text-properties 0 (length elem) nil elem)
+                                (org-trim elem)) "|")))
                    lines))
             (when insert
               (insert (org-export-latex-protect-string
                        (concat
                         (if longtblp
                             (concat "\\begin{longtable}{" align "}\n")
-                          (if floatp "\\begin{table}[htb]\n"))
-                        (if (or floatp longtblp)
+                          (if floatp
+                             (format "\\begin{%s}%s\n" tblenv placement)))
+                        (if floatp
                             (format
-                             "\\caption{%s%s}"
-                             (if label (concat "\\\label{" label "}") "")
-                             (or caption "")))
-                        (if longtblp "\\\\\n" "\n")
+                             "\\caption%s{%s} %s"
+                             (if shortn (concat "[" shortn "]") "")
+                             (or caption "")
+                            (if label (format "\\label{%s}" label) "")))
+                        (if (and longtblp caption) "\\\\\n" "\n")
                         (if (and org-export-latex-tables-centered (not longtblp))
                             "\\begin{center}\n")
-                        (if (not longtblp) (concat "\\begin{tabular}{" align "}\n"))
+                        (if (not longtblp)
+                           (format "\\begin{%s}%s{%s}\n"
+                                   tabular-env
+                                   (if width (format "{%s}" width) "")
+                                   align))
                         (orgtbl-to-latex
                          lines
                          `(:tstart nil :tend nil
@@ -1444,14 +1991,66 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
 \\endfoot
 \\endlastfoot" (length org-table-last-alignment))
                                              nil)))
-                        (if (not longtblp) (concat "\n\\end{tabular}"))
+                        (if (not longtblp) (format "\n\\end{%s}" tabular-env))
                         (if longtblp "\n" (if org-export-latex-tables-centered
                                               "\n\\end{center}\n" "\n"))
                         (if longtblp
                             "\\end{longtable}"
-                          (if floatp "\\end{table}"))))
+                          (if floatp (format "\\end{%s}" tblenv)))))
                       "\n\n"))))))))
 
+(defun org-export-latex-convert-table.el-table ()
+  "Replace table.el table at point with LaTeX code."
+  (let (tbl caption shortn label line floatp attr align rmlines)
+    (setq line (buffer-substring (point-at-bol) (point-at-eol))
+         label (org-get-text-property-any 0 'org-label line)
+         caption (org-get-text-property-any 0 'org-caption line)
+         shortn (org-get-text-property-any 0 'org-caption-shortn line)
+         attr (org-get-text-property-any 0 'org-attributes line)
+         align (and attr (stringp attr)
+                    (string-match "\\<align=\\([^ \t\n\r,]+\\)" attr)
+                    (match-string 1 attr))
+         rmlines (and attr (stringp attr)
+                      (string-match "\\<rmlines\\>" attr))
+         floatp (or label caption))
+    (and (get-buffer "*org-export-table*")
+        (kill-buffer (get-buffer "*org-export-table*")))
+    (table-generate-source 'latex "*org-export-table*" "caption")
+    (setq tbl (with-current-buffer "*org-export-table*"
+               (buffer-string)))
+    (while (string-match "^%.*\n" tbl)
+      (setq tbl (replace-match "" t t tbl)))
+    ;; fix the hlines
+    (when rmlines
+      (let ((n 0) lines)
+       (setq lines (mapcar (lambda (x)
+                             (if (string-match "^\\\\hline$" x)
+                                 (progn
+                                   (setq n (1+ n))
+                                   (if (= n 2) x nil))
+                               x))
+                           (org-split-string tbl "\n")))
+       (setq tbl (mapconcat 'identity (delq nil lines) "\n"))))
+    (when (and align (string-match "\\\\begin{tabular}{.*}" tbl))
+      (setq tbl (replace-match (concat "\\begin{tabular}{" align "}")
+                              t t tbl)))
+    (and (get-buffer "*org-export-table*")
+        (kill-buffer (get-buffer "*org-export-table*")))
+    (beginning-of-line 0)
+    (while (looking-at "[ \t]*\\(|\\|\\+-\\)")
+      (delete-region (point) (1+ (point-at-eol))))
+    (when org-export-latex-tables-centered
+      (setq tbl (concat "\\begin{center}\n" tbl "\\end{center}")))
+    (when floatp
+      (setq tbl (concat "\\begin{table}\n"
+                       (format "\\caption%s{%s%s}\n"
+                               (if shortn (format "[%s]" shortn) "")
+                               (if label (format "\\label{%s}" label) "")
+                               (or caption ""))
+                       tbl
+                       "\n\\end{table}\n")))
+    (insert (org-export-latex-protect-string tbl))))
+
 (defun org-export-latex-fontify ()
   "Convert fontification to LaTeX."
   (goto-char (point-min))
@@ -1468,12 +2067,17 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
       (unless (or (and (get-text-property (- (point) 2) 'org-protected)
                       (not (get-text-property
                             (- (point) 2) 'org-verbatim-emph)))
+                 (equal (char-after (match-beginning 3))
+                        (char-after (1+ (match-beginning 3))))
                  (save-excursion
                    (goto-char (match-beginning 1))
                    (save-match-data
                      (and (org-at-table-p)
                           (string-match
-                           "[|\n]" (buffer-substring beg end))))))
+                           "[|\n]" (buffer-substring beg end)))))
+                 (and (equal (match-string 3) "+")
+                      (save-match-data
+                        (string-match "\\`-+\\'" (match-string 4)))))
        (setq s (match-string 4))
        (setq rpl (concat (match-string 1)
                          (org-export-latex-emph-format (cadr emph)
@@ -1482,7 +2086,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
        (if (caddr emph)
            (setq rpl (org-export-latex-protect-string rpl))
          (save-match-data
-           (if (string-match "\\`.\\(\\\\[a-z]+{\\)\\(.*\\)\\(}\\).?\\'" rpl)
+           (if (string-match "\\`.?\\(\\\\[a-z]+{\\)\\(.*\\)\\(}\\).?\\'" rpl)
                (progn
                  (add-text-properties (match-beginning 1) (match-end 1)
                                       '(org-protected t) rpl)
@@ -1491,12 +2095,11 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
        (replace-match rpl t t)))
     (backward-char)))
 
-(defvar org-export-latex-use-verb nil)
 (defun org-export-latex-emph-format (format string)
   "Format an emphasis string and handle the \\verb special case."
-  (when (equal format "\\verb")
+  (when (member format '("\\verb" "\\protectedtexttt"))
     (save-match-data
-      (if org-export-latex-use-verb
+      (if (equal format "\\verb")
          (let ((ll "~,./?;':\"|!@#%^&-_=+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<>()[]{}"))
            (catch 'exit
              (loop for i from 0 to (1- (length ll)) do
@@ -1519,7 +2122,9 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
            (setq string (substring string (1+ (match-beginning 0))))
            (setq char (or (cdr (assoc char trans)) (concat "\\" char))
                  rtn (concat rtn char)))
-         (setq string (concat rtn string) format "\\texttt{%s}")))))
+         (setq string (concat rtn string) format "\\texttt{%s}")
+         (while (string-match "--" string)
+           (setq string (replace-match "-{}-" t t string)))))))
   (format format string))
 
 (defun org-export-latex-links ()
@@ -1541,10 +2146,11 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
                          "file")))
            (coderefp (equal type "coderef"))
            (caption (org-find-text-property-in-string 'org-caption raw-path))
+           (shortn (org-find-text-property-in-string 'org-caption-shortn raw-path))
            (attr (or (org-find-text-property-in-string 'org-attributes raw-path)
                      (plist-get org-export-latex-options-plist :latex-image-options)))
            (label (org-find-text-property-in-string 'org-label raw-path))
-           imgp radiop
+           imgp radiop fnc
            ;; define the path of the link
            (path (cond
                   ((member type '("coderef"))
@@ -1573,47 +2179,61 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
                                       raw-path))))))))
        ;; process with link inserting
        (apply 'delete-region remove)
+       (setq caption (and caption (org-export-latex-fontify-headline caption)))
        (cond ((and imgp
                   (plist-get org-export-latex-options-plist :inline-images))
              ;; OK, we need to inline an image
              (insert
-              (org-export-latex-format-image raw-path caption label attr)))
+              (org-export-latex-format-image raw-path caption label attr shortn)))
             (coderefp
              (insert (format
                       (org-export-get-coderef-format path desc)
                       (cdr (assoc path org-export-code-refs)))))
-            (radiop (insert (format "\\hyperref[%s]{%s}"
+            (radiop (insert (format org-export-latex-hyperref-format
                                     (org-solidify-link-text raw-path) desc)))
             ((not type)
-             (insert (format "\\hyperref[%s]{%s}"
+             (insert (format org-export-latex-hyperref-format
                              (org-remove-initial-hash
                               (org-solidify-link-text raw-path))
                              desc)))
-            (path 
+            (path
              (when (org-at-table-p)
                ;; There is a strange problem when we have a link in a table,
                ;; ampersands then cause a problem.  I think this must be
                ;; a LaTeX issue, but we here implement a work-around anyway.
                (setq path (org-export-latex-protect-amp path)
                      desc (org-export-latex-protect-amp desc)))
-             (insert (format "\\href{%s}{%s}" path desc)))
+             (insert
+              (if (string-match "%s.*%s" org-export-latex-href-format)
+                  (format org-export-latex-href-format path desc)
+                (format org-export-latex-href-format path))))
+
+            ((functionp (setq fnc (nth 2 (assoc type org-link-protocols))))
+             ;; The link protocol has a function for formatting the link
+             (insert
+              (save-match-data
+                (funcall fnc (org-link-unescape raw-path) desc 'latex))))
+
             (t (insert "\\texttt{" desc "}")))))))
 
 
-(defun org-export-latex-format-image (path caption label attr)
+(defun org-export-latex-format-image (path caption label attr &optional shortn)
   "Format the image element, depending on user settings."
-  (let (floatp wrapp placement figenv)
+  (let (ind floatp wrapp multicolumnp placement figenv)
     (setq floatp (or caption label))
+    (setq ind (org-get-text-property-any 0 'original-indentation path))
     (when (and attr (stringp attr))
       (if (string-match "[ \t]*\\<wrap\\>" attr)
          (setq wrapp t floatp nil attr (replace-match "" t t attr)))
       (if (string-match "[ \t]*\\<float\\>" attr)
-         (setq wrapp nil floatp t attr (replace-match "" t t attr))))
-    
+         (setq wrapp nil floatp t attr (replace-match "" t t attr)))
+      (if (string-match "[ \t]*\\<multicolumn\\>" attr)
+         (setq multicolumnp t attr (replace-match "" t t attr))))
+
     (setq placement
          (cond
           (wrapp "{l}{0.5\\textwidth}")
-          (floatp "[htb]")
+          (floatp (concat "[" org-latex-default-figure-position "]"))
           (t "")))
 
     (when (and attr (stringp attr)
@@ -1630,29 +2250,43 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
           (wrapp "\\begin{wrapfigure}%placement
 \\centering
 \\includegraphics[%attr]{%path}
-\\caption{%labelcmd%caption}
+\\caption%shortn{%labelcmd%caption}
 \\end{wrapfigure}")
+          (multicolumnp "\\begin{figure*}%placement
+\\centering
+\\includegraphics[%attr]{%path}
+\\caption%shortn{%labelcmd%caption}
+\\end{figure*}")
           (floatp "\\begin{figure}%placement
 \\centering
 \\includegraphics[%attr]{%path}
-\\caption{%labelcmd%caption}
+\\caption%shortn{%labelcmd%caption}
 \\end{figure}")
           (t "\\includegraphics[%attr]{%path}")))
 
+
+    (setq figenv (mapconcat 'identity (split-string figenv "\n")
+                           (save-excursion (beginning-of-line 1)
+                                           (looking-at "[ \t]*")
+                                           (concat "\n" (match-string 0)))))
+
     (if (and (not label) (not caption)
             (string-match "^\\\\caption{.*\n" figenv))
        (setq figenv (replace-match "" t t figenv)))
-    (org-fill-template
-     figenv
-     (list (cons "path"
-                (if (file-name-absolute-p path)
-                    (expand-file-name path)
-                  path))
-          (cons "attr" attr)
-          (cons "labelcmd" (if label (format "\\label{%s}"
-                                             label)""))
-          (cons "caption" (or caption ""))
-          (cons "placement" (or placement ""))))))
+    (org-add-props
+       (org-fill-template
+        figenv
+        (list (cons "path"
+                    (if (file-name-absolute-p path)
+                        (expand-file-name path)
+                      path))
+              (cons "attr" attr)
+              (cons "shortn" (if shortn (format "[%s]" shortn) ""))
+              (cons "labelcmd" (if label (format "\\label{%s}"
+                                                 label)""))
+              (cons "caption" (or caption ""))
+              (cons "placement" (or placement ""))))
+       nil 'original-indentation ind)))
 
 (defun org-export-latex-protect-amp (s)
   (while (string-match "\\([^\\\\]\\)\\(&\\)" s)
@@ -1666,10 +2300,71 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
     s))
 (defvar org-latex-entities)   ; defined below
 (defvar org-latex-entities-regexp)   ; defined below
-(defvar org-latex-entities-exceptions)   ; defined below
 
 (defun org-export-latex-preprocess (parameters)
   "Clean stuff in the LaTeX export."
+  ;; Replace footnotes.
+  (when (plist-get parameters :footnotes)
+    (goto-char (point-min))
+    (let (ref)
+      (while (setq ref (org-footnote-get-next-reference))
+       (let* ((beg (nth 1 ref))
+              (lbl (car ref))
+              (def (nth 1 (assoc (string-to-number lbl)
+                                 (mapcar (lambda (e) (cdr e))
+                                         org-export-footnotes-seen)))))
+         ;; Fix body for footnotes ending on a link or a list and
+         ;; remove definition from buffer.
+         (setq def
+               (concat def
+                       (if (string-match "ORG-LIST-END-MARKER\\'" def)
+                           "\n" " ")))
+         (org-footnote-delete-definitions lbl)
+         ;; Compute string to insert (FNOTE), and protect the outside
+         ;; macro from further transformation.  When footnote at
+         ;; point is referring to a previously defined footnote, use
+         ;; \footnotemark. Otherwise, use \footnote.
+         (let ((fnote (if (member lbl org-export-latex-footmark-seen)
+                          (org-export-latex-protect-string
+                           (format "\\footnotemark[%s]" lbl))
+                        (push lbl org-export-latex-footmark-seen)
+                        (concat (org-export-latex-protect-string "\\footnote{")
+                                def
+                                (org-export-latex-protect-string "}"))))
+               ;; Check if another footnote is immediately following.
+               ;; If so, add a separator in-between.
+               (sep (org-export-latex-protect-string
+                     (if (save-excursion (goto-char (1- (nth 2 ref)))
+                                         (let ((next (org-footnote-get-next-reference)))
+                                           (and next (= (nth 1 next) (nth 2 ref)))))
+                         org-export-latex-footnote-separator ""))))
+           (when (org-on-heading-p)
+             (setq fnote (concat (org-export-latex-protect-string "\\protect")
+                                 fnote)))
+           ;; Ensure a footnote at column 0 cannot end a list
+           ;; containing it.
+           (put-text-property 0 (length fnote) 'original-indentation 1000 fnote)
+           ;; Replace footnote reference with FNOTE and, maybe, SEP.
+           ;; `save-excursion' is required if there are two footnotes
+           ;; in a row.  In that case, point would be left at the
+           ;; beginning of the second one, and
+           ;; `org-footnote-get-next-reference' would then skip it.
+           (goto-char beg)
+           (delete-region beg (nth 2 ref))
+           (save-excursion (insert fnote sep)))))))
+
+  ;; Remove footnote section tag for LaTeX
+  (goto-char (point-min))
+  (while (re-search-forward
+         (concat "^" footnote-section-tag-regexp) nil t)
+    (org-if-unprotected
+     (replace-match "")))
+  ;; Remove any left-over footnote definition.
+  (mapc (lambda (fn) (org-footnote-delete-definitions (car fn)))
+       org-export-footnotes-data)
+  (mapc (lambda (fn) (org-footnote-delete-definitions fn))
+       org-export-latex-footmark-seen)
+
   ;; Preserve line breaks
   (goto-char (point-min))
   (while (re-search-forward "\\\\\\\\" nil t)
@@ -1679,18 +2374,18 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
   ;; Preserve latex environments
   (goto-char (point-min))
   (while (re-search-forward "^[ \t]*\\\\begin{\\([a-zA-Z]+\\*?\\)}" nil t)
-    (let* ((start (progn (beginning-of-line) (point)))
-          (end (and (re-search-forward
-                     (concat "^[ \t]*\\\\end{"
-                             (regexp-quote (match-string 1))
-                             "}") nil t)
-                    (point-at-eol))))
-      (if end
-         (add-text-properties start end '(org-protected t))
-       (goto-char (point-at-eol)))))
+    (org-if-unprotected
+     (let* ((start (progn (beginning-of-line) (point)))
+           (end (and (re-search-forward
+                      (concat "^[ \t]*\\\\end{"
+                              (regexp-quote (match-string 1))
+                              "}") nil t)
+                     (point-at-eol))))
+       (if end
+          (add-text-properties start end '(org-protected t))
+        (goto-char (point-at-eol))))))
 
   ;; Preserve math snippets
-
   (let* ((matchers (plist-get org-format-latex-options :matchers))
         (re-list org-latex-regexps)
         beg end re e m n block off)
@@ -1705,13 +2400,15 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
          (setq beg (+ (match-beginning 0) off) end (- (match-end 0) 0))
          (add-text-properties beg end '(org-protected t org-latex-math t))))))
 
-  ;; Convert LaTeX to \LaTeX{}
+  ;; Convert LaTeX to \LaTeX{} and TeX to \TeX{}
   (goto-char (point-min))
   (let ((case-fold-search nil))
-    (while (re-search-forward "\\([^+_]\\)LaTeX" nil t)
-      (org-if-unprotected
-       (replace-match (org-export-latex-protect-string
-                      (concat (match-string 1) "\\LaTeX{}")) t t))))
+    (while (re-search-forward "\\<\\(\\(La\\)?TeX\\)\\>" nil t)
+      (unless (eq (char-before (match-beginning 1)) ?\\)
+       (org-if-unprotected-1
+        (replace-match (org-export-latex-protect-string
+                        (concat "\\" (match-string 1)
+                                "{}")) t t)))))
 
   ;; Convert blockquotes
   (goto-char (point-min))
@@ -1742,6 +2439,18 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
     (and (looking-at "[ \t]*ORG-VERSE-END.*")
         (org-replace-match-keep-properties "\\end{verse}" t t)))
 
+  ;; Convert #+INDEX to LaTeX \\index.
+  (goto-char (point-min))
+  (let ((case-fold-search t) entry)
+    (while (re-search-forward
+           "^[ \t]*#\\+index:[ \t]*\\([^ \t\r\n].*?\\)[ \t]*$"
+           nil t)
+      (setq entry
+           (save-match-data
+             (org-export-latex-protect-string
+              (org-export-latex-fontify-headline (match-string 1)))))
+      (replace-match (format "\\index{%s}" entry) t t)))
+
   ;; Convert center
   (goto-char (point-min))
   (while (search-forward "ORG-CENTER-START" nil t)
@@ -1754,30 +2463,46 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
 
   ;; Convert horizontal rules
   (goto-char (point-min))
-  (while (re-search-forward "^----+.$" nil t)
+  (while (re-search-forward "^[ \t]*-\\{5,\\}[ \t]*$" nil t)
     (org-if-unprotected
      (replace-match (org-export-latex-protect-string "\\hrule") t t)))
 
   ;; Protect LaTeX commands like \command[...]{...} or \command{...}
-  (let ((re (concat "\\\\[a-zA-Z]+\\(?:"
-                   "\\[.*\\]"
-                   "\\)?"
-                   (org-create-multibrace-regexp "{" "}" 3))))
+  (goto-char (point-min))
+  (let ((re (concat
+            "\\\\\\([a-zA-Z]+\\*?\\)"
+            "\\(?:<[^<>\n]*>\\)*"
+            "\\(?:\\[[^][\n]*?\\]\\)*"
+            "\\(?:<[^<>\n]*>\\)*"
+            "\\(" (org-create-multibrace-regexp "{" "}" 3) "\\)\\{1,3\\}")))
     (while (re-search-forward re nil t)
-      (unless (save-excursion (goto-char (match-beginning 0))
-                             (equal (char-after (point-at-bol)) ?#))
+      (unless (or
+              ;; Check for comment line.
+              (save-excursion (goto-char (match-beginning 0))
+                              (org-in-indented-comment-line))
+              ;; Check if this is a defined entity, so that is may
+              ;; need conversion.
+              (org-entity-get (match-string 1))
+              ;; Do not protect interior of footnotes.  Those have
+              ;; already been taken care of earlier in the function.
+              ;; Yet, keep looking inside them for more commands.
+              (and (equal (match-string 1) "footnote")
+                   (goto-char (match-end 1))))
        (add-text-properties (match-beginning 0) (match-end 0)
                             '(org-protected t)))))
 
+  ;; Special case for \nbsp
+  (goto-char (point-min))
+  (while (re-search-forward "\\\\nbsp\\({}\\|\\>\\)" nil t)
+    (org-if-unprotected
+     (replace-match (org-export-latex-protect-string "~"))))
+
   ;; Protect LaTeX entities
   (goto-char (point-min))
-  (let (a)
-    (while (re-search-forward org-latex-entities-regexp nil t)
-      (if (setq a (assoc (match-string 0) org-latex-entities-exceptions))
-         (replace-match (org-add-props (nth 1 a) nil 'org-protected t)
-                        t t)
-       (add-text-properties (match-beginning 0) (match-end 0)
-                            '(org-protected t)))))
+  (while (re-search-forward org-latex-entities-regexp nil t)
+    (org-if-unprotected
+     (add-text-properties (match-beginning 0) (match-end 0)
+                         '(org-protected t))))
 
   ;; Replace radio links
   (goto-char (point-min))
@@ -1785,74 +2510,75 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
          (concat "<<<?" org-export-latex-all-targets-re
                  ">>>?\\((INVISIBLE)\\)?") nil t)
     (org-if-unprotected-at (+ (match-beginning 0) 2)
-     (replace-match
-      (org-export-latex-protect-string
-       (format "\\label{%s}%s" (save-match-data (org-solidify-link-text
-                                                (match-string 1)))
-              (if (match-string 2) "" (match-string 1)))) t t)))
+      (replace-match
+       (concat
+       (org-export-latex-protect-string
+        (format "\\label{%s}" (save-match-data (org-solidify-link-text
+                                                (match-string 1)))))
+       (if (match-string 2) "" (match-string 1)))
+       t t)))
 
   ;; Delete @<...> constructs
   ;; Thanks to Daniel Clemente for this regexp
   (goto-char (point-min))
   (while (re-search-forward "@<\\(?:[^\"\n]\\|\".*\"\\)*?>" nil t)
     (org-if-unprotected
-     (replace-match "")))
-
-  ;; When converting to LaTeX, replace footnotes
-  ;; FIXME: don't protect footnotes from conversion
-  (when (plist-get org-export-latex-options-plist :footnotes)
-    (goto-char (point-min))
-    (while (re-search-forward "\\[\\([0-9]+\\)\\]" nil t)
-      (org-if-unprotected
-       (when (and (save-match-data
-                   (save-excursion (beginning-of-line)
-                                   (looking-at "[^:|#]")))
-                 (not (org-in-verbatim-emphasis)))
-        (let ((foot-beg (match-beginning 0))
-              (foot-end (match-end 0))
-              (foot-prefix (match-string 0))
-              footnote footnote-rpl)
-          (save-excursion
-            (if (not (re-search-forward (concat "^" (regexp-quote foot-prefix))
-                                        nil t))
-                (replace-match (org-export-latex-protect-string
-                                (concat "$^{" (match-string 1) "}$")))
-              (replace-match "")
-              (let ((end (save-excursion
-                           (if (re-search-forward "^$\\|^#.*$\\|\\[[0-9]+\\]" nil t)
-                               (match-beginning 0) (point-max)))))
-                (setq footnote (concat (org-trim (buffer-substring (point) end))
-                                       " ")) ; prevent last } being part of a link
-                (delete-region (point) end))
-              (goto-char foot-beg)
-              (delete-region foot-beg foot-end)
-              (unless (null footnote)
-                (setq footnote-rpl (format "\\footnote{%s}" footnote))
-                (add-text-properties 0 10 '(org-protected t) footnote-rpl)
-                (add-text-properties (1- (length footnote-rpl))
-                                     (length footnote-rpl)
-                                     '(org-protected t) footnote-rpl)
-                (insert footnote-rpl)))
-            )))))
-
-    ;; Remove footnote section tag for LaTeX
-    (goto-char (point-min))
-    (while (re-search-forward
-           (concat "^" footnote-section-tag-regexp) nil t)
-      (org-if-unprotected
-       (replace-match "")))))
+     (replace-match ""))))
+
+(defun org-export-latex-fix-inputenc ()
+  "Set the coding system in inputenc to what the buffer is."
+  (let* ((cs buffer-file-coding-system)
+        (opt (or (ignore-errors (latexenc-coding-system-to-inputenc cs))
+                 "utf8")))
+    (when opt
+      ;; Translate if that is requested
+      (setq opt (or (cdr (assoc opt org-export-latex-inputenc-alist)) opt))
+      ;; find the \usepackage statement and replace the option
+      (goto-char (point-min))
+      (while (re-search-forward "\\\\usepackage\\[\\(AUTO\\)\\]{inputenc}"
+                               nil t)
+       (goto-char (match-beginning 1))
+       (delete-region (match-beginning 1) (match-end 1))
+       (insert opt))
+      (and buffer-file-name
+          (save-buffer)))))
 
 ;;; List handling:
 
 (defun org-export-latex-lists ()
   "Convert plain text lists in current buffer into LaTeX lists."
-  (goto-char (point-min))
-  (while (re-search-forward org-list-beginning-re nil t)
-    (org-if-unprotected
-     (beginning-of-line)
-     (insert (org-list-to-latex (org-list-parse-list t)
-                               org-export-latex-list-parameters))
-     "\n")))
+  ;; `org-list-end-re' output has changed since preprocess from
+  ;; org-exp.el. Make sure it is taken into account.
+  (let ((org-list-ending-method
+        (if (eq org-list-ending-method 'regexp) 'regexp 'both))
+       (org-list-end-re "^ORG-LIST-END-MARKER\n"))
+    (mapc
+     (lambda (e)
+       ;; For each type of context allowed for list export (E), find
+       ;; every list, parse it, delete it and insert resulting
+       ;; conversion to latex (RES), while keeping the same
+       ;; `original-indentation' property.
+       (let (res)
+        (goto-char (point-min))
+        (while (re-search-forward (org-item-beginning-re) nil t)
+          (when (and (eq (get-text-property (point) 'list-context) e)
+                     (not (get-text-property (point) 'org-example)))
+            (beginning-of-line)
+            (setq res
+                  (org-list-to-latex
+                   ;; Narrowing is needed because we're converting
+                   ;; from inner functions to outer ones.
+                   (save-restriction
+                     (narrow-to-region (point) (point-max))
+                     (org-list-parse-list t))
+                   org-export-latex-list-parameters))
+            ;; Extend previous value of original-indentation to the
+            ;; whole string
+            (insert (org-add-props res nil 'original-indentation
+                                   (org-find-text-property-in-string
+                                    'original-indentation res)))))))
+     ;; List of allowed contexts for export, and the default one.
+     (append org-list-export-context '(nil)))))
 
 (defconst org-latex-entities
  '("\\!"
@@ -1871,6 +2597,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
    "\\Styles"
    "\\\\"
    "\\`"
+   "\\\""
    "\\addcontentsline"
    "\\address"
    "\\addtocontents"
@@ -1959,7 +2686,6 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
    "\\medskip"
    "\\multicolumn"
    "\\multiput"
-   ("\\nbsp" "~")
    "\\newcommand"
    "\\newcounter"
    "\\newenvironment"
@@ -2031,14 +2757,9 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
    "\\vspace")
  "A list of LaTeX commands to be protected when performing conversion.")
 
-(defvar org-latex-entities-exceptions nil)
-
 (defconst org-latex-entities-regexp
   (let (names rest)
     (dolist (x org-latex-entities)
-      (when (consp x)
-       (add-to-list 'org-latex-entities-exceptions x)
-       (setq x (car x)))
       (if (string-match "[a-zA-Z]$" x)
          (push x names)
        (push x rest)))
@@ -2048,6 +2769,6 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
 (provide 'org-export-latex)
 (provide 'org-latex)
 
-;; arch-tag: 23c2b87d-da04-4c2d-ad2d-1eb6487bc3ad
+
 
 ;;; org-latex.el ends here