diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/fixme/fixme.el')
-rw-r--r-- | Master/texmf-dist/doc/latex/fixme/fixme.el | 780 |
1 files changed, 657 insertions, 123 deletions
diff --git a/Master/texmf-dist/doc/latex/fixme/fixme.el b/Master/texmf-dist/doc/latex/fixme/fixme.el index bcefb63a552..b140e878825 100644 --- a/Master/texmf-dist/doc/latex/fixme/fixme.el +++ b/Master/texmf-dist/doc/latex/fixme/fixme.el @@ -1,6 +1,6 @@ -;;; fixme.el --- AUC-TeX style file for FiXme +;;; fixme.el --- AUCTeX style file for FiXme -;; Copyright (C) 2000, 2002, 2004, 2006, 2009, 2017 Didier Verna +;; Copyright (C) 2000, 2002, 2004, 2006, 2009, 2017, 2019 Didier Verna ;; Author: Didier Verna <didier@didierverna.net> ;; Keywords: tex abbrev data @@ -21,128 +21,662 @@ ;;; Code: + +;; =========================================================================== +;; Utilities +;; =========================================================================== + +(defun LaTeX-fixme-xkeyval-boolean-values (items) + "Create a sorted list of XKeyVal boolean values for ITEMS. +Every item leads to two strings: \"item\" and \"noitem\"." + (sort (mapcan (lambda (item) `(,item ,(concat "no" item))) items) + #'string<)) + +(defun LaTeX-fixme-xkeyval-boolean-option (item) + "Create an XKeyVal boolean option for ITEM. +This creates a list of the form (\"ITEM\" (\"true\" \"false\"))." + `(,item ("true" "false"))) + +(defun LaTeX-fixme-option< (option1 option2) + "Return t if the car of OPTION1 is STRING< to the car of OPTION2. +This function is used as a predicate for sorting XKeyVal option +lists." + (string< (car option1) (car option2))) + +(defun LaTeX-fixme-xkeyval-boolean-options (items) + "Create a sorted list of XKeyVal boolean options for ITEMS. +Every item leads to two lists: (\"item\" (\"true\" \"false\")) +and (\"noitem\" (\"true\" \"false\"))." + (sort (mapcar #'LaTeX-fixme-xkeyval-boolean-option + (LaTeX-fixme-xkeyval-boolean-values items)) + #'LaTeX-fixme-option<)) + +;; The two functions below steal AUCTeX's mechanism for reading key=value +;; lists of options, only without the =value part. This is probably suboptimal +;; because that part could still be entered manually (withtout, completion +;; that is) although it's not supposed to, but it's simpler to do it this way. +(defun LaTeX-fixme-read-key (optional key-list &optional prompt) + "Prompt for keys in KEY-LIST and return them. +If OPTIONAL is non-nil, indicate in the prompt that we are +reading an optional argument. KEY-LIST is a list of strings. +Use PROMPT as the prompt string." + (multi-prompt-key-value + (TeX-argument-prompt optional prompt "Keys") + (if (symbolp key-list) + (eval key-list) + (mapcar #'list key-list)))) + +(defun LaTeX-fixme-arg-key (optional key-list &optional prompt) + "Prompt for keys in KEY-LIST and insert them as a TeX macro argument. +If OPTIONAL is non-nil, insert as an optional argument. KEY-LIST +is a list of strings. Use PROMPT as the prompt string." + (TeX-argument-insert (LaTeX-fixme-read-key optional key-list prompt) + optional)) + +(defun LaTeX-fixme-file-feature (kind) + "Return the KIND of feature name provided by the current file, or nil. +KIND may be one of \"layout\", \"envlout\", \"targetlayout\" or +\"theme\", in order to attempt matching the file name with +\"fxKIND<feature>.sty\"." + (let ((file-name (buffer-file-name))) + (when file-name + (setq file-name (file-name-nondirectory file-name)) + (when (string-match (concat (regexp-quote (concat "fx" kind)) + "\\(.+\\)\\.sty") + file-name) + (match-string 1 file-name))))) + +(defun maybe-upcase-initials (string-or-nil) + "Upcase STRING-OR-NIL initials if it is a string, or return \"\"." + (if string-or-nil (upcase-initials string-or-nil) "")) + + + +;; =========================================================================== +;; Options +;; =========================================================================== + +;; Status processing +;; ----------------- +(defvar LaTeX-fixme-status-options + '(("draft") + ("final") + ("status" ("draft" "final"))) + "FiXme document status options.") + + +;; Layouts +;; ------- +(defvar LaTeX-fixme-builtin-layouts + '("footnote" "index" "inline" "margin" "marginclue") + "FiXme builtin layouts.") + +(defvar LaTeX-fixme-builtin-layout-boolean-values + (LaTeX-fixme-xkeyval-boolean-values LaTeX-fixme-builtin-layouts) + "FiXme built-in layout boolean values.") + +(defvar LaTeX-fixme-builtin-layout-boolean-options + (LaTeX-fixme-xkeyval-boolean-options LaTeX-fixme-builtin-layouts) + "FiXme built-in layout boolean options.") + +(defvar LaTeX-fixme-external-layouts + '("marginnote" + "pdfcmargin" "pdfcnote" "pdfcsigmargin" "pdfcsignote" + "pdfmargin" "pdfnote" "pdfsigmargin" "pdfsignote") + "FiXme external layouts.") + +(defvar LaTeX-fixme-external-layout-boolean-values + (LaTeX-fixme-xkeyval-boolean-values LaTeX-fixme-external-layouts) + "FiXme external layout boolean values.") + +(defvar LaTeX-fixme-external-layout-boolean-options + (LaTeX-fixme-xkeyval-boolean-options LaTeX-fixme-external-layouts) + "FiXme external layout boolean options.") + +(defvar LaTeX-fixme-layouts + (sort (copy-sequence `(,@LaTeX-fixme-builtin-layouts + ,@LaTeX-fixme-external-layouts)) + #'string<) + "FiXme layouts.") + +(defvar LaTeX-fixme-layout-boolean-values + (LaTeX-fixme-xkeyval-boolean-values LaTeX-fixme-layouts) + "FiXme layout boolean values.") + +(defvar LaTeX-fixme-layout-boolean-options + (LaTeX-fixme-xkeyval-boolean-options LaTeX-fixme-layouts) + "FiXme layout boolean options.") + +;; #### FIXME: this is not totally correct. The layout, morelayout and +;; innerlayout options accept either a single value, or a comma-separated list +;; of such. +(defvar LaTeX-fixme-layout-options + (sort (copy-sequence + `(,@LaTeX-fixme-layout-boolean-options + ("layout" ,LaTeX-fixme-layout-boolean-values) + ("morelayout" ,LaTeX-fixme-layout-boolean-values) + ("innerlayout" (,@LaTeX-fixme-layout-boolean-values + ("layout" ,LaTeX-fixme-layout-boolean-values) + ("morelayout",LaTeX-fixme-layout-boolean-values))))) + #'LaTeX-fixme-option<) + "FiXme layout options.") + + +;; Environment layouts +;; ------------------- +(defvar LaTeX-fixme-builtin-env-layouts + '("plain" "signature") + "FiXme builtin environment layouts.") + +(defvar LaTeX-fixme-external-env-layouts + '("color" "colorsig") + "FiXme external environment layouts.") + +(defvar LaTeX-fixme-env-layouts + (sort (copy-sequence `(,@LaTeX-fixme-builtin-env-layouts + ,@LaTeX-fixme-external-env-layouts)) + #'string<) + "FiXme environment layouts.") + +(defvar LaTeX-fixme-envlayout-option + `("envlayout" ,LaTeX-fixme-env-layouts) + "FiXme envlayout option.") + + +;; Target layouts +;; -------------- +(defvar LaTeX-fixme-builtin-target-layouts + '("changebar" "plain") + "FiXme builtin target layouts.") + +(defvar LaTeX-fixme-external-target-layouts + '("color" "colorcb") + "FiXme external target layouts.") + +(defvar LaTeX-fixme-target-layouts + (sort (copy-sequence `(,@LaTeX-fixme-builtin-target-layouts + ,@LaTeX-fixme-external-target-layouts)) + #'string<) + "FiXme target layouts.") + +(defvar LaTeX-fixme-targetlayout-option + `("targetlayout" ,LaTeX-fixme-target-layouts) + "FiXme targetlayout option.") + + +;; Target option +;; ------------- +(defvar LaTeX-fixme-target-option + '("target" ("thepage")) + "FiXme target option.") + + +;; Faces +;; ----- +(defun LaTeX-fixme-face-option (face) + "Return the face option corresponding to FACE. +This is (\"FACEface\")." + `(,(concat face "face"))) + +(defvar LaTeX-fixme-common-faces '("inline" "margin" "signature") + "FiXme common faces.") + +(defvar LaTeX-fixme-common-face-options + (sort (mapcar #'LaTeX-fixme-face-option LaTeX-fixme-common-faces) + #'LaTeX-fixme-option<) + "FiXme common face options.") + +(defvar LaTeX-fixme-env-face "env" + "FiXme environment face.") + +(defvar LaTeX-fixme-env-face-option + (LaTeX-fixme-face-option LaTeX-fixme-env-face) + "FiXme env face option.") + +(defvar LaTeX-fixme-target-face "target" + "FiXme environment face.") + +(defvar LaTeX-fixme-target-face-option + (LaTeX-fixme-face-option LaTeX-fixme-target-face) + "FiXme target face option.") + +(defvar LaTeX-fixme-faces + (sort (copy-sequence `(,@LaTeX-fixme-common-faces + ,LaTeX-fixme-env-face ,LaTeX-fixme-target-face)) + #'string<) + "FiXme faces.") + +(defvar LaTeX-fixme-face-options + (sort (mapcar #'LaTeX-fixme-face-option LaTeX-fixme-faces) + #'LaTeX-fixme-option<) + "FiXme face options.") + + +;; Logging +;; ------- +(defvar LaTeX-fixme-logging-options + (LaTeX-fixme-xkeyval-boolean-options '("silent")) + "FiXme logging options.") + + +;; Languages +;; --------- +(defvar LaTeX-fixme-languages + '("croatian" "danish" "english" "francais" "french" "german" "italian" + "ngerman" "spanish") + "FiXme Languages.") + +;; #### NOTE: langtrack not included +(defvar LaTeX-fixme-language-options + (sort `(,@(mapcar #'list LaTeX-fixme-languages) + ("lang" ,LaTeX-fixme-languages) + ("defaultlang" ,LaTeX-fixme-languages)) + #'LaTeX-fixme-option<) + "FiXme options for language selection.") + +(defvar LaTeX-fixme-langtrack-option + (LaTeX-fixme-xkeyval-boolean-option "langtrack") + "FiXme langtrack option.") + + +;; Authoring +;; --------- +(defvar LaTeX-fixme-author-option + '("author") + "FiXme author option.") + + +(defvar LaTeX-fixme-mode-options + (sort (copy-sequence `(,(LaTeX-fixme-xkeyval-boolean-option "singleuser") + ,(LaTeX-fixme-xkeyval-boolean-option "multiuser") + ("mode" ("multiuser""singleuser")))) + #'LaTeX-fixme-option<) + "FiXme mode options.") + + +;; Themes +;; ------ +(defvar LaTeX-fixme-themes + '("color" "colorsig" "signature") + "FiXme themes.") + +(defvar LaTeX-fixme-theme-option + `("theme" ,LaTeX-fixme-themes) + "FiXme theme option.") + + +;; Macro-dependent +;; --------------- +(defun LaTeX-fixme-annotation-options (&optional targeted) + "Return a specification for the optional argument to FiXme annotations. +Mostly all, except for envlayout, envface, langtrack and theme. +TARGETED is for the starred versions, where additional options +exist (targetlayout and targetface)." + `[ TeX-arg-key-val + ,(sort (copy-sequence `(,@LaTeX-fixme-status-options + ,@LaTeX-fixme-layout-options + ,@LaTeX-fixme-common-face-options + ,LaTeX-fixme-target-option + ,@(when targeted + `(,LaTeX-fixme-targetlayout-option + ,LaTeX-fixme-target-face-option)) + ,@LaTeX-fixme-logging-options + ,@LaTeX-fixme-language-options + ,LaTeX-fixme-author-option + ,@LaTeX-fixme-mode-options)) + #'LaTeX-fixme-option<) ]) + +;; #### WARNING: gross hack. This function makes the targeted annotations look +;; like they're taking a single mandatory argument, whereas they actually take +;; 2. +(defun LaTeX-fixme-targeted-annotation-hack (optional) + "Hook for targeted FiXme annotations. +This function inserts a first couple of braces and a second one, +potentially with the active region's contents within it. The point is left +inside the first couple of braces." + (TeX-argument-insert "" nil) + (TeX-parse-argument optional nil)) + + +;; #### NOTE: an even DWIMer thing to do would be to make the MACRO argument +;; depend on the NAME one, in case the user changed it from the initial input. +(defvar LaTeX-fixme-args-register-layout + `([ (LaTeX-fixme-arg-key ,LaTeX-fixme-layouts "Incompatible layout(s)") ] + (TeX-arg-eval TeX-read-string "Name: " (LaTeX-fixme-file-feature "layout")) + (TeX-arg-eval TeX-read-string "Macro: " + (concat TeX-esc "FXLayout" + (maybe-upcase-initials + (LaTeX-fixme-file-feature "layout"))))) + "FiXme layout registration arguments. +An optional mutual exclusion list, a layout name and the +corresponding macro.") + +;; #### NOTE: OPTIONALP is ignored. +(defun LaTeX-fixme-boolean-option-definition (optionalp) + "Hook for boolean option definitions. +Prompt for, and insert a key between braces. +When TeX-insert-macro is called with a prefix argument, first insert an empty +pair of square brackets for a function definition, and leave point inside." + (cond (current-prefix-arg + (insert "[") + (let ((point (point))) + (insert "]") + (TeX-arg-string nil "Key") + (goto-char point))) + (t + (TeX-arg-string nil "Key")))) + + +;; Environment-dependent +;; --------------------- +;; #### NOTE: this function compensates for the fact that AUCTeX doesn't +;; understand t arguments in environments as it does in macros (the point is +;; always left within the argument's body). The other solution (actually, the +;; previous one) was to prompt for the annotation summary, but I find that +;; less convenient to edit it in the minibuffer, rather than in the file +;; directly. +(defun LaTeX-fixme-insert-environment (environment) + "Insert a FiXme annotation ENVIRONMENT. +Prompt for arguments, and leave point within the first couple of +braces, where the annotation summary needs to go. For targeted +environments, use the active region as the second mandatory +argument." + (let* ((targeted (string-match "\\*" environment)) + (options-list (sort (copy-sequence + (append LaTeX-fixme-status-options + LaTeX-fixme-layout-options + LaTeX-fixme-common-face-options + LaTeX-fixme-logging-options + LaTeX-fixme-language-options + LaTeX-fixme-mode-options + (list LaTeX-fixme-envlayout-option + LaTeX-fixme-env-face-option + LaTeX-fixme-target-option + LaTeX-fixme-author-option) + (when targeted + (list LaTeX-fixme-targetlayout-option + LaTeX-fixme-target-face-option)))) + #'LaTeX-fixme-option<)) + (options (TeX-read-key-val t options-list)) + (target (when (and targeted (TeX-active-mark)) + (prog1 (buffer-substring (point) (mark)) + (delete-region (point) (mark)))))) + (LaTeX-insert-environment + environment + (concat (when (and options (not (string= options ""))) + (format "[%s]" options)) + (concat TeX-grop TeX-grcl) + (when targeted + (concat TeX-grop target TeX-grcl)))) + (when target + (LaTeX-fill-environment nil) + (indent-according-to-mode) + ;; #### NOTE: for some reason, doing this after DELETE-REGION doesn't + ;; work (maybe something related to the insertion of the environment) so + ;; I'm deferring it to here. + (TeX-deactivate-mark)) + (LaTeX-find-matching-begin) + (re-search-forward TeX-grcl) + (when (= (char-after) ?\[) + (forward-list)) + (forward-char))) + + + +;; =========================================================================== +;; Style Hooks +;; =========================================================================== + (TeX-add-style-hook "fixme" - (function - (lambda () - (TeX-add-symbols - '("fxsetup") - - '("fxnote" ["Options"] "Annotation") - '("fxwarning" ["Options"] "Annotation") - '("fxerror" ["Options"] "Annotation") - '("fxfatal" ["Options"] "Annotation") - '("fixme" ["Options"] "Annotation") - - '("fxnote*" ["Options"] "Annotation" t) - '("fxwarning*" ["Options"] "Annotation" t) - '("fxerror*" ["Options"] "Annotation" t) - '("fxfatal*" ["Options"] "Annotation" t) - - '("listoffixmes" 0) - - '("fxuselayouts" t) - '("fxloadlayouts" t) - '("fxuseenvlayout" t) - '("fxloadenvlayouts" t) - '("fxusetargetlayout" t) - '("fxloadtargetlayouts" t) - - '("fxsetface" "Face" "Value") - - '("FXRegisterAuthor" "Command prefix" "Environment prefix" "Tag") - - '("fxusetheme" "Theme") - - '("FXRegisterLayout" "Name" "Macro") - '("FXRegisterLayout*" "Name" "Macro") - '("FXRegisterEnvLayout" "Name" "Opening macro" "Closing macro") - '("FXRegisterTargetLayout" "Name" "Macro") - - '("FXRequireLayout" "Name") - '("FXRequireEnvLayout" "Name") - '("FXRequireTargetLayout" "Name") - - '("FXProvidesLayout" "Name" ["Release information"]) - '("FXProvidesEnvLayout" "Name" ["Release information"]) - '("FXProvidesTargetLayout" "Name" ["Release information"]) - - '("fxenglishnotename" 0) - '("fxenglishnotesname" 0) - '("fxenglishwarningname" 0) - '("fxenglishwarningsname" 0) - '("fxenglisherrorname" 0) - '("fxenglisherrorsname" 0) - '("fxenglishfatalname" 0) - '("fxenglishfatalsname" 0) - '("fxfrenchnotename" 0) - '("fxfrenchnotesname" 0) - '("fxfrenchwarningname" 0) - '("fxfrenchwarningsname" 0) - '("fxfrencherrorname" 0) - '("fxfrencherrorsname" 0) - '("fxfrenchfatalname" 0) - '("fxfrenchfatalsname" 0) - '("fxspanishnotename" 0) - '("fxspanishnotesname" 0) - '("fxspanishwarningname" 0) - '("fxspanishwarningsname" 0) - '("fxspanisherrorname" 0) - '("fxspanisherrorsname" 0) - '("fxspanishfatalname" 0) - '("fxspanishfatalsname" 0) - '("fxitaliannotename" 0) - '("fxitaliannotesname" 0) - '("fxitalianwarningname" 0) - '("fxitalianwarningsname" 0) - '("fxitalianerrorname" 0) - '("fxitalianerrorsname" 0) - '("fxitalianfatalname" 0) - '("fxitalianfatalsname" 0) - '("fxgermannotename" 0) - '("fxgermannotesname" 0) - '("fxgermanwarningname" 0) - '("fxgermanwarningsname" 0) - '("fxgermanerrorname" 0) - '("fxgermanerrorsname" 0) - '("fxgermanfatalname" 0) - '("fxgermanfatalsname" 0) - '("fxdanishnotename" 0) - '("fxdanishnotesname" 0) - '("fxdanishwarningname" 0) - '("fxdanishwarningsname" 0) - '("fxdanisherrorname" 0) - '("fxdanisherrorsname" 0) - '("fxdanishfatalname" 0) - '("fxdanishfatalsname" 0) - '("fxcroatiannotename" 0) - '("fxcroatiannotesname" 0) - '("fxcroatianwarningname" 0) - '("fxcroatianwarningsname" 0) - '("fxcroatianerrorname" 0) - '("fxcroatianerrorsname" 0) - '("fxcroatianfatalname" 0) - '("fxcroatianfatalsname" 0) - - '("englishlistfixmename" 0) - '("frenchlistfixmename" 0) - '("spanishlistfixmename" 0) - '("italianlistfixmename" 0) - '("germanlistfixmename" 0) - '("danishlistfixmename" 0) - '("croatianlistfixmename" 0)) - - (LaTeX-add-environments - '("anfxnote" ["Options"] "Summary") - '("anfxwarning" ["Options"] "Summary") - '("anfxerror" ["Options"] "Summary") - '("anfxfatal" ["Options"] "Summary") - '("afixme" ["Options"] "Summary") - - ;; #### NOTE: I would like to insert a couple of braces here. - '("anfxnote*" ["Options"] "Summary") - '("anfxwarning*" ["Options"] "Summary") - '("anfxerror*" ["Options"] "Summary") - '("anfxfatal*" ["Options"] "Summary"))))) + (lambda () + + (TeX-add-symbols + `("fxsetup" (TeX-arg-key-val ,(sort (copy-sequence + `(,@LaTeX-fixme-status-options + ,@LaTeX-fixme-layout-options + ,@LaTeX-fixme-common-face-options + ,LaTeX-fixme-envlayout-option + ,LaTeX-fixme-env-face-option + ,LaTeX-fixme-targetlayout-option + ,LaTeX-fixme-target-face-option + ,LaTeX-fixme-target-option + ,@LaTeX-fixme-logging-options + ,@LaTeX-fixme-language-options + ,LaTeX-fixme-langtrack-option + ,LaTeX-fixme-author-option + ,@LaTeX-fixme-mode-options + ,LaTeX-fixme-theme-option)) + #'LaTeX-fixme-option<))) + + `("fxnote" ,(LaTeX-fixme-annotation-options) t) + `("fxwarning" ,(LaTeX-fixme-annotation-options) t) + `("fxerror" ,(LaTeX-fixme-annotation-options) t) + `("fxfatal" ,(LaTeX-fixme-annotation-options) t) + ;; #### NOTE: \fixme is obsolete so I don't want to support it here. + + `("fxnote*" ,(LaTeX-fixme-annotation-options t) + LaTeX-fixme-targeted-annotation-hack) + `("fxwarning*" ,(LaTeX-fixme-annotation-options t) + LaTeX-fixme-targeted-annotation-hack) + `("fxerror*" ,(LaTeX-fixme-annotation-options t) + LaTeX-fixme-targeted-annotation-hack) + `("fxfatal*" ,(LaTeX-fixme-annotation-options t) + LaTeX-fixme-targeted-annotation-hack) + + '("listoffixmes" 0) + + `("fxuselayouts" (TeX-arg-key-val ,LaTeX-fixme-layout-boolean-options + "Layout options")) + `("fxloadlayouts" (LaTeX-fixme-arg-key ,LaTeX-fixme-external-layouts + "External layouts")) + + '("fxuseenvlayout" (TeX-arg-eval completing-read "Environment layout: " + LaTeX-fixme-env-layouts)) + `("fxloadenvlayouts" (LaTeX-fixme-arg-key + ,LaTeX-fixme-external-env-layouts + "External environment layout(s)")) + + '("fxusetargetlayout" (TeX-arg-eval completing-read "Target layout: " + LaTeX-fixme-target-layouts)) + `("fxloadtargetlayouts" (LaTeX-fixme-arg-key + ,LaTeX-fixme-external-target-layouts + "External target layout(s)")) + + '("fxsetface" (TeX-arg-eval completing-read "Face: " LaTeX-fixme-faces) t) + + '("FXRegisterAuthor" + ;; #### WARNING: this really is a dirty, dirty trick. We construct a + ;; single argument out of 3, and let AUCTeX enclose the whole thing + ;; with the missing pair of braces... + (TeX-arg-eval + let* ((tag (read-from-minibuffer "Tag: ")) + (cmd (read-from-minibuffer "Command prefix: " (downcase tag))) + (env (read-from-minibuffer "Environment prefix: " + (concat "a" (downcase cmd))))) + (concat cmd TeX-grcl + TeX-grop env TeX-grcl + TeX-grop tag))) + + '("fxusetheme" (TeX-arg-eval completing-read "Theme: " LaTeX-fixme-themes)) + + `("FXRegisterLayout" ,@LaTeX-fixme-args-register-layout) + `("FXRegisterLayout*" ,@LaTeX-fixme-args-register-layout) + '("FXProvidesLayout" + (TeX-arg-eval TeX-read-string "Name: " + (LaTeX-fixme-file-feature "layout")) + [ TeX-arg-version ]) + `("FXRequireLayouts" (LaTeX-fixme-arg-key ,LaTeX-fixme-external-layouts + "External layout(s)")) + + '("FXRegisterEnvLayout" + (TeX-arg-eval TeX-read-string "Name: " + (LaTeX-fixme-file-feature "envlayout")) + (TeX-arg-eval TeX-read-string "Opening macro: " + (concat TeX-esc "FXEnvLayout" + (maybe-upcase-initials + (LaTeX-fixme-file-feature "envlayout")) + "Begin")) + (TeX-arg-eval TeX-read-string "Closing macro: " + (concat TeX-esc "FXEnvLayout" + (maybe-upcase-initials + (maybe-LaTeX-fixme-file-feature "envlayout")) + "End"))) + '("FXProvidesEnvLayout" + (TeX-arg-eval TeX-read-string "Name: " + (LaTeX-fixme-file-feature "envlayout")) + [ TeX-arg-version ]) + '("FXRequireEnvLayout" (TeX-arg-eval completing-read + "External environment layout: " + LaTeX-fixme-external-env-layouts)) + + '("FXRegisterTargetLayout" + (TeX-arg-eval TeX-read-string "Name: " + (LaTeX-fixme-file-feature "targetlayout")) + (TeX-arg-eval TeX-read-string "Macro: " + (concat TeX-esc "FXTargetLayout" + (maybe-upcase-initials + (LaTeX-fixme-file-feature "targetlayout"))))) + '("FXProvidesTargetLayout" + (TeX-arg-eval TeX-read-string "Name: " + (LaTeX-fixme-file-feature "targetlayout")) + [ TeX-arg-version ]) + '("Fxrequiretargetlayout" + (TeX-arg-eval completing-read "External target layout: " + LaTeX-fixme-external-target-layouts)) + + '("FXProvidesTheme" + (TeX-arg-eval TeX-read-string "Name: " + (LaTeX-fixme-file-feature "theme")) + [ TeX-arg-version ])) + + (let ((families '("Layout" "EnvLayout" "TargetLayout"))) + (apply #'TeX-add-symbols + (mapcar (lambda (macro) + (cons macro + '("Key" [ "Default" ] t))) + (mapcar (lambda (family) (concat "FXDefine" family "Key")) + families))) + (apply #'TeX-add-symbols + (mapcar (lambda (macro) + (cons macro + '([ "Macro prefix" ] "Key" [ "Default" ] t))) + (mapcar (lambda (family) + (concat "FXDefine" family "CmdKey")) + families))) + (apply #'TeX-add-symbols + (mapcar (lambda (macro) + (cons macro + '("Key" [ "Bin" ] "Alternatives" [ "Default" ] t))) + (mapcar (lambda (family) + (concat "FXDefine" family "ChoiceKey")) + families))) + (apply #'TeX-add-symbols + (mapcar (lambda (macro) (cons macro '("Key" t))) + (mapcar (lambda (family) + (concat "FXDefine" family "VoidKey")) + families))) + (apply #'TeX-add-symbols + (mapcar (lambda (macro) + (cons macro '(LaTeX-fixme-boolean-option-definition))) + (mapcar (lambda (family) + (concat "FXDefine" family "BoolKey")) + families)))) + + (apply #'TeX-add-symbols + (mapcan (lambda (macro) + (mapcar (lambda (language) + (list (concat "fx" language macro) 0)) + ;; #### NOTE: francais is an alias to french. + (remove "francais" LaTeX-fixme-languages))) + (mapcar (lambda (macro) (concat macro "name")) + '("note" "notes" + "warning" "warnings" + "error" "errors" + "fatal" "fatals")))) + + (apply #'TeX-add-symbols + (mapcar (lambda (language) + (list (concat language "listfixmename") 0)) + ;; #### NOTE: francais is an alias to french. + (remove "francais" LaTeX-fixme-languages))) + + + (LaTeX-add-environments + `("anfxnote" LaTeX-fixme-insert-environment) + `("anfxwarning" LaTeX-fixme-insert-environment) + `("anfxerror" LaTeX-fixme-insert-environment) + `("anfxfatal" LaTeX-fixme-insert-environment) + + `("anfxnote*" LaTeX-fixme-insert-environment) + `("anfxwarning*" LaTeX-fixme-insert-environment) + `("anfxerror*" LaTeX-fixme-insert-environment) + `("anfxfatal*" LaTeX-fixme-insert-environment)) + + + (when (and (featurep 'font-latex) + (eq TeX-install-font-lock 'font-latex-setup)) + (font-latex-add-keywords '(("fxsetup" "{") + + "listoffixmes" + + ("fxuselayouts" "{") + ("fxloadlayouts" "{") + + ("fxuseenvlayout" "{") + ("fxloadenvlayouts" "{") + + ("fxusetargetlayout" "{") + ("fxloadtargetlayouts" "{") + + ("fxsetface" "{{") + + ("FXRegisterAuthor" "{{{") + + ("fxusetheme" "{") + + ("FXRegisterLayout" "*[{{") + ("FXProvidesLayout" "{[") + ("FXRequireLayout" "{") + + ("FXRegisterEnvLayout" "{{{") + ("FXProvidesEnvLayout" "{[") + ("FXRequireEnvLayout" "{") + + ("FXRegisterTargetLayout" "{{") + ("FXProvidesTargetLayout" "{[") + ("FXRequireTargetLayout" "{") + + ("FXDefineLayoutKey" "{[{") + ("FXDefineEnvLayoutKey" "{[{") + ("FXDefineTargetLayoutKey" "{[{") + + ("FXDefineLayoutCmdKey" "[{[{") + ("FXDefineEnvLayoutCmdKey" "[{[{") + ("FXDefineTargetLayoutCmdKey" "[{[{") + + ("FXDefineLayoutChoiceKey" "{[{[{") + ("FXDefineEnvLayoutChoiceKey" "{[{[{") + ("FXDefineTargetLayoutChoiceKey" "{[{[{") + + ("FXDefineLayoutVoidKey" "{{") + ("FXDefineEnvLayoutVoidKey" "{{") + ("FXDefineTargetLayoutVoidKey" "{{") + + ("FXDefineLayoutBoolKey" "[{") + ("FXDefineEnvLayoutBoolKey" "[{") + ("FXDefineTargetLayoutBoolKey" "[{") + + ("FXProvidesTheme" "{[")) + 'function) + ;; The starred version of the 4 macros below takes a second mandatory + ;; argument. We skip this since it would confuse font-latex when used as + ;; the non-starred version + (font-latex-add-keywords '(("fxnote" "*[{") + ("fxwarning" "*[{") + ("fxerror" "*[{") + ("fxfatal" "*[{")) + 'textual))) + LaTeX-dialect) |