diff options
Diffstat (limited to 'elpa/auctex-13.1.3/style/polyglossia.el')
-rw-r--r-- | elpa/auctex-13.1.3/style/polyglossia.el | 366 |
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 |