summaryrefslogtreecommitdiff
path: root/elpa/auctex-13.1.3/style/enumitem.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/auctex-13.1.3/style/enumitem.el')
-rw-r--r--elpa/auctex-13.1.3/style/enumitem.el525
1 files changed, 525 insertions, 0 deletions
diff --git a/elpa/auctex-13.1.3/style/enumitem.el b/elpa/auctex-13.1.3/style/enumitem.el
new file mode 100644
index 0000000..d8ad056
--- /dev/null
+++ b/elpa/auctex-13.1.3/style/enumitem.el
@@ -0,0 +1,525 @@
+;;; enumitem.el --- AUCTeX style for `enumitem.sty' (v3.9) -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2015--2021 Free Software Foundation, Inc.
+
+;; Author: Arash Esbati <arash@gnu.org>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2014-10-20
+;; 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 `enumitem.sty' (v3.9) from 2019/06/20.
+;; `enumitem.sty' is part of TeXLive.
+
+;; Tassilo Horn's `minted.el' was a major source of inspiration for
+;; this style, many thanks to him (also for patiently answering my
+;; many other questions, incl. the stupid ones.)
+
+;; If things do not work or when in doubt, press `C-c C-n'. Comments
+;; for improvement are welcome.
+
+;;; 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-enumitem-key-val-options
+ `(;; 3.1 Label and cross references format
+ ("label" ("\\alph*" "\\Alph*" "\\arabic*"
+ "\\roman*" "\\Roman*" "\\value*"))
+ ("label*" ("\\alph*" "\\Alph*" "\\arabic*"
+ "\\roman*" "\\Roman*" "\\value*"))
+ ("ref" ("\\alph*" "\\Alph*" "\\arabic*"
+ "\\roman*" "\\Roman*" "\\value*"))
+ ("font" ,(mapcar (lambda (mac)
+ (concat TeX-esc mac))
+ '(;; family
+ "rmfamily" "sffamily" "ttfamily"
+ ;; series
+ "mdseries" "bfseries"
+ ;; shape
+ "upshape" "itshape" "slshape" "scshape"
+ ;; size
+ "tiny" "scriptsize" "footnotesize"
+ "small" "normalsize" "large"
+ "Large" "LARGE" "huge" "Huge"
+ ;; reset macro
+ "normalfont")))
+ ("format" ,(mapcar (lambda (mac)
+ (concat TeX-esc mac))
+ '(;; family
+ "rmfamily" "sffamily" "ttfamily"
+ ;; series
+ "mdseries" "bfseries"
+ ;; shape
+ "upshape" "itshape" "slshape" "scshape"
+ ;; size
+ "tiny" "scriptsize" "footnotesize"
+ "small" "normalsize" "large"
+ "Large" "LARGE" "huge" "Huge"
+ ;; reset macro
+ "normalfont")))
+ ("align" ("left" "right" "parleft"))
+ ;; 3.2 Horizontal spacing of labels
+ ("labelindent" ("*" "!"))
+ ("left")
+ ("leftmargin" ("*" "!"))
+ ("itemindent" ("*" "!"))
+ ("labelsep" ("*" "!"))
+ ("labelwidth" ("*" "!"))
+ ("widest")
+ ("widest*")
+ ("labelsep*")
+ ("labelindent*")
+ ("rightmargin")
+ ;; Vertical Spacing
+ ("topsep")
+ ("partopsep")
+ ("parsep")
+ ("itemsep")
+ ;; 3.3 Numbering, stopping, and resuming
+ ("start")
+ ("resume")
+ ("resume*")
+ ;; 3.4 Series
+ ("series")
+ ;; 3.5 Penalties
+ ("beginpenalty")
+ ("midpenalty")
+ ("endpenalty")
+ ;; 3.6 Injecting code
+ ("before")
+ ("before*")
+ ("after")
+ ("after*")
+ ("first")
+ ("first*")
+ ;; 3.7 Description styles
+ ("style" ("standard" "unboxed" "nextline" "sameline" "multiline"))
+ ;; 3.8 Compact lists
+ ("noitemsep")
+ ("nosep")
+ ;; 3.9 Wide lists
+ ("wide")
+ ;; 4 Inline lists
+ ("itemjoin")
+ ("itemjoin*")
+ ("afterlabel")
+ ("mode" ("boxed" "unboxed")))
+ "Key=value options for enumitem macros and environments.")
+
+(defun LaTeX-enumitem-key-val-options ()
+ "Return an updated list of key=vals from enumitem package."
+ (append
+ ;; New keys are valueless, so take them as is:
+ (when (LaTeX-enumitem-SetEnumitemKey-list)
+ (LaTeX-enumitem-SetEnumitemKey-list))
+ ;; New values defined available keys: We have to collect predefined
+ ;; values (if any) from `LaTeX-enumitem-key-val-options' (stored in
+ ;; `vals-predefined') and user-defined values (stored in
+ ;; `vals-parsed') which were parsed and added to `result' in the
+ ;; previous run of `dolist' and then combine them as value to a
+ ;; key.
+ (when (LaTeX-enumitem-SetEnumitemValue-list)
+ (let (result)
+ (dolist (keyvals (LaTeX-enumitem-SetEnumitemValue-list) result)
+ (let* ((key (nth 1 keyvals))
+ (val (nth 2 keyvals))
+ (vals-predefined
+ (cadr (assoc key LaTeX-enumitem-key-val-options)))
+ (vals-parsed (cadr (assoc key result))))
+ ;; Remove entry in `result' if there is one for the `key':
+ (when (assoc key result)
+ (setq result (assq-delete-all (car (assoc key result))
+ result)))
+ ;; Add the entry to `result'; also remove any duplicates
+ (cl-pushnew (list key (TeX-delete-duplicate-strings
+ (append vals-parsed
+ vals-predefined
+ (list val))))
+ result :test #'equal)))))
+ ;; New values to `align' key: We collect the predefined ones from
+ ;; `LaTeX-enumitem-key-val-options' in `vals-predefined' and
+ ;; prepend them to newly parsed ones:
+ (when (LaTeX-enumitem-SetLabelAlign-list)
+ (let* ((key "align")
+ (vals (mapcar #'car (LaTeX-enumitem-SetLabelAlign-list)))
+ (vals-predefined (cadr
+ (assoc key LaTeX-enumitem-key-val-options))))
+ `(("align" ,(TeX-delete-duplicate-strings
+ (append vals-predefined vals))))))
+ ;; Predefined key=vals:
+ LaTeX-enumitem-key-val-options))
+
+;; Setup for \newlist:
+
+(TeX-auto-add-type "enumitem-newlist" "LaTeX")
+
+(defvar LaTeX-enumitem-newlist-regexp
+ '("\\\\newlist{\\([^}]+\\)}{\\([^}]+\\)}"
+ (1 2) LaTeX-auto-enumitem-newlist)
+ "Matches the arguments of `\\newlist' from `enumitem' package.")
+
+;; Setup for \SetLabelAlign:
+
+(TeX-auto-add-type "enumitem-SetLabelAlign" "LaTeX")
+
+(defvar LaTeX-enumitem-SetLabelAlign-regexp
+ '("\\\\SetLabelAlign{\\([^}]+\\)}"
+ 1 LaTeX-auto-enumitem-SetLabelAlign)
+ "Matches the argument of `\\SetLabelAlign' from `enumitem' package.")
+
+;; Setup for \SetEnumitemKey:
+
+(TeX-auto-add-type "enumitem-SetEnumitemKey" "LaTeX")
+
+(defvar LaTeX-enumitem-SetEnumitemKey-regexp
+ '("\\\\SetEnumitemKey{\\([^}]+\\)}"
+ 1 LaTeX-auto-enumitem-SetEnumitemKey)
+ "Matches the arguments of `\\SetEnumitemKey' from `enumitem' package.")
+
+;; Setup for \SetEnumitemValue:
+
+(TeX-auto-add-type "enumitem-SetEnumitemValue" "LaTeX")
+
+;; Upon Tassilo's recommendation, we include also `0' so that we can
+;; use the function `LaTeX-enumitem-SetEnumitemValue-list' while we
+;; make sure that `TeX-auto-list-information' doesn't remove multiple
+;; defined values to a specific key. For this reason, we also ignore
+;; the 3. argument to the `\SetEnumitemValue' macro (i.e., a third
+;; {\\([^}]+\\)} in regex) so that we don't pollute the generated
+;; `docname.el' with unnecessary (La)TeX code.
+(defvar LaTeX-enumitem-SetEnumitemValue-regexp
+ '("\\\\SetEnumitemValue{\\([^}]+\\)}{\\([^}]+\\)}"
+ (0 1 2) LaTeX-auto-enumitem-SetEnumitemValue)
+ "Matches the arguments of `\\SetEnumitemValue' from `enumitem' package.")
+
+;; Plug them into the machinery.
+(defun LaTeX-enumitem-auto-prepare ()
+ "Clear various `LaTeX-enumitem-*' before parsing."
+ (setq LaTeX-auto-enumitem-newlist nil
+ LaTeX-auto-enumitem-SetLabelAlign nil
+ LaTeX-auto-enumitem-SetEnumitemKey nil
+ LaTeX-auto-enumitem-SetEnumitemValue nil))
+
+(defun LaTeX-enumitem-auto-cleanup ()
+ "Move parsing results into right places for further usage."
+ ;; \newlist{<name>}{<type>}{<max-depth>}
+ ;; env=<name>, type=<type>, ignored=<max-depth>
+ (dolist (env-type (LaTeX-enumitem-newlist-list))
+ (let* ((env (car env-type))
+ (type (cadr env-type)))
+ (LaTeX-add-environments (list env 'LaTeX-enumitem-env-with-opts))
+ ;; Tell AUCTeX about parsed description like environments.
+ (when (or (string-equal type "description")
+ (string-equal type "description*"))
+ (add-to-list 'LaTeX-item-list `(,env . LaTeX-item-argument)))
+ ;; Add new env's to `ispell-tex-skip-alist': skip the opt. arg:
+ (TeX-ispell-skip-setcdr `((,env ispell-tex-arg-end 0))))))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-enumitem-auto-prepare t)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-enumitem-auto-cleanup t)
+(add-hook 'TeX-update-style-hook #'TeX-auto-parse t)
+
+(defun LaTeX-enumitem-env-with-opts (env)
+ "Insert ENV provided by `enumitem' package."
+ (LaTeX-insert-environment
+ env
+ (let ((opts (TeX-read-key-val t (LaTeX-enumitem-key-val-options))))
+ (when (and opts (not (string-equal opts "")))
+ (format "[%s]" opts))))
+ (if (TeX-active-mark)
+ (progn
+ (LaTeX-find-matching-begin)
+ (end-of-line 1))
+ (end-of-line 0))
+ (delete-char 1)
+ (when (looking-at (concat "^[ \t]+$\\|"
+ "^[ \t]*" TeX-comment-start-regexp "+[ \t]*$"))
+ (delete-region (point) (line-end-position)))
+ (delete-horizontal-space)
+ ;; Deactivate the mark here in order to prevent `TeX-parse-macro'
+ ;; from swapping point and mark and the \item ending up right after
+ ;; \begin{...}.
+ (deactivate-mark)
+ (LaTeX-insert-item)
+ ;; The inserted \item may have outdented the first line to the
+ ;; right. Fill it, if appropriate.
+ (when (and auto-fill-function
+ (not (looking-at "$"))
+ (not (assoc env LaTeX-indent-environment-list))
+ (> (- (line-end-position) (line-beginning-position))
+ (current-fill-column)))
+ (LaTeX-fill-paragraph nil)))
+
+(defun LaTeX-arg-enumitem-SetLabelAlign (optional)
+ "Ask and insert a new type (value) for the \"align\" key.
+Insert value in brackets if OPTIONAL is non-nil."
+ (let ((val (TeX-read-string "Alignment: ")))
+ (TeX-argument-insert val optional)
+ (LaTeX-add-enumitem-SetLabelAligns val)))
+
+(defun LaTeX-arg-enumitem-SetEnumitemKey (optional)
+ "Ask and insert a new key and its replacement.
+Insert key and value in brackets if OPTIONAL is non-nil."
+ (let ((key (TeX-read-string "New Key: "))
+ (replace (TeX-read-key-val optional
+ (LaTeX-enumitem-key-val-options)
+ "Replacement")))
+ (TeX-argument-insert key optional)
+ (TeX-argument-insert replace optional)
+ (LaTeX-add-enumitem-SetEnumitemKeys key)))
+
+;; In `LaTeX-enumitem-SetEnumitemValue-regexp', we match (0 1 2).
+;; When adding a new `key=val', we need something unique for `0'-match
+;; until the next `C-c C-n'. We mimic that regex-match bei concat'ing
+;; the elements and pass the result to
+;; `LaTeX-add-enumitem-SetEnumitemValues'. It will vanish upon next
+;; invocation of `C-c C-n'.
+(defun LaTeX-arg-enumitem-SetEnumitemValue (optional)
+ "Ask and insert for a new value added to an existing key.
+Insert key and value in brackets if OPTIONAL is non-nil."
+ (let ((key (completing-read "Key: " LaTeX-enumitem-key-val-options))
+ (val (TeX-read-string "String value: ")))
+ (TeX-argument-insert key optional)
+ (TeX-argument-insert val optional)
+ (LaTeX-add-enumitem-SetEnumitemValues
+ (list (concat "\\SetEnumitemValue{" key "}{" val "}")
+ key val))))
+
+(defun LaTeX-arg-enumitem-setlist (_optional)
+ "Insert the arguments of `\\setlist' macro from `enumitem' package.
+This function inserts three arguments. The first optional
+argument is only available when the package option `sizes' is
+provided. OPTIONAL is ignored."
+ ;; First opt. argument:
+ (when (LaTeX-provided-package-options-member "enumitem" "sizes")
+ (let* ((TeX-arg-opening-brace "<")
+ (TeX-arg-closing-brace ">")
+ (sizes '("script" "tiny" "footnote" "small" "normal"
+ "large" "Large" "LARGE" "huge" "Huge"))
+ (size (completing-read
+ (TeX-argument-prompt t nil "Size")
+ (append
+ (mapcar (lambda (x) (concat "-" x)) sizes)
+ (mapcar (lambda (x) (concat x "-")) sizes)
+ sizes))))
+ (TeX-argument-insert size t)))
+ ;; Second opt. argument:
+ (TeX-argument-insert
+ (mapconcat #'identity
+ (TeX-completing-read-multiple
+ (TeX-argument-prompt t nil "Environment(s), level(s)")
+ (append
+ (when (LaTeX-provided-package-options-member
+ "enumitem" "includedisplayed")
+ '("trivlist"))
+ (mapcar #'car (LaTeX-enumitem-newlist-list))
+ '("1" "2" "3" "4")))
+ ",")
+ t)
+ ;; Mandatory argument:
+ (TeX-argument-insert
+ (TeX-read-key-val nil (LaTeX-enumitem-key-val-options))
+ nil))
+
+(TeX-add-style-hook
+ "enumitem"
+ (lambda ()
+
+ ;; Add enumitem to the parser.
+ (TeX-auto-add-regexp LaTeX-enumitem-newlist-regexp)
+ (TeX-auto-add-regexp LaTeX-enumitem-SetEnumitemKey-regexp)
+ (TeX-auto-add-regexp LaTeX-enumitem-SetEnumitemValue-regexp)
+ (TeX-auto-add-regexp LaTeX-enumitem-SetLabelAlign-regexp)
+
+ ;; Add the standard environments:
+ (LaTeX-add-enumitem-newlists '("itemize" "itemize")
+ '("enumerate" "enumerate")
+ '("description" "description"))
+
+ ;; Add the starred versions with the 'inline' package option:
+ (when (LaTeX-provided-package-options-member "enumitem" "inline")
+ (LaTeX-add-enumitem-newlists '("itemize*" "itemize*")
+ '("enumerate*" "enumerate*")
+ '("description*" "description*")))
+
+ ;; Standard env's take key-val as optional argument.
+ (LaTeX-add-environments
+ '("itemize" LaTeX-enumitem-env-with-opts)
+ '("enumerate" LaTeX-enumitem-env-with-opts)
+ '("description" LaTeX-enumitem-env-with-opts))
+
+ ;; Make inline env's available with package option "inline"
+ (when (LaTeX-provided-package-options-member "enumitem" "inline")
+ (LaTeX-add-environments
+ '("itemize*" LaTeX-enumitem-env-with-opts)
+ '("enumerate*" LaTeX-enumitem-env-with-opts)
+ '("description*" LaTeX-enumitem-env-with-opts))
+ (add-to-list 'LaTeX-item-list '("description*" . LaTeX-item-argument)))
+
+ (TeX-add-symbols
+ ;; 6 Size dependent settings
+ '("SetEnumitemSize" 2)
+
+ ;; 7 Cloning the basic lists
+ ;; The easy way would be:
+ ;; '("newlist"
+ ;; "Name" (TeX-arg-eval
+ ;; completing-read "Type: "
+ ;; '(("itemize") ("enumerate") ("description")
+ ;; ("itemize*") ("enumerate*") ("description*")))
+ ;; "Max-depth")
+ ;; But we go the extra mile to improve the user experience and add
+ ;; the arguments directly to appropriate lists.
+ ;; \newlist{<name>}{<type>}{<max-depth>}
+ '("newlist"
+ (TeX-arg-eval
+ (lambda ()
+ (let ((name (TeX-read-string "Name: "))
+ (type (completing-read
+ "Type: "
+ (mapcar #'cadr (LaTeX-enumitem-newlist-list))))
+ (depth (TeX-read-string "Max-depth: ")))
+ (when (or (string-equal type "description")
+ (string-equal type "description*"))
+ (add-to-list 'LaTeX-item-list `(,name . LaTeX-item-argument)))
+ (LaTeX-add-environments `(,name LaTeX-enumitem-env-with-opts))
+ (LaTeX-add-enumitem-newlists (list name type))
+ (TeX-ispell-skip-setcdr `((,name ispell-tex-arg-end 0)))
+ (TeX-argument-insert name nil)
+ (TeX-argument-insert type nil)
+ (format "%s" depth)))))
+
+ ;; \renewlist{<name>}{<type>}{<max-depth>}
+ '("renewlist"
+ (TeX-arg-eval completing-read "Name: "
+ (mapcar #'car (LaTeX-enumitem-newlist-list)))
+ (TeX-arg-eval completing-read "Type: "
+ (mapcar #'cadr (LaTeX-enumitem-newlist-list)))
+ "Max-depth")
+
+ ;; \setlist<size>[<names,levels>]{<key-vals>}
+ '("setlist" LaTeX-arg-enumitem-setlist)
+
+ ;; \setlist*[<names,levels>]{<key-vals>}
+ '("setlist*"
+ [TeX-arg-eval mapconcat #'identity
+ (TeX-completing-read-multiple
+ (TeX-argument-prompt t nil "Environment(s), level(s)")
+ (append
+ (when (LaTeX-provided-package-options-member "enumitem"
+ "includedisplayed")
+ '("trivlist"))
+ (mapcar #'car (LaTeX-enumitem-newlist-list))
+ '("1" "2" "3" "4")))
+ ","]
+ (TeX-arg-key-val (LaTeX-enumitem-key-val-options))) )
+
+ ;; General commands:
+ (TeX-add-symbols
+
+ ;; Ask for an Integer and insert it.
+ '("setlistdepth" "Integer")
+
+ ;; Just add the braces and let the user do the rest.
+ '("AddEnumerateCounter" 3)
+ '("AddEnumerateCounter*" 3)
+
+ ;; "\restartlist" only works for lists defined with "resume" key.
+ ;; We will not extract that information and leave that to users.
+ ;; For completion, extract enumerated environments from
+ ;; `LaTeX-enumitem-newlist-list' and add "enumerate" to them.
+ '("restartlist"
+ (TeX-arg-eval
+ (lambda ()
+ (let ((enums '("enumerate")))
+ (when (LaTeX-provided-package-options-member "enumitem" "inline")
+ (cl-pushnew "enumerate*" enums :test #'equal))
+ (dolist (env-type (LaTeX-enumitem-newlist-list))
+ (let ((env (car env-type))
+ (type (cadr env-type)))
+ (when (or (string-equal type "enumerate")
+ (string-equal type "enumerate*"))
+ (cl-pushnew env enums :test #'equal))))
+ (completing-read "List name: " enums)))))
+
+ ;; "Align" is added as new value to "align" key in key-val list.
+ '("SetLabelAlign" LaTeX-arg-enumitem-SetLabelAlign t)
+
+ ;; "Key" will be parsed and added to key-val list.
+ '("SetEnumitemKey" LaTeX-arg-enumitem-SetEnumitemKey)
+
+ ;; "Key" and "Value" are added to our key-val list.
+ '("SetEnumitemValue" LaTeX-arg-enumitem-SetEnumitemValue "Replacement")
+
+ ;; v3.6 has a macro for visual debugging.
+ '("DrawEnumitemLabel" 0))
+
+ ;; Setting enumerate short label
+ (when (LaTeX-provided-package-options-member "enumitem" "shortlabels")
+ (TeX-add-symbols
+ '("SetEnumerateShortLabel"
+ (TeX-arg-eval completing-read "Key: "
+ '("A" "a" "I" "i" "1"))
+ "Replacement")))
+
+ ;; Add \labelindent to list of known lengths:
+ (LaTeX-add-lengths "labelindent")
+
+ ;; Fontification
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords '(("newlist" "{{{")
+ ("renewlist" "{{{")
+ ("SetEnumitemSize" "{{")
+ ("AddEnumerateCounter" "*{{{")
+ ("SetLabelAlign" "{{")
+ ("SetEnumitemKey" "{{" )
+ ("SetEnumitemValue" "{{{"))
+ 'function)
+ ;; Cater for additional optionals arg <size> based on package
+ ;; option 'sizes':
+ (font-latex-add-keywords
+ (if (LaTeX-provided-package-options-member "enumitem" "sizes")
+ '(("setlist" "*<[{"))
+ '(("setlist" "*[{")))
+ 'function)
+
+ (font-latex-add-keywords '(("restartlist" "{" )
+ ("setlistdepth" "{" )
+ ("SetEnumerateShortLabel" "{{"))
+ 'variable)))
+ TeX-dialect)
+
+(defvar LaTeX-enumitem-package-options
+ '("inline" "shortlabels" "loadonly" "sizes"
+ "ignoredisplayed" "includedisplayed")
+ "Package options for the enumitem package.")
+
+;;; enumitem.el ends here