summaryrefslogtreecommitdiff
path: root/elpa/auctex-13.1.3/style/babel.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/auctex-13.1.3/style/babel.el')
-rw-r--r--elpa/auctex-13.1.3/style/babel.el436
1 files changed, 436 insertions, 0 deletions
diff --git a/elpa/auctex-13.1.3/style/babel.el b/elpa/auctex-13.1.3/style/babel.el
new file mode 100644
index 0000000..a7d6747
--- /dev/null
+++ b/elpa/auctex-13.1.3/style/babel.el
@@ -0,0 +1,436 @@
+;;; babel.el --- AUCTeX style for `babel.sty' version 3.31. -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2005-2022 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2005-05-29
+;; 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 `babel.sty' version 3.31 from 2019/05/04.
+
+;;; Code:
+
+(require 'tex)
+(require 'latex)
+
+(eval-when-compile
+ (require 'cl-lib))
+
+;; Silence the compiler:
+(declare-function font-latex-add-keywords
+ "font-latex"
+ (keywords class))
+
+(defvar LaTeX-babel-language-list
+ '("afrikaans"
+ "azerbaijani"
+ "bahasa" "indonesian" "indon" "bahasai" "bahasam" "malay" "meyalu"
+ "basque"
+ "breton"
+ "bulgarian"
+ "catalan"
+ "croatian"
+ "czech"
+ "danish"
+ "dutch"
+ "english" "USenglish" "american" "UKenglish" "british" "canadian"
+ "australian" "newzealand"
+ "esperanto"
+ "estonian"
+ "finnish"
+ "french" "francais" "canadien" "acadian"
+ "galician"
+ "austrian" "german" "germanb" "ngerman" "naustrian"
+ "greek" "polutonikogreek"
+ "hebrew"
+ "icelandic"
+ "interlingua"
+ "irish"
+ "italian"
+ "latin"
+ "lowersorbian"
+ "samin"
+ "norsk" "nynorsk"
+ "polish"
+ "portuges" "portuguese" "brazilian" "brazil"
+ "romanian"
+ "russian"
+ "scottish"
+ "spanish"
+ "slovak"
+ "slovene"
+ "swedish"
+ "serbian"
+ "turkish"
+ "ukrainian"
+ "uppersorbian"
+ "welsh"
+ ;; Extra languages mentioned in the `babel' manual.
+ "albanian" "hindi" "thai" "thaicjk" "latvian" "turkmen" "hungarian" "magyar"
+ "mongolian" "romansh" "lithuanian" "spanglish" "vietnamese" "japanese"
+ "pinyin" "arabinc" "farsi" "ibygreek" "bgreek" "serbianic" "frenchle"
+ "ethiop" "friulan")
+ "List of languages supported by the babel LaTeX package.")
+
+(defvar LaTeX-babel-babelprovide-key-val-options
+ `(("import")
+ ("captions")
+ ("hyphenrules" ,(append '("+") LaTeX-babel-language-list))
+ ("main")
+ ("script")
+ ("language")
+ ("mapfont")
+ ("intraspace")
+ ("intrapenalty"))
+ "Key=value options for `\\babelprovide' macro from `babel' package.")
+
+(defun LaTeX-babel-active-languages ()
+ "Return a list of languages used in the document."
+ (let (main-language active-languages)
+ ;; Loop over options provided to class and `babel' package at load time.
+ (dolist (elt (append
+ ;; In most cases there is only one element in the alist, if
+ ;; there is more than one element, the first one should
+ ;; contain the class options of the current buffer. So we can
+ ;; take the car of `LaTeX-provided-class-options'.
+ (cdr (car LaTeX-provided-class-options))
+ (cdr (assoc "babel" LaTeX-provided-package-options))))
+ (setq elt (split-string elt "="))
+ (if (equal (car elt) "main")
+ ;; Starting from version 3.9 of `babel' package, languages can be set
+ ;; with the following syntax:
+ ;; \usepackage[latin.medieval,main=danish,spanish.notilde]{babel}
+ ;; with `danish' being the default language. When the default
+ ;; language is set with the `main' option, we record it and append to
+ ;; the list at the end.
+ (setq main-language (car (cdr elt)))
+ ;; Get rid of the modifiers (`medieval' and `notilde' in the above
+ ;; example).
+ (setq elt (car (split-string (car elt) "\\.")))
+ (if (member elt LaTeX-babel-language-list)
+ ;; Append element to `active-languages' to respect loading order.
+ ;; `babel' package uses as default language the last loaded one,
+ ;; except if it is set with the `main' option.
+ (cl-pushnew elt active-languages :test #'equal))))
+ (if main-language
+ (cl-pushnew main-language active-languages :test #'equal))
+ (nreverse active-languages)))
+
+;; Setup for \babeltags: Note that the macro is \babeltags, we use
+;; the version without `s' in order to reduce the hassle with AUCTeX
+;; auto-generating the plural form:
+(TeX-auto-add-type "babel-babeltag" "LaTeX")
+
+(defvar LaTeX-babel-babeltags-regexp
+ '("\\\\babeltags{\\([^}]+\\)}" 1 LaTeX-auto-babel-babeltag)
+ "Matches the argument of `\\babeltags' from `babel' package.")
+
+(defun LaTeX-babel-cleanup-babeltags ()
+ "Parse defined babel tags and add them to AUCTeX."
+ ;; Check if we parsed something at all
+ (when (LaTeX-babel-babeltag-list)
+ (let (results tag tags cmds)
+ ;; Clean up the parsed results from characters we don't want;
+ ;; also remove possible comment lines
+ (setq results
+ (replace-regexp-in-string
+ "%.*\\'\\|[ \n\r\t]" ""
+ (mapconcat #'car (LaTeX-babel-babeltag-list) ",")))
+ ;; Look if \babeltags was issued once with multiple entries or
+ ;; more than once in the document:
+ (if (string-match-p "," results)
+ (progn
+ (dolist (elt (split-string results "," t))
+ (setq tag (car (split-string elt "=" t)))
+ (push tag tags)
+ (push (list (concat "text" tag) t) cmds)
+ (push (list tag -1) cmds)))
+ ;; One \babeltags with one entry only
+ (setq tag (car (split-string results "=" t)))
+ (push tag tags)
+ (push (list (concat "text" tag) t) cmds)
+ (push (list tag -1) cmds))
+ (mapc #'TeX-add-symbols cmds)
+ (mapc #'LaTeX-add-environments tags)
+ ;; Fontification
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords (mapcar (lambda (x)
+ (list (concat "text" x) "{"))
+ tags)
+ 'textual)
+ (font-latex-add-keywords (mapcar (lambda (x)
+ (list x ""))
+ tags)
+ 'type-declaration)))))
+
+;; Setup for \babelfont:
+(TeX-auto-add-type "babel-babelfont" "LaTeX")
+
+(defvar LaTeX-babel-babelfont-regexp
+ '("\\\\babelfont\\(?:\\[[^]]*\\]\\)?[ \t\n\r%]*{\\([^}]+\\)}"
+ 1 LaTeX-auto-babel-babelfont)
+ "Matches the <font-family> argument of `\\babelfont' from `babel' package.")
+
+(defun LaTeX-babel-cleanup-babelfont ()
+ "Parse defined font-families and add them to AUCTeX."
+ (when (LaTeX-babel-babelfont-list)
+ (dolist (elt (mapcar #'car (LaTeX-babel-babelfont-list)))
+ ;; Don't do anything for standard font-families:
+ (unless (member elt '("rm" "sf" "tt"))
+ ;; Define \<font>family, \<font>default and \text<font>:
+ (let ((fam (concat elt "family"))
+ (def (concat elt "default"))
+ (mac (concat "text" elt)))
+ (apply #'TeX-add-symbols
+ `((,fam -1)
+ (,def -1)
+ (,mac t)))
+ ;; Cater for fontification:
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords `((,fam "")
+ (,def ""))
+ 'type-declaration)
+ (font-latex-add-keywords `((,mac "{"))
+ 'type-command)))))))
+
+(defun LaTeX-babel-auto-prepare ()
+ "Clear `LaTeX-auto-babel-babel*' before parsing."
+ (setq LaTeX-auto-babel-babeltag nil
+ LaTeX-auto-babel-babelfont nil))
+
+(defun LaTeX-babel-auto-cleanup ()
+ "Process parsed elements."
+ (LaTeX-babel-cleanup-babeltags)
+ (LaTeX-babel-cleanup-babelfont))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-babel-auto-prepare t)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-babel-auto-cleanup t)
+(add-hook 'TeX-update-style-hook #'TeX-auto-parse t)
+
+(defun TeX-arg-babel-lang (optional &optional prompt)
+ "Prompt for a language with completion and insert it as an argument."
+ (TeX-argument-insert
+ (completing-read
+ (TeX-argument-prompt optional prompt "Language")
+ (LaTeX-babel-active-languages))
+ optional))
+
+(defun LaTeX-env-babel-lang (env)
+ "Prompt for a language and insert it as an argument of ENV."
+ (LaTeX-insert-environment
+ env (format "{%s}" (completing-read "Language: "
+ (LaTeX-babel-active-languages)))))
+
+(defun LaTeX-babel-load-languages ()
+ "Load style files of babel active languages."
+ ;; Run style hooks for every active language in loading order, so
+ ;; `TeX-quote-language' will be correctly set.
+ (mapc #'TeX-run-style-hooks (LaTeX-babel-active-languages)))
+
+(TeX-add-style-hook
+ "babel"
+ (lambda ()
+ (LaTeX-babel-load-languages)
+ (add-hook 'LaTeX-after-usepackage-hook #'LaTeX-babel-load-languages nil t)
+
+ ;; Add babel to the parser.
+ (TeX-auto-add-regexp LaTeX-babel-babeltags-regexp)
+ (TeX-auto-add-regexp LaTeX-babel-babelfont-regexp)
+
+ ;; New symbols
+ (TeX-add-symbols
+
+ ;; 1.7 Basic language selectors
+ '("selectlanguage" TeX-arg-babel-lang)
+ '("foreignlanguage" TeX-arg-babel-lang t)
+
+ ;; 1.9 More on selection
+ '("babeltags" t)
+ '("babelensure" (TeX-arg-key-val
+ (("include") ("exclude")
+ ("fontenc" (;; 128+ glyph encodings (text)
+ "OT1" "OT2" "OT3" "OT4" "OT6"
+ ;; 256 glyph encodings (text)
+ "T1" "T2A" "T2B" "T2C" "T3" "T4" "T5"
+ ;; 256 glyph encodings (text extended)
+ "X2"
+ ;; Other encodings
+ "LY1" "LV1" "LGR"))))
+ TeX-arg-babel-lang)
+ ;; 1.10 Shorthands
+ '("shorthandon" "Shorthands list")
+ '("shorthandoff" "Shorthands list")
+ '("shorthandoff*" "Shorthands list")
+ '("useshorthands" "Character")
+ '("useshorthands*" "Character")
+ '("defineshorthand"
+ [TeX-arg-eval mapconcat #'identity
+ (TeX-completing-read-multiple
+ (TeX-argument-prompt t nil "Language(s)")
+ (LaTeX-babel-active-languages))
+ ","]
+ t nil)
+ '("languageshorthands" TeX-arg-babel-lang)
+ '("babelshorthand" "Short hand")
+ '("ifbabelshorthand" "Character" t nil)
+ '("aliasshorthand" "Original" "Alias")
+
+ ;; 1.12 The base option
+ '("AfterBabelLanguage"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Language")
+ LaTeX-babel-language-list)
+ t)
+
+ ;; 1.14 Selecting fonts
+ '("babelfont"
+ [TeX-arg-eval mapconcat #'identity
+ (TeX-completing-read-multiple
+ (TeX-argument-prompt t nil "Language(s)")
+ LaTeX-babel-language-list)
+ ","]
+ (TeX-arg-eval let ((fontfam (completing-read
+ (TeX-argument-prompt nil nil "font family")
+ '("rm" "sf" "tt"))))
+ ;; Run `TeX-check-engine-add-engines' and then
+ ;; load `fontspec.el' if not already loaded and
+ ;; make sure the key-vals are up to date.
+ (unless (member "fontspec" (TeX-style-list))
+ (TeX-check-engine-add-engines 'luatex 'xetex)
+ (TeX-run-style-hooks "fontspec")
+ (LaTeX-fontspec-auto-cleanup))
+ (LaTeX-add-babel-babelfonts fontfam)
+ (LaTeX-babel-cleanup-babelfont)
+ (format "%s" fontfam))
+ [TeX-arg-key-val (LaTeX-fontspec-font-features)]
+ LaTeX-fontspec-arg-font)
+
+ ;; 1.16 Creating a language
+ '("babelprovide"
+ [TeX-arg-key-val LaTeX-babel-babelprovide-key-val-options]
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Language")
+ LaTeX-babel-language-list))
+
+ ;; 1.19 Accessing language info
+ '("languagename" 0)
+ '("iflanguage" TeX-arg-babel-lang t nil)
+
+ ;; 1.20 Hyphenation and line breaking
+ '("babelhyphen"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Type/Text")
+ '("soft" "hard" "repeat" "nobreak" "empty")))
+ '("babelhyphen*"
+ (TeX-arg-eval completing-read
+ (TeX-argument-prompt nil nil "Type/Text")
+ '("soft" "hard" "repeat" "nobreak" "empty")))
+
+ '("babelhyphenation"
+ [TeX-arg-eval mapconcat #'identity
+ (TeX-completing-read-multiple
+ (TeX-argument-prompt nil nil "Language(s)")
+ LaTeX-babel-language-list)
+ ","]
+ t)
+
+ ;; 1.23 Selecting scripts
+ '("ensureascii" "Text")
+
+ ;; 1.25 Language attributes
+ '("languageattribute" TeX-arg-babel-lang t))
+
+ ;; Don't increase indentation at various \if* macros:
+ (let ((exceptions '("ifbabelshorthand"
+ "iflanguage")))
+ (dolist (elt exceptions)
+ (add-to-list 'LaTeX-indent-begin-exceptions-list elt t))
+ (LaTeX-indent-commands-regexp-make))
+
+ ;; New environments: 1.8 Auxiliary language selectors
+ (LaTeX-add-environments
+ '("otherlanguage" LaTeX-env-babel-lang)
+ '("otherlanguage*" LaTeX-env-babel-lang)
+ '("hyphenrules" LaTeX-env-babel-lang))
+
+ ;; Fontification
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords '(("selectlanguage" "{")
+ ("foreignlanguage" "{{")
+ ("babeltags" "{")
+ ("babelensure" "{{")
+ ("shorthandon" "{")
+ ("shorthandoff" "*{")
+ ("useshorthands" "*{")
+ ("languageshorthands" "{")
+ ("babelshorthand" "{")
+ ("AfterBabelLanguage" "{")
+ ("babelfont" "[{[{")
+ ("babelprovide" "[{")
+ ("languagename" "")
+ ("iflanguage" "{{{")
+ ("babelhyphen" "*{")
+ ("babelhyphenation" "[{")
+ ("ensureascii" "{"))
+ 'function)
+ (font-latex-add-keywords '(("defineshorthand" "[{{")
+ ("aliasshorthand" "{{")
+ ("languageattribute" "{{"))
+ 'variable)))
+ TeX-dialect)
+
+(defun LaTeX-babel-package-options ()
+ "Prompt for package options for the babel package."
+ (TeX-read-key-val
+ t
+ (append
+ '(("KeepShorthandsActive")
+ ("activeacute")
+ ("activegrave")
+ ("shorthands" ("off"))
+ ("safe" ("none" "ref" "bib"))
+ ("math" ("active" "normal"))
+ ("config")
+ ("main" LaTeX-babel-language-list)
+ ("headfoot" LaTeX-babel-language-list)
+ ("noconfigs")
+ ("nocase")
+ ("silent")
+ ("showlanguages")
+ ("nocase")
+ ("silent")
+ ("strings" ("generic" "unicode" "encoded"
+ "OT1" "OT2" "OT3" "OT4" "OT6"
+ "T1" "T2A" "T2B" "T2C" "T3" "T4" "T5"
+ "X2" "LY1" "LV1" "LGR"))
+ ("hyphenmap" ("off" "first" "select" "other" "other*"))
+ ("bidi" ("default" "basic" "basic-r" "bidi-l" "bidi-r"))
+ ("layout" ("sectioning" "counters" "lists" "contents" "footnotes"
+ "captions" "columns" "graphics" "extras"))
+ ("base"))
+ (mapcar #'list LaTeX-babel-language-list))))
+
+;;; babel.el ends here