emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/auctex a375093 20/35: New style enumitem.el


From: Tassilo Horn
Subject: [elpa] externals/auctex a375093 20/35: New style enumitem.el
Date: Sun, 22 Mar 2015 09:27:04 +0000

branch: externals/auctex
commit a375093713f57826e2bc2ca723094f873800e069
Author: Arash Esbati <address@hidden>
Commit: Tassilo Horn <address@hidden>

    New style enumitem.el
    
    * Makefile.in (STYLESRC): Add new style.
    
    * style/enumitem.el: New file.
    
    Signed-off-by: Tassilo Horn <address@hidden>
---
 ChangeLog         |    6 +
 Makefile.in       |    3 +-
 style/enumitem.el |  442 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 450 insertions(+), 1 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 52f31c2..7925bfd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-08  Arash Esbati  <address@hidden>
+
+       * Makefile.in (STYLESRC): Add new style.
+
+       * style/enumitem.el: New file.
+
 2015-03-08  Tassilo Horn  <address@hidden>
 
        * tex.el (TeX-style-path): Replace add-to-list on local with
diff --git a/Makefile.in b/Makefile.in
index aa2d40d..6873e01 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -145,7 +145,8 @@ STYLESRC = style/prosper.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/bidibeamer.el
+          style/bidibeamer.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 <esbati'at'gmx.de>
+;; 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{<name>}{<type>}{<max-depth>}
+  ;; env=<name>, type=<type>, ignored=<max-depth>
+  (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{<name>}{<type>}{<max-depth>}
+    '("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{<name>}{<type>}{<max-depth>}
+    '("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{<names,levels>}{<key-vals>}
+    '("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*{<names,levels>}{<key-vals>}
+    '("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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]