ox-latex: Add polyglossia support

* ox-latex.el (org-latex-guess-polyglossia-language): New function.
  (org-latex-polyglossia-language-alist): New defconst.
  (org-latex-template): Apply new function.
* ox-koma-letter.el (org-koma-letter-template): Apply new function.

Suggested-by: Suvayu Ali <fatkasuvayu+linux@gmail.com>
<http://permalink.gmane.org/gmane.emacs.orgmode/98921>
This commit is contained in:
Rasmus 2015-07-08 14:12:21 +02:00
parent 00142f4edf
commit 3f03986bb2
1 changed files with 151 additions and 10 deletions

View File

@ -204,6 +204,94 @@
("uk" . "ukrainian"))
"Alist between language code and corresponding Babel option.")
(defconst org-latex-polyglossia-language-alist
'(("am" "amharic")
("ast" "asturian")
("ar" "arabic")
("bo" "tibetan")
("bn" "bengali")
("bg" "bulgarian")
("br" "breton")
("bt-br" "brazilian")
("ca" "catalan")
("cop" "coptic")
("cs" "czech")
("cy" "welsh")
("da" "danish")
("de" "german" "german")
("de-at" "german" "austrian")
("de-de" "german" "german")
("dv" "divehi")
("el" "greek")
("en" "english" "usmax")
("en-au" "english" "australian")
("en-gb" "english" "uk")
("en-nz" "english" "newzealand")
("en-us" "english" "usmax")
("eo" "esperanto")
("es" "spanish")
("et" "estonian")
("eu" "basque")
("fa" "farsi")
("fi" "finnish")
("fr" "french")
("fu" "friulan")
("ga" "irish")
("gd" "scottish")
("gl" "galician")
("he" "hebrew")
("hi" "hindi")
("hr" "croatian")
("hu" "magyar")
("hy" "armenian")
("id" "bahasai")
("ia" "interlingua")
("is" "icelandic")
("it" "italian")
("kn" "kannada")
("la" "latin" "modern")
("la-modern" "latin" "modern")
("la-classic" "latin" "classic")
("la-medieval" "latin" "medieval")
("lo" "lao")
("lt" "lithuanian")
("lv" "latvian")
("mr" "maranthi")
("ml" "malayalam")
("nl" "dutch")
("nb" "norsk")
("nn" "nynorsk")
("nko" "nko")
("no" "norsk")
("oc" "occitan")
("pl" "polish")
("pms" "piedmontese")
("pt" "portuges")
("rm" "romansh")
("ro" "romanian")
("ru" "russian")
("sa" "sanskrit")
("hsb" "usorbian")
("dsb" "lsorbian")
("sk" "slovak")
("sl" "slovenian")
("se" "samin")
("sq" "albanian")
("sr" "serbian")
("sv" "swedish")
("syr" "syriac")
("ta" "tamil")
("te" "telugu")
("th" "thai")
("tk" "turkmen")
("tr" "turkish")
("uk" "ukrainian")
("ur" "urdu")
("vi" "vietnamese"))
"Alist between language code and corresponding Polyglossia option")
(defconst org-latex-table-matrix-macros '(("bordermatrix" . "\\cr")
("qbordermatrix" . "\\cr")
("kbordermatrix" . "\\\\"))
@ -1195,6 +1283,57 @@ Return the new header."
", ")
t nil header 1)))))
(defun org-latex-guess-polyglossia-language (header info)
"Set the Polyglossia language according to the LANGUAGE keyword.
HEADER is the LaTeX header string. INFO is the plist used as
a communication channel.
Insertion of guessed language only happens when the Polyglossia
package has been explicitly loaded.
The argument to Polyglossia may be \"AUTO\" which is then
replaced with the language of the document or
`org-export-default-language'. Note, the language is really set
using \setdefaultlanguage and not as an option to the package.
Return the new header."
(let ((language (plist-get info :language))
result)
;; If no language is set or Polyglossia is not loaded, return
;; HEADER as-is.
(if (or (not (org-string-nw-p language))
(not (string-match
"\\\\usepackage\\(?:\\[\\([^]]+?\\)\\]\\){polyglossia}\n" header)))
header
(let* ((options (org-string-nw-p (match-string 1 header)))
(languages (when options
(save-match-data
;; Reverse as the last loaded language is
;; the main language.
(reverse
(delete-dups
(org-split-string
(replace-regexp-in-string
"AUTO" language options t)
",[ \t]*"))))))
(main-language-set-p
(string-match-p "\\\\setmainlanguage{.*?}" header)))
(replace-match
(concat "\\usepackage{polyglossia}\n"
(loop for l in languages concat
(let ((lang (or (assoc l org-latex-polyglossia-language-alist)
l)))
(format (if main-language-set-p
"\\setotherlanguage%s{%s}\n"
(progn (setq main-language-set-p t)
"\\setmainlanguage%s{%s}\n"))
(if (and (listp lang) (eq 3 (length lang)))
(format "[variant=%s]" (nth 2 lang))
"")
(nth 1 lang)))))
t t header 0)))))
(defun org-latex--find-verb-separator (s)
"Return a character not used in string S.
This is used to choose a separator for constructs like \\verb."
@ -1349,16 +1488,18 @@ holding export options."
class-options header t nil 1)))))
(if (not document-class-string)
(user-error "Unknown LaTeX class `%s'" class)
(org-latex-guess-babel-language
(org-latex-guess-inputenc
(org-element-normalize-string
(org-splice-latex-header
document-class-string
org-latex-default-packages-alist
org-latex-packages-alist nil
(concat (org-element-normalize-string
(plist-get info :latex-header))
(plist-get info :latex-header-extra)))))
(org-latex-guess-polyglossia-language
(org-latex-guess-babel-language
(org-latex-guess-inputenc
(org-element-normalize-string
(org-splice-latex-header
document-class-string
org-latex-default-packages-alist
org-latex-packages-alist nil
(concat (org-element-normalize-string
(plist-get info :latex-header))
(plist-get info :latex-header-extra)))))
info)
info)))
;; Possibly limit depth for headline numbering.
(let ((sec-num (plist-get info :section-numbers)))