>From b46fde1f7374793f2ecc9db2a25a6030c4c9f49f Mon Sep 17 00:00:00 2001
From: Arash Esbati
Date: Sun, 8 Mar 2015 18:09:12 +0100
Subject: [PATCH 1/3] New style for enumitem.sty
* Makefile.in (STYLESRC): Add new style.
* style/enumitem.el: New file.
---
ChangeLog | 6 +
Makefile.in | 3 +-
style/enumitem.el | 442 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 450 insertions(+), 1 deletion(-)
create mode 100644 style/enumitem.el
diff --git a/ChangeLog b/ChangeLog
index 984547e..8256dbf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-08 Arash Esbati
+
+ * Makefile.in (STYLESRC): Add new style.
+
+ * style/enumitem.el: New file.
+
2015-03-07 Mosè Giordano
* doc/install.texi: Mention uninstallation in menus.
diff --git a/Makefile.in b/Makefile.in
index 5e1b261..d435ea4 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -144,7 +144,8 @@ STYLESRC = style/prosper.el \
style/fbb.el style/newtxmath.el style/newtxsf.el \
style/newtxtext.el style/newtxttt.el style/minted.el \
style/wrapfig.el style/relsize.el style/currvita.el \
- style/tcolorbox.el style/color.el style/expl3.el
+ style/tcolorbox.el style/color.el style/expl3.el \
+ style/enumitem.el
STYLEELC = $(STYLESRC:.el=.elc)
ifeq (@preview_enabled@,yes)
diff --git a/style/enumitem.el b/style/enumitem.el
new file mode 100644
index 0000000..760a145
--- /dev/null
+++ b/style/enumitem.el
@@ -0,0 +1,442 @@
+;;; enumitem.el --- AUCTeX style for `enumitem.sty' (v3.5.2)
+
+;; Copyright (C) 2015 Free Software Foundation, Inc.
+
+;; Author: Arash Esbati
+;; Maintainer: address@hidden
+;; 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.5.2) from 2011/09/28.
+;; `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:
+
+;; Needed for compiling `pushnew':
+(eval-when-compile (require 'cl))
+
+;; Needed for auto-parsing.
+(require 'tex)
+
+(defvar LaTeX-enumitem-key-val-options
+ '(;; Vertical Spacing
+ ("topsep")
+ ("partopsep")
+ ("parsep")
+ ("itemsep")
+ ;; Horizontal Spacing
+ ("leftmargin" ("*" "!"))
+ ("itemindent" ("*" "!"))
+ ("labelsep" ("*" "!"))
+ ("labelwidth" ("*" "!"))
+ ("labelindent" ("*" "!"))
+ ("labelsep*")
+ ("labelindent*")
+ ("widest")
+ ("widest*")
+ ("rightmargin")
+ ;; Labels and cross reference format
+ ("label")
+ ("label*")
+ ("ref")
+ ("font")
+ ("format")
+ ("align" ("left" "right" "parleft"))
+ ;; Numbering, stopping, resuming
+ ("start")
+ ("resume")
+ ("resume*")
+ ;; Series
+ ("series")
+ ;; Penalties
+ ("beginpenalty")
+ ("midpenalty")
+ ("endpenalty")
+ ("before")
+ ("before*")
+ ("after")
+ ("after*")
+ ;; Description styles
+ ("style" ("standard" "multiline" "nextline" "sameline" "unboxed"))
+ ;; Compact lists
+ ("noitemsep")
+ ("nosep")
+ ;; Wide lists
+ ("wide")
+ ;; Inline lists
+ ("itemjoin")
+ ("itemjoin*")
+ ("afterlabel")
+ ("mode" ("boxed" "unboxed")))
+ "Key=value options for enumitem macros and environments.")
+
+(defvar LaTeX-enumitem-key-val-options-local nil
+ "Buffer-local key=value options for enumitem macros and environments.")
+(make-variable-buffer-local 'LaTeX-enumitem-key-val-options-local)
+
+;; Variables needed for \newlist: This command is not hooked into
+;; the parser via `TeX-auto-add-type', we mimic that behaviour.
+
+(defvar LaTeX-enumitem-newlist-list nil
+ "List of environments defined by command `\\newlist' from
+`enumitem' package.")
+
+(defvar LaTeX-enumitem-newlist-list-local nil
+ "Local list of all environments definded with `\\newlist'
+plus available through `enumitem' package.")
+(make-variable-buffer-local 'LaTeX-enumitem-newlist-list-local)
+
+(defvar LaTeX-enumitem-newlist-list-item-arg nil
+ "List of description like environments defined by command
+`\\newlist' from `enumitem' package.")
+
+(defvar LaTeX-enumitem-newlist-list-item-arg-local nil
+ "Local list of all description like environments defined by command
+`\\newlist' plus available through `enumitem' package.")
+(make-variable-buffer-local 'LaTeX-enumitem-newlist-list-item-arg-local)
+
+(defvar LaTeX-auto-enumitem-newlist nil
+ "Temporary for parsing the arguments of `\\newlist' from
+`enumitem' package.")
+
+(defvar LaTeX-enumitem-newlist-regexp
+ '("\\\\newlist{\\([^}]+\\)}{\\([^}]+\\)}"
+ (1 2) LaTeX-auto-enumitem-newlist)
+ "Matches the arguments of `\\newlist' 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.
+(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-enumitem-newlist-list nil
+ LaTeX-enumitem-newlist-list-item-arg 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{}{}{}
+ ;; env=, type=, ignored=
+ (dolist (env-type LaTeX-auto-enumitem-newlist)
+ (let* ((env (car env-type))
+ (type (cadr env-type)))
+ (add-to-list 'LaTeX-auto-environment
+ (list env 'LaTeX-enumitem-env-with-opts))
+ (add-to-list 'LaTeX-enumitem-newlist-list
+ (list env))
+ (when (or (string-equal type "description")
+ (string-equal type "description*"))
+ (add-to-list 'LaTeX-enumitem-newlist-list-item-arg
+ (list env))))))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-enumitem-auto-prepare t)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-enumitem-auto-cleanup t)
+
+(defun LaTeX-enumitem-env-with-opts (env)
+ "Update available key-val options, then insert ENV and optional
+key-val and the first item."
+ (LaTeX-enumitem-update-key-val-options)
+ (LaTeX-insert-environment
+ env
+ (let ((opts (TeX-read-key-val t LaTeX-enumitem-key-val-options-local)))
+ (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{...}.
+ (TeX-deactivate-mark)
+ (LaTeX-insert-item)
+ ;; The inserted \item may have outdented the first line to the
+ ;; right. Fill it, if appropriate.
+ (when (and (not (looking-at "$"))
+ (not (assoc environment LaTeX-indent-environment-list))
+ (> (- (line-end-position) (line-beginning-position))
+ (current-fill-column)))
+ (LaTeX-fill-paragraph nil)))
+
+(defun LaTeX-arg-SetEnumitemKey (optional &optional prompt)
+ "Ask for a new key to be defined and add it to
+`LaTeX-enumitem-key-val-options-local'."
+ (LaTeX-enumitem-update-key-val-options)
+ (let ((key (TeX-read-string "New Key: "))
+ (replace (TeX-read-key-val optional
+ LaTeX-enumitem-key-val-options-local "Replacement")))
+ (TeX-argument-insert key optional)
+ (TeX-argument-insert replace optional)
+ (add-to-list 'LaTeX-enumitem-key-val-options-local (list key))
+ (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 use a random number for this purpose
+;; which will then disappear.
+(defun LaTeX-arg-SetEnumitemValue (optional &optional prompt)
+ "Ask for a new value added to an existing key incl. the final
+replacement of the value."
+ (LaTeX-enumitem-update-key-val-options)
+ (let* ((key (TeX-read-key-val optional LaTeX-enumitem-key-val-options-local "Key"))
+ (val (TeX-read-string "String value: "))
+ ;; (key-match (car (assoc key LaTeX-enumitem-key-val-options-local)))
+ (val-match (cdr (assoc key LaTeX-enumitem-key-val-options-local)))
+ (temp (copy-alist LaTeX-enumitem-key-val-options-local))
+ (opts (assq-delete-all (car (assoc key temp)) temp)))
+ (if val-match
+ (pushnew (list key (delete-dups (apply 'append (list val) val-match)))
+ opts :test #'equal)
+ (pushnew (list key (list val)) opts :test #'equal))
+ (setq LaTeX-enumitem-key-val-options-local (copy-alist opts))
+ (TeX-argument-insert key optional)
+ (TeX-argument-insert val optional)
+ (LaTeX-add-enumitem-SetEnumitemValues
+ `(,(number-to-string (random)) ,key ,val))))
+
+(defun LaTeX-enumitem-update-key-val-options ()
+ "Update the buffer-local key-val options before offering them
+in `enumitem'-completions."
+ (dolist (key (LaTeX-enumitem-SetEnumitemKey-list))
+ (add-to-list 'LaTeX-enumitem-key-val-options-local key))
+ (dolist (keyvals (LaTeX-enumitem-SetEnumitemValue-list))
+ (let* ((key (nth 1 keyvals))
+ (val (nth 2 keyvals))
+ ;; (key-match (car (assoc key LaTeX-enumitem-key-val-options-local)))
+ (val-match (cdr (assoc key LaTeX-enumitem-key-val-options-local)))
+ (temp (copy-alist LaTeX-enumitem-key-val-options-local))
+ (opts (assq-delete-all (car (assoc key temp)) temp)))
+ (if val-match
+ (pushnew (list key (delete-dups (apply 'append (list val) val-match)))
+ opts :test #'equal)
+ (pushnew (list key (list val)) opts :test #'equal))
+ (setq LaTeX-enumitem-key-val-options-local (copy-alist opts)))))
+
+
+(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)
+
+ ;; Activate the buffer-local version of key-vals.
+ (setq LaTeX-enumitem-key-val-options-local
+ (copy-alist LaTeX-enumitem-key-val-options))
+
+ ;; Set the standard env's to the local list.
+ (setq LaTeX-enumitem-newlist-list-local
+ '(("itemize") ("enumerate") ("description")))
+
+ ;; Add the starred versions to the local list.
+ (when (LaTeX-provided-package-options-member "enumitem" "inline")
+ (setq LaTeX-enumitem-newlist-list-local
+ (append '(("itemize*") ("enumerate*") ("description*"))
+ LaTeX-enumitem-newlist-list-local)))
+
+ ;; Now add the parsed env's to the local list.
+ (setq LaTeX-enumitem-newlist-list-local
+ (append LaTeX-enumitem-newlist-list
+ LaTeX-enumitem-newlist-list-local))
+
+ ;; Move parsed description like env's into a local variable.
+ (setq LaTeX-enumitem-newlist-list-item-arg-local
+ LaTeX-enumitem-newlist-list-item-arg)
+
+ ;; Tell AUCTeX about special items parsed
+ (dolist (env LaTeX-enumitem-newlist-list-item-arg-local)
+ (add-to-list 'LaTeX-item-list `(,(car env) . LaTeX-item-argument)))
+
+ ;; 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)))
+
+ ;; Cloning lists
+ (TeX-add-symbols
+ ;; 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{}{}{}
+ '("newlist"
+ (TeX-arg-eval
+ (lambda ()
+ (let ((name (TeX-read-string "Name: "))
+ (type (completing-read
+ "Type: "
+ '(("itemize") ("enumerate") ("description")
+ ("itemize*") ("enumerate*") ("description*"))))
+ (depth (TeX-read-string "Max-depth: ")))
+ (setq LaTeX-enumitem-newlist-list-local
+ (append `(,(list name)) LaTeX-enumitem-newlist-list-local))
+ (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))
+ (insert (format "{%s}" name)
+ (format "{%s}" type))
+ (format "%s" depth)))))
+
+ ;; \renewlist{}{}{}
+ '("renewlist"
+ (TeX-arg-eval completing-read "Name: "
+ LaTeX-enumitem-newlist-list-local)
+ (TeX-arg-eval completing-read "Type: "
+ '(("itemize") ("enumerate") ("description")
+ ("itemize*") ("enumerate*") ("description*")))
+ "Max-depth")
+
+ ;; \setlist{}{}
+ '("setlist"
+ [TeX-arg-eval mapconcat 'identity
+ (TeX-completing-read-multiple
+ "Environment(s), level(s): "
+ `(,@LaTeX-enumitem-newlist-list-local
+ ("1") ("2") ("3") ("4"))) ","]
+ (TeX-arg-eval
+ (lambda ()
+ (LaTeX-enumitem-update-key-val-options)
+ (let ((opts (TeX-read-key-val nil LaTeX-enumitem-key-val-options-local)))
+ (format "%s" opts)))))
+
+ ;; \setlist*{}{}
+ '("setlist*"
+ [TeX-arg-eval mapconcat 'identity
+ (TeX-completing-read-multiple
+ "Environment, level: "
+ `(,@LaTeX-enumitem-newlist-list-local
+ ("1") ("2") ("3") ("4"))) ","]
+ (TeX-arg-eval
+ (lambda ()
+ (LaTeX-enumitem-update-key-val-options)
+ (let ((opts (TeX-read-key-val nil LaTeX-enumitem-key-val-options-local)))
+ (format "%s" opts))))) )
+
+ ;; 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)
+
+ ;; This command only makes sense for enumerate type environments.
+ ;; Currently, we offer all defined env's -- to be improved
+ ;; sometimes.
+ '("restartlist"
+ (TeX-arg-eval completing-read "List name: "
+ LaTeX-enumitem-newlist-list-local))
+
+ ;; "Key" will be parsed and added to key-val list.
+ '("SetEnumitemKey" LaTeX-arg-SetEnumitemKey)
+
+ ;; "Key" and "Value" are added to our key-val list
+ '("SetEnumitemValue" LaTeX-arg-SetEnumitemValue "Replacement"))
+
+ ;; 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")))
+
+ ;; Fontification
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords '(("newlist" "{{{")
+ ("renewlist" "{{{")
+ ("setlist" "*[{")
+ ("AddEnumerateCounter" "{{{")
+ ("SetEnumitemKey" "{{" )
+ ("SetEnumitemValue" "{{{"))
+ 'function)
+ (font-latex-add-keywords '(("restartlist" "{" )
+ ("setlistdepth" "{" )
+ ("SetEnumerateShortLabel" "{{"))
+ 'variable)))
+ LaTeX-dialect)
+
+(defvar LaTeX-enumitem-package-options
+ '("inline" "ignoredisplayed" "shortlabels" "loadonly")
+ "Package options for the enumitem package.")
+
+;;; enumitem.el ends here
--
2.3.1