diff options
Diffstat (limited to 'elpa/auctex-13.1.3/style/enumitem.el')
-rw-r--r-- | elpa/auctex-13.1.3/style/enumitem.el | 525 |
1 files changed, 0 insertions, 525 deletions
diff --git a/elpa/auctex-13.1.3/style/enumitem.el b/elpa/auctex-13.1.3/style/enumitem.el deleted file mode 100644 index d8ad056..0000000 --- a/elpa/auctex-13.1.3/style/enumitem.el +++ /dev/null @@ -1,525 +0,0 @@ -;;; 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 |