summaryrefslogtreecommitdiff
path: root/elpa/auctex-13.1.3/style/polyglossia.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/auctex-13.1.3/style/polyglossia.el')
-rw-r--r--elpa/auctex-13.1.3/style/polyglossia.el366
1 files changed, 366 insertions, 0 deletions
diff --git a/elpa/auctex-13.1.3/style/polyglossia.el b/elpa/auctex-13.1.3/style/polyglossia.el
new file mode 100644
index 0000000..cdfb03e
--- /dev/null
+++ b/elpa/auctex-13.1.3/style/polyglossia.el
@@ -0,0 +1,366 @@
+;;; polyglossia.el --- AUCTeX style for `polyglossia.sty' version 1.42.0. -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2015-2021 Free Software Foundation, Inc.
+
+;; Maintainer: auctex-devel@gnu.org
+;; Author: Mosè Giordano <mose@gnu.org>
+;; Keywords: tex
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;; AUCTeX is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with AUCTeX; see the file COPYING. If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds support for `polyglossia.sty' version 1.42.0.
+
+;;; TODO:
+
+;; -- Create language specific styles with names `gloss-<lang>.el'. They
+;; should add `text<lang>' macros, `<lang>' environments (`Arabic' for
+;; `arabic' language), and the others language-specific commands.
+
+;;; Code:
+
+(require 'tex) ;Indispensable when compiling the call to `TeX-auto-add-type'.
+(require 'latex)
+
+;; Silence the compiler:
+(declare-function font-latex-add-keywords
+ "font-latex"
+ (keywords class))
+
+(TeX-auto-add-type "polyglossia-lang" "LaTeX")
+
+;; Self Parsing -- see (info "(auctex)Hacking the Parser").
+(defvar LaTeX-polyglossia-lang-regexp
+ (concat "\\\\set\\(defaultlanguage\\|mainlanguage\\|otherlanguages?\\)"
+ "[ \t\n\r]*\\(?:\\[\\(.*\\)\\]\\)?[ \t\n\r]*{\\([A-Za-z, ]+\\)}")
+ "Matches languages set with polyglossia macros.")
+
+(defvar LaTeX-polyglossia-setkeys-regexp
+ (concat "\\\\setkeys"
+ "[ \t\n\r]*{\\([A-Za-z]+\\)}[ \t\n\r]*{\\([^}]*\\)}")
+ "Matches polyglossia languages options set using \"\setkeys\".")
+
+(defvar LaTeX-auto-polyglossia-lang nil
+ "Temporary for parsing polyglossia languages.")
+
+(defvar LaTeX-auto-polyglossia-setkeys nil
+ "Temporary for parsing polyglossia language options.")
+
+(defun LaTeX-polyglossia-prepare ()
+ "Clear some polyglossia variables before use."
+ (setq LaTeX-auto-polyglossia-lang nil
+ LaTeX-auto-polyglossia-setkeys nil
+ LaTeX-polyglossia-lang-list nil))
+
+(defun LaTeX-polyglossia-cleanup ()
+ "Move languages and their options from
+`LaTeX-auto-polyglossia-lang' to `LaTeX-polyglossia-lang-list'."
+ ;; Example: now the value of `LaTeX-auto-polyglossia-lang' is something like
+ ;; '(("danish" "defaultlanguage" "")
+ ;; ("arabic" "otherlanguage" "locale=tunisia,numerals=maghrib")
+ ;; ("german" "otherlanguage" "spelling=new,script=latin")
+ ;; ("icelandic,brazil,sanskrit" "otherlanguages" ""))
+ ;; We want to end up with a list like
+ ;; '(("danish" "defaultlanguage")
+ ;; ("arabic" "otherlanguage" "locale=tunisia" "numerals=maghrib")
+ ;; ("german" "otherlanguage" "spelling=new" "script=latin")
+ ;; ("icelandic" "otherlanguages")
+ ;; ("brazil" "otherlanguages")
+ ;; ("sanskrit" "otherlanguages" "script=Devanagari"))
+ ;; with "script=Devanagari" option to "sanskrit" language set using
+ ;; "\setkeys".
+ ;; In each element of the alist, the key is the language, the second value is
+ ;; the polyglossia command which set the language, the rest of values is the
+ ;; list of options given to the language.
+ (let (opts otheropts)
+ (mapc
+ (lambda (elt)
+ (mapc
+ (lambda (language)
+ ;; `opts' is the string of options for `language', set using
+ ;; "\setdefaultlanguage" or "\setotherlanguage".
+ (setq opts (cdr (cdr elt)))
+ ;; `otheropts' is the string of options for `language' set using
+ ;; "\setkeys".
+ (setq otheropts
+ (car (cdr (assoc language LaTeX-auto-polyglossia-setkeys))))
+ (add-to-list
+ 'LaTeX-polyglossia-lang-list
+ (append
+ (list language) (list (nth 1 elt))
+ (unless (equal opts '(""))
+ (LaTeX-listify-package-options (car opts)))
+ (if otheropts (LaTeX-listify-package-options otheropts))) t))
+ (LaTeX-listify-package-options (car elt))))
+ LaTeX-auto-polyglossia-lang)))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-polyglossia-prepare)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-polyglossia-cleanup)
+(add-hook 'TeX-update-style-hook #'TeX-auto-parse t)
+;; Run style hooks for every active language. This *has* to be done after
+;; `TeX-auto-parse'.
+(add-hook 'TeX-update-style-hook #'LaTeX-polyglossia-load-languages t)
+
+(defvar LaTeX-polyglossia-language-list
+ '("albanian" "amharic" "arabic" "armenian" "asturian" "bahasai" "bahasam"
+ "basque" "bengali" "brazil" "breton" "bulgarian" "catalan" "coptic"
+ "croatian" "czech" "danish" "divehi" "dutch" "english" "esperanto"
+ "estonian" "farsi" "finnish" "french" "friulan" "galician" "german" "greek"
+ "hebrew" "hindi" "icelandic" "interlingua" "irish" "italian" "kannada"
+ "khmer" "korean" "lao" "latin" "latvian" "lithuanian" "lsorbian" "magyar"
+ "malayalam" "marathi" "nko" "norsk" "nynorsk" "occitan" "piedmontese"
+ "polish" "portuges" "romanian" "romansh" "russian" "samin" "sanskrit"
+ "scottish" "serbian" "slovak" "slovenian" "spanish" "swedish" "syriac"
+ "tamil" "telugu" "thai" "tibetan" "turkish" "turkmen" "ukrainian" "urdu"
+ "usorbian" "vietnamese" "welsh")
+ "List of languages supported by the polyglossia LaTeX package.")
+
+(defun LaTeX-polyglossia-active-languages ()
+ "Return a list of polyglossia languages used in the document.
+The last language is the default one."
+ (let (active-languages default)
+ (mapc
+ (lambda (elt)
+ (setq default (or (string-equal "defaultlanguage" (nth 1 elt))
+ (string-equal "mainlanguage" (nth 1 elt))))
+ ;; Append the language to the list if it's the default one.
+ (if default
+ (setq active-languages (append active-languages
+ (list (car elt))))
+ (push active-languages (car elt))))
+ LaTeX-polyglossia-lang-list)
+ active-languages))
+
+(defun LaTeX-polyglossia-lang-option-member (language option)
+ "Return non-nil if OPTION has been given to polyglossia LANGUAGE.
+The value is actually the tail of the list of options given to LANGUAGE."
+ (member option (cdr (cdr (assoc language LaTeX-polyglossia-lang-list)))))
+
+(defun LaTeX-arg-polyglossia-lang (_optional _default multiple setkeys)
+ "Prompt for language and its options with completion and insert them
+as arguments.
+
+This function is triggered by \"\setdefaultlanguage\",
+\"\setotherlanguage\", \"\setotherlanguages\", and \"\setkeys\"
+macros by polyglossia package.
+
+OPTIONAL and DEFAULT are ignored, if MULTIPLE is non-nil prompt
+for multiple languages, if SETKEYS is non-nil insert options as
+second mandatory argument."
+ ;; DEFAULT = t , MULTIPLE = nil, SETKEYS = nil: "\setdefaultlanguage".
+ ;; DEFAULT = nil, MULTIPLE = nil, SETKEYS = nil: "\setotherlanguage".
+ ;; DEFAULT = nil, MULTIPLE = t , SETKEYS = nil: "\setotherlanguages".
+ ;; DEFAULT = nil, MULTIPLE = nil, SETKEYS = t : "\setkeys".
+
+ ;; Note: `DEFAULT' is currently ignored because we don't really have a
+ ;; mechanism to identify the default polyglossia language.
+ (let ((language (funcall
+ (if multiple
+ #'TeX-completing-read-multiple
+ #'completing-read)
+ (if multiple "Languages: " "Language: ")
+ (if setkeys
+ (LaTeX-polyglossia-active-languages)
+ LaTeX-polyglossia-language-list)))
+ var options)
+ (if multiple
+ (mapc (lambda (elt) (TeX-run-style-hooks (concat "gloss-" elt)))
+ language)
+ (TeX-run-style-hooks (concat "gloss-" language)))
+ ;; "\setotherlanguages" doesn't take options, don't prompt for them.
+ (setq options
+ (if multiple ""
+ (setq var (intern (format "LaTeX-polyglossia-%s-options-list" language)))
+ (if (and (boundp var) (symbol-value var))
+ ;; "\setdefaultlanguage" and "\setotherlanguage" use `options'
+ ;; as first optional argument; "\setkeys" uses `options' as
+ ;; second mandatory argument.
+ (TeX-read-key-val (not setkeys) (symbol-value var))
+ ;; When `LaTeX-polyglossia-<lang>-options-list' is nil or not
+ ;; defined, don't prompt for options.
+ "")))
+ (unless setkeys
+ (let ((TeX-arg-opening-brace LaTeX-optop)
+ (TeX-arg-closing-brace LaTeX-optcl))
+ (TeX-argument-insert options t)))
+ (if multiple
+ (setq language (mapconcat #'identity language ",")))
+ (TeX-argument-insert language nil)
+ (if setkeys
+ (TeX-argument-insert options nil))))
+
+(defun LaTeX-arg-polyglossiasetup-options (optional)
+ "Prompt for setup options of polyglossia package.
+If OPTIONAL is non-nil, insert the resulting value as an optional
+argument, otherwise as a mandatory one."
+ (TeX-arg-key-val optional
+ '(("language") ;; TODO: add completion in `fontspec.el', see
+ ;; "\newfontlanguage"s in `fontspec-xetex.sty'.
+ ("hyphennames")
+ ("script") ;; TODO: add completion in `fontspec.el', see
+ ;; "\newfontscript"s in `fontspec-xetex.sty'.
+ ("direction" ("RL" "LR"))
+ ("scripttag")
+ ("langtag")
+ ("hyphenmins")
+ ("frenchspacing" ("true" "false"))
+ ("indentfirst" ("true" "false"))
+ ("fontsetup" ("true" "false"))
+ ;; The following options aren't already implemented but are
+ ;; present in `polyglossia.sty' comments.
+ ;; ("nouppercase" ("true" "false"))
+ ;; ("localalph")
+ ;; ("localnumber")
+ )))
+
+(defun LaTeX-polyglossia-load-languages ()
+ "Load style files of babel active languages."
+ (mapc (lambda (elt) (TeX-run-style-hooks (concat "gloss-" elt)))
+ (LaTeX-polyglossia-active-languages)))
+
+(TeX-add-style-hook
+ "polyglossia"
+ (lambda ()
+ (TeX-check-engine-add-engines 'luatex 'xetex)
+ (TeX-auto-add-regexp
+ `(,LaTeX-polyglossia-lang-regexp (3 1 2) LaTeX-auto-polyglossia-lang))
+ (TeX-auto-add-regexp
+ `(,LaTeX-polyglossia-setkeys-regexp (1 2) LaTeX-auto-polyglossia-setkeys))
+ (TeX-run-style-hooks "makecmds" "xkeyval" "fontspec")
+ (TeX-add-symbols
+ '("setdefaultlanguage" (LaTeX-arg-polyglossia-lang t nil nil))
+ '("setmainlanguage" (LaTeX-arg-polyglossia-lang t nil nil))
+ '("setotherlanguage" (LaTeX-arg-polyglossia-lang nil nil nil))
+ '("setotherlanguages" (LaTeX-arg-polyglossia-lang nil t nil))
+ '("setkeys" (LaTeX-arg-polyglossia-lang nil nil t ))
+ '("PolyglossiaSetup" (TeX-arg-eval completing-read "Language: "
+ (LaTeX-polyglossia-active-languages))
+ LaTeX-arg-polyglossiasetup-options)
+ "selectbackgroundlanguage"
+ '("resetdefaultlanguage" ["argument"] 1)
+ "normalfontlatin"
+ "rmfamilylatin"
+ "sffamilylatin"
+ "ttfamilylatin"
+ "selectlanguage"
+ "foreignlanguage")
+
+ (TeX-declare-expert-macros
+ "polyglossia"
+ "PolyglossiaSetup" "selectbackgroundlanguage" "resetdefaultlanguage"
+ "normalfontlatin" "rmfamilylatin" "sffamilylatin" "ttfamilylatin"
+ "selectlanguage" "foreignlanguage")
+
+ ;; Fontification
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords '(("setdefaultlanguage" "[{")
+ ("setmainlanguage" "[{")
+ ("setotherlanguage" "[{")
+ ("setotherlanguages" "{")
+ ("setkeys" "{{"))
+ 'function)))
+ TeX-dialect)
+
+;; TODO: move each option variable in its specific `gloss-<lang>.el' file.
+(defvar LaTeX-polyglossia-arabic-options-list
+ '(("calendar" ("gregorian" "islamic"))
+ ("locale" ("default" "mashriq" "libya" "algeria" "tunisia" "morocco" "mauritania"))
+ ("numerals" ("mashriq" "maghrib"))
+ ("abjadjimnotail" ("false" "true")))
+ "Arabic language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-bengali-options-list
+ '(("numerals" ("Western" "Devanagari"))
+ ("changecounternumbering" ("true" "false")))
+ "Bengali language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-catalan-options-list
+ '(("babelshorthands" ("true" "false")))
+ "Catalan language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-dutch-options-list
+ '(("babelshorthands" ("true" "false")))
+ "Dutch language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-english-options-list
+ '(("variant" ("american" "usmax" "british" "australian" "newzealand"))
+ ("ordinalmonthday" ("true" "false")))
+ "English language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-farsi-options-list
+ '(("numerals" ("western" "eastern"))
+ ;; ("locale") ;; not yet implemented
+ ;; ("calendar") ;; not yet implemented
+ )
+ "Farsi language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-german-options-list
+ '(("variant" ("german" "austrian" "swiss"))
+ ("spelling" ("new" "old"))
+ ("latesthyphen" ("true" "false"))
+ ("babelshorthands" ("true" "false"))
+ ("script" ("latin" "fraktur")))
+ "German language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-greek-options-list
+ '(("variant" ("monotonic" "polytonic" "ancient"))
+ ("numerals" ("greek" "arabic"))
+ ("attic" ("true" "false")))
+ "Greek language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-hebrew-options-list
+ '(("numerals" ("hebrew" "arabic"))
+ ("calendar" ("hebrew" "gregorian")))
+ "Hebrew language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-hindi-options-list
+ '(("numerals" ("Western" "Devanagari")))
+ "Hindi language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-lao-options-list
+ '(("numerals" ("lao" "arabic")))
+ "Lao language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-russian-options-list
+ '(("spelling" ("modern" "old"))
+ ("babelshorthands" ("true" "false")))
+ "Russian language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-sanskrit-options-list
+ '(("Script" ("Devanagari")))
+ "Sanskrit language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-serbian-options-list
+ '(("script" ("cyrillic" "latin")))
+ "Serbian language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-syriac-options-list
+ '(("numerals" ("western" "eastern" "abjad")))
+ "Syriac language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-thai-options-list
+ '(("numerals" ("thai" "arabic")))
+ "Thai language options for the polyglossia package.")
+
+(defvar LaTeX-polyglossia-package-options
+ '("babelshorthands" "localmarks" "nolocalmarks" "quiet")
+ "Package options for the polyglossia package.")
+
+;;; polyglossia.el ends here