diff options
author | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
---|---|---|
committer | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
commit | bd18a38c2898548a3664a9ddab9f79c84f2caf4a (patch) | |
tree | 95b9933376770381bd8859782ae763be81c2d72b /elpa/auctex-13.1.3/latex.el | |
parent | b07628dddf418d4f47b858e6c35fd3520fbaeed2 (diff) | |
parent | ef160dea332af4b4fe5e2717b962936c67e5fe9e (diff) |
Merge conflict
Diffstat (limited to 'elpa/auctex-13.1.3/latex.el')
-rw-r--r-- | elpa/auctex-13.1.3/latex.el | 8146 |
1 files changed, 0 insertions, 8146 deletions
diff --git a/elpa/auctex-13.1.3/latex.el b/elpa/auctex-13.1.3/latex.el deleted file mode 100644 index 5747449..0000000 --- a/elpa/auctex-13.1.3/latex.el +++ /dev/null @@ -1,8146 +0,0 @@ -;;; latex.el --- Support for LaTeX documents. -*- lexical-binding: t; -*- - -;; Copyright (C) 1991, 1993-2022 Free Software Foundation, Inc. - -;; Maintainer: auctex-devel@gnu.org -;; 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 provides AUCTeX support for LaTeX. - -;;; Code: - -(require 'tex) -(require 'tex-style) -(require 'tex-ispell) -(when (<= 26 emacs-major-version) - ;; latex-flymake requires Emacs 26. - (require 'latex-flymake)) -(eval-when-compile - (require 'cl-lib)) - -;; Silence the compiler for functions: -(declare-function outline-level "ext:outline" - nil) -(declare-function outline-mark-subtree "ext:outline" - nil) -(declare-function turn-off-filladapt-mode "ext:filladapt" - nil) - -;; This function is reported to be unknown when built -;; `with-native-compilation': -(declare-function LaTeX-flymake "latex-flymake" - (report-fn &rest _args)) - -;; Silence the compiler for variables: -(defvar outline-heading-alist) -(defvar TeX-auto-file) -(defvar LaTeX-section-list-changed) - -;;; Syntax - -(defvar LaTeX-optop "[" - "The LaTeX optional argument opening character.") - -(defvar LaTeX-optcl "]" - "The LaTeX optional argument closeing character.") - -;;; Style - -(defcustom LaTeX-default-style "article" - "Default when creating new documents." - :group 'LaTeX-environment - :type 'string) - -(defcustom LaTeX-default-options nil - "Default options to documentclass. -A comma-seperated list of strings." - :group 'LaTeX-environment - :type '(repeat (string :format "%v"))) - -(make-variable-buffer-local 'LaTeX-default-options) - -(defcustom LaTeX-insert-into-comments t - "Whether insertion commands stay in comments. -This allows using the insertion commands even when -the lines are outcommented, like in dtx files." - :group 'LaTeX-environment - :type 'boolean) - -(defun LaTeX-newline () - "Start a new line potentially staying within comments. -This depends on `LaTeX-insert-into-comments'." - (interactive) - (if LaTeX-insert-into-comments - (cond ((and (save-excursion (skip-chars-backward " \t") (bolp)) - (save-excursion - (skip-chars-forward " \t") - (looking-at (concat TeX-comment-start-regexp "+")))) - (beginning-of-line) - (insert (buffer-substring-no-properties - (line-beginning-position) (match-end 0))) - (newline)) - ((and (not (bolp)) - (save-excursion - (skip-chars-forward " \t") (not (TeX-escaped-p))) - (looking-at - (concat "[ \t]*" TeX-comment-start-regexp "+[ \t]*"))) - (delete-region (match-beginning 0) (match-end 0)) - (indent-new-comment-line)) - ;; `indent-new-comment-line' does nothing when - ;; `comment-auto-fill-only-comments' is non-nil, so we - ;; must be sure to be in a comment before calling it. In - ;; any other case `newline' is used. - ((TeX-in-comment) - (indent-new-comment-line)) - (t - (newline))) - (newline))) - - -;;; Syntax Table - -(defvar LaTeX-mode-syntax-table (copy-syntax-table TeX-mode-syntax-table) - "Syntax table used in LaTeX mode.") - -(progn ; set [] to match for LaTeX. - (modify-syntax-entry (string-to-char LaTeX-optop) - (concat "(" LaTeX-optcl) - LaTeX-mode-syntax-table) - (modify-syntax-entry (string-to-char LaTeX-optcl) - (concat ")" LaTeX-optop) - LaTeX-mode-syntax-table)) - -;;; Sections - -;; Declare dynamically scoped vars. -(defvar LaTeX-title nil "Dynamically bound by `LaTeX-section'.") -(defvar LaTeX-name nil "Dynamically bound by `LaTeX-section'.") -(defvar LaTeX-level nil "Dynamically bound by `LaTeX-section'.") -(defvar LaTeX-done-mark nil "Dynamically bound by `LaTeX-section'.") -(defvar LaTeX-toc nil "Dynamically bound by `LaTeX-section'.") - -(defun LaTeX-section (arg) - "Insert a template for a LaTeX section. -Determine the type of section to be inserted, by the argument ARG. - -If ARG is nil or missing, use the current level. -If ARG is a list (selected by \\[universal-argument]), go downward one level. -If ARG is negative, go up that many levels. -If ARG is positive or zero, use absolute level: - - 0 : part - 1 : chapter - 2 : section - 3 : subsection - 4 : subsubsection - 5 : paragraph - 6 : subparagraph - -The following variables can be set to customize: - -`LaTeX-section-hook' Hooks to run when inserting a section. -`LaTeX-section-label' Prefix to all section labels." - - (interactive "*P") - (let* ((val (prefix-numeric-value arg)) - (LaTeX-level (cond ((null arg) - (LaTeX-current-section)) - ((listp arg) - (LaTeX-down-section)) - ((< val 0) - (LaTeX-up-section (- val))) - (t val))) - (LaTeX-name (LaTeX-section-name LaTeX-level)) - (LaTeX-toc nil) - (LaTeX-title (if (TeX-active-mark) - (buffer-substring (region-beginning) - (region-end)) - "")) - (LaTeX-done-mark (make-marker))) - (run-hooks 'LaTeX-section-hook) - (LaTeX-newline) - (if (marker-position LaTeX-done-mark) - (goto-char (marker-position LaTeX-done-mark))) - (set-marker LaTeX-done-mark nil))) - -(defun LaTeX-current-section () - "Return the level of the section that contain point. -See also `LaTeX-section' for description of levels." - (save-excursion - (max (LaTeX-largest-level) - (if (re-search-backward (LaTeX-outline-regexp) nil t) - (- (LaTeX-outline-level) (LaTeX-outline-offset)) - (LaTeX-largest-level))))) - -(defun LaTeX-down-section () - "Return the value of a section one level under the current. -Tries to find what kind of section that have been used earlier in the -text, if this fail, it will just return one less than the current -section." - (save-excursion - (let ((current (LaTeX-current-section)) - (next nil) - (regexp (LaTeX-outline-regexp))) - (if (not (re-search-backward regexp nil t)) - (1+ current) - (while (not next) - (cond - ((eq (LaTeX-current-section) current) - (if (re-search-forward regexp nil t) - (if (<= (setq next (LaTeX-current-section)) current) ;Wow! - (setq next (1+ current))) - (setq next (1+ current)))) - ((not (re-search-backward regexp nil t)) - (setq next (1+ current))))) - next)))) - -(defun LaTeX-up-section (arg) - "Return the value of the section ARG levels above this one." - (save-excursion - (if (zerop arg) - (LaTeX-current-section) - (let ((current (LaTeX-current-section))) - (while (and (>= (LaTeX-current-section) current) - (re-search-backward (LaTeX-outline-regexp) - nil t))) - (LaTeX-up-section (1- arg)))))) - -(defvar LaTeX-section-list '(("part" 0) - ("chapter" 1) - ("section" 2) - ("subsection" 3) - ("subsubsection" 4) - ("paragraph" 5) - ("subparagraph" 6)) - "List which elements is the names of the sections used by LaTeX.") - -(defvar LaTeX-section-menu nil) -(make-variable-buffer-local 'LaTeX-section-menu) - -(defun LaTeX-section-list-add-locally (sections &optional clean) - "Add SECTIONS to `LaTeX-section-list'. -SECTIONS can be a single list containing the section macro name -as a string and the level as an integer or a list of such lists. - -If optional argument CLEAN is non-nil, remove any existing -entries from `LaTeX-section-list' before adding the new ones. - -The function will make `LaTeX-section-list' buffer-local and -invalidate the section submenu in order to let the menu filter -regenerate it. It is mainly a convenience function which can be -used in style files." - (when (stringp (car sections)) - (setq sections (list sections))) - (make-local-variable 'LaTeX-section-list) - (when clean (setq LaTeX-section-list nil)) - (dolist (elt sections) (add-to-list 'LaTeX-section-list elt t)) - (setq LaTeX-section-list - (sort (copy-sequence LaTeX-section-list) - (lambda (a b) (< (nth 1 a) (nth 1 b))))) - (setq LaTeX-section-menu nil)) - -(defun LaTeX-section-name (level) - "Return the name of the section corresponding to LEVEL." - (let ((entry (TeX-member level LaTeX-section-list - (lambda (a b) (equal a (nth 1 b)))))) - (if entry - (nth 0 entry) - nil))) - -(defun LaTeX-section-level (name) - "Return the level of the section NAME." - (let ((entry (TeX-member name LaTeX-section-list - (lambda (a b) (equal a (nth 0 b)))))) - - (if entry - (nth 1 entry) - nil))) - -(defcustom TeX-outline-extra nil - "List of extra TeX outline levels. - -Each element is a list with two entries. The first entry is the -regular expression matching a header, and the second is the level of -the header. See `LaTeX-section-list' for existing header levels." - :group 'LaTeX - :type '(repeat (group (regexp :tag "Match") - (integer :tag "Level")))) - -(defun LaTeX-outline-regexp (&optional anywhere) - "Return regexp for LaTeX sections. - -If optional argument ANYWHERE is not nil, do not require that the -header is at the start of a line." - (concat (if anywhere "" "^") - "[ \t]*" - (regexp-quote TeX-esc) - "\\(appendix\\|documentstyle\\|documentclass\\|" - (mapconcat #'car LaTeX-section-list "\\|") - "\\)\\b" - (if TeX-outline-extra - "\\|" - "") - (mapconcat #'car TeX-outline-extra "\\|") - "\\|" TeX-header-end - "\\|" TeX-trailer-start)) - -(defvar LaTeX-largest-level nil - "Largest sectioning level with current document class.") - -(make-variable-buffer-local 'LaTeX-largest-level) - -(defun LaTeX-largest-level () - "Return largest sectioning level with current document class. -Run style hooks before it has not been done." - (TeX-update-style) - LaTeX-largest-level) - -(defun LaTeX-largest-level-set (section) - "Set `LaTeX-largest-level' to the level of SECTION. -SECTION has to be a string contained in `LaTeX-section-list'. -Additionally the function will invalidate the section submenu in -order to let the menu filter regenerate it." - (setq LaTeX-largest-level (LaTeX-section-level section)) - (let ((offset (LaTeX-outline-offset))) - (when (> offset 0) - (let (lst) - (dolist (tup outline-heading-alist) - (setq lst (cons (cons (car tup) - (+ offset (cdr tup))) - lst))) - (setq outline-heading-alist (nreverse lst))))) - (setq LaTeX-section-menu nil)) - -(defun LaTeX-outline-offset () - "Offset to add to `LaTeX-section-list' levels to get outline level." - (- 2 (LaTeX-largest-level))) - -(defun TeX-look-at (list) - "Check if we are looking at the first element of a member of LIST. -If so, return the second element, otherwise return nil." - (while (and list - (not (looking-at (nth 0 (car list))))) - (setq list (cdr list))) - (if list - (nth 1 (car list)) - nil)) - -(defvar LaTeX-header-end - (concat "^[^%\n]*" (regexp-quote TeX-esc) "begin *" - TeX-grop "document" TeX-grcl) - "Default end of header marker for LaTeX documents.") - -(defvar LaTeX-trailer-start - (concat "^[^%\n]*" (regexp-quote TeX-esc) "end *" - TeX-grop "document" TeX-grcl) - "Default start of trailer marker for LaTeX documents.") - -(defun LaTeX-outline-level () - "Find the level of current outline heading in an LaTeX document." - (cond ((looking-at LaTeX-header-end) 1) - ((looking-at LaTeX-trailer-start) 1) - ((TeX-look-at TeX-outline-extra) - (max 1 (+ (TeX-look-at TeX-outline-extra) - (LaTeX-outline-offset)))) - (t - (save-excursion - (skip-chars-forward " \t") - (forward-char 1) - (cond ((looking-at "appendix") 1) - ((looking-at "documentstyle") 1) - ((looking-at "documentclass") 1) - ((TeX-look-at LaTeX-section-list) - (max 1 (+ (TeX-look-at LaTeX-section-list) - (LaTeX-outline-offset)))) - (t (outline-level))))))) - -(defun LaTeX-outline-name () - "Guess a name for the current header line." - (save-excursion - (if (re-search-forward "{\\([^\}]*\\)}" (+ (point) fill-column 10) t) - (match-string 1) - (buffer-substring (point) (min (point-max) (+ 20 (point))))))) - -(add-hook 'TeX-remove-style-hook - (lambda () (setq LaTeX-largest-level nil))) - -(defcustom LaTeX-section-hook - '(LaTeX-section-heading - LaTeX-section-title - ;; LaTeX-section-toc ; Most people won't want this - LaTeX-section-section - LaTeX-section-label) - "List of hooks to run when a new section is inserted. - -The following variables are set before the hooks are run - -LaTeX-level - numeric section level, see the documentation of `LaTeX-section'. -LaTeX-name - name of the sectioning command, derived from `LaTeX-level'. -LaTeX-title - The title of the section, default to an empty string. -LaTeX-toc - Entry for the table of contents list, default nil. -LaTeX-done-mark - Position of point afterwards, default nil (meaning end). - -The following standard hooks exist - - -LaTeX-section-heading: Query the user about the name of the -sectioning command. Modifies `LaTeX-level' and `LaTeX-name'. - -LaTeX-section-title: Query the user about the title of the -section. Modifies `LaTeX-title'. - -LaTeX-section-toc: Query the user for the toc entry. Modifies -`LaTeX-toc'. - -LaTeX-section-section: Insert LaTeX section command according to -`LaTeX-name', `LaTeX-title', and `LaTeX-toc'. If `LaTeX-toc' is -nil, no toc entry is inserted. If `LaTeX-toc' or `LaTeX-title' -are empty strings, `LaTeX-done-mark' will be placed at the point -they should be inserted. - -LaTeX-section-label: Insert a label after the section command. -Controled by the variable `LaTeX-section-label'. - -To get a full featured `LaTeX-section' command, insert - - (setq LaTeX-section-hook - \\='(LaTeX-section-heading - LaTeX-section-title - LaTeX-section-toc - LaTeX-section-section - LaTeX-section-label)) - -in your init file such as .emacs.d/init.el or .emacs." - :group 'LaTeX-macro - :type 'hook - :options '(LaTeX-section-heading - LaTeX-section-title - LaTeX-section-toc - LaTeX-section-section - LaTeX-section-label)) - - -(defcustom LaTeX-section-label - '(("part" . "part:") - ("chapter" . "chap:") - ("section" . "sec:") - ("subsection" . "sec:") - ("subsubsection" . "sec:")) - "Default prefix when asking for a label. - -Some LaTeX packages \(such as `fancyref'\) look at the prefix to generate some -text around cross-references automatically. When using those packages, you -should not change this variable. - -If it is a string, it it used unchanged for all kinds of sections. -If it is nil, no label is inserted. -If it is a list, the list is searched for a member whose car is equal -to the name of the sectioning command being inserted. The cdr is then -used as the prefix. If the name is not found, or if the cdr is nil, -no label is inserted." - :group 'LaTeX-label - :type '(choice (const :tag "none" nil) - (string :format "%v" :tag "Common") - (repeat :menu-tag "Level specific" - :format "\n%v%i" - (cons :format "%v" - (string :tag "Type") - (choice :tag "Prefix" - (const :tag "none" nil) - (string :format "%v")))))) - -;;; Section Hooks. - -(defun LaTeX-section-heading () - "Hook to prompt for LaTeX section name. -Insert this hook into `LaTeX-section-hook' to allow the user to change -the name of the sectioning command inserted with \\[LaTeX-section]." - (let ((string (completing-read - (concat "Level (default " LaTeX-name "): ") - LaTeX-section-list - nil nil nil nil LaTeX-name))) - ;; Update LaTeX-name - (if (not (zerop (length string))) - (setq LaTeX-name string)) - ;; Update level - (setq LaTeX-level (LaTeX-section-level LaTeX-name)))) - -(defun LaTeX-section-title () - "Hook to prompt for LaTeX section title. -Insert this hook into `LaTeX-section-hook' to allow the user to change -the title of the section inserted with \\[LaTeX-section]." - (setq LaTeX-title (TeX-read-string "Title: " LaTeX-title)) - (let ((region (and (TeX-active-mark) - (cons (region-beginning) (region-end))))) - (when region (delete-region (car region) (cdr region))))) - -(defun LaTeX-section-toc () - "Hook to prompt for the LaTeX section entry in the table of contents. -Insert this hook into `LaTeX-section-hook' to allow the user to insert -a different entry for the section in the table of contents." - (setq LaTeX-toc (TeX-read-string "Toc Entry: ")) - (if (zerop (length LaTeX-toc)) - (setq LaTeX-toc nil))) - -(defun LaTeX-section-section () - "Hook to insert LaTeX section command into the file. -Insert this hook into `LaTeX-section-hook' after those hooks that -set the `LaTeX-name', `LaTeX-title', and `LaTeX-toc' variables, -but before those hooks that assume that the section is already -inserted." - ;; insert a new line if the current line and the previous line are - ;; not empty (except for whitespace), with one exception: do not - ;; insert a new line if the previous (or current, sigh) line starts - ;; an environment (i.e., starts with `[optional whitespace]\begin') - (unless (save-excursion - (re-search-backward - (concat "^\\s-*\n\\s-*\\=\\|^\\s-*" (regexp-quote TeX-esc) - "begin") - (line-beginning-position 0) t)) - (LaTeX-newline)) - (insert TeX-esc LaTeX-name) - (cond ((null LaTeX-toc)) - ((zerop (length LaTeX-toc)) - (insert LaTeX-optop) - (set-marker LaTeX-done-mark (point)) - (insert LaTeX-optcl)) - (t - (insert LaTeX-optop LaTeX-toc LaTeX-optcl))) - (insert TeX-grop) - (if (zerop (length LaTeX-title)) - (set-marker LaTeX-done-mark (point))) - (insert LaTeX-title TeX-grcl) - (LaTeX-newline) - ;; If RefTeX is available, tell it that we've just made a new section - (and (fboundp 'reftex-notice-new-section) - (reftex-notice-new-section))) - -(defun LaTeX-section-label () - "Hook to insert a label after the sectioning command. -Insert this hook into `LaTeX-section-hook' to prompt for a label to be -inserted after the sectioning command. - -The behaviour of this hook is controlled by variable `LaTeX-section-label'." - (and (LaTeX-label LaTeX-name 'section) - (LaTeX-newline))) - -;;; Environments - -(defgroup LaTeX-environment nil - "Environments in AUCTeX." - :group 'LaTeX-macro) - -(defcustom LaTeX-default-environment "itemize" - "The default environment when creating new ones with `LaTeX-environment'. -It is overridden by `LaTeX-default-document-environment' when it -is non-nil and the current environment is \"document\"." - :group 'LaTeX-environment - :type 'string) -(make-variable-buffer-local 'LaTeX-default-environment) - -(defvar LaTeX-default-document-environment nil - "The default environment when creating new ones with -`LaTeX-environment' and the current one is \"document\". This -variable overrides `LaTeX-default-environment'.") -(make-variable-buffer-local 'LaTeX-default-document-environment) - -(defvar LaTeX-default-tabular-environment "tabular" - "The default tabular-like environment used when inserting a table env. -Styles such as tabularx may set it according to their needs.") -(make-variable-buffer-local 'LaTeX-default-tabular-environment) - -(defvar LaTeX-environment-history nil) - -;; Variable used to cache the current environment, e.g. for repeated -;; tasks in an environment, like indenting each line in a paragraph to -;; be filled. It must not have a non-nil value in general. That -;; means it is usually let-bound for such operations. -(defvar LaTeX-current-environment nil) - -(defun LaTeX-environment (arg) - "Make LaTeX environment (\\begin{...}-\\end{...} pair). -With optional ARG, modify current environment. - -It may be customized with the following variables: - -`LaTeX-default-environment' Your favorite environment. -`LaTeX-default-style' Your favorite document class. -`LaTeX-default-options' Your favorite document class options. -`LaTeX-float' Where you want figures and tables to float. -`LaTeX-table-label' Your prefix to labels in tables. -`LaTeX-figure-label' Your prefix to labels in figures. -`LaTeX-default-format' Format for array and tabular. -`LaTeX-default-width' Width for minipage and tabular*. -`LaTeX-default-position' Position for array and tabular." - - (interactive "*P") - (let* ((default (cond - ((TeX-near-bobp) "document") - ((and LaTeX-default-document-environment - (string-equal (LaTeX-current-environment) "document")) - LaTeX-default-document-environment) - (t LaTeX-default-environment))) - (environment (completing-read (concat "Environment type (default " - default "): ") - (LaTeX-environment-list-filtered) nil nil - nil 'LaTeX-environment-history default))) - ;; Use `environment' as default for the next time only if it is different - ;; from the current default. - (unless (equal environment default) - (setq LaTeX-default-environment environment)) - - (let ((entry (assoc environment (LaTeX-environment-list)))) - (if (null entry) - (LaTeX-add-environments (list environment))) - - (if arg - (LaTeX-modify-environment environment) - (LaTeX-environment-menu environment))))) - -(defun LaTeX-environment-menu (environment) - "Insert ENVIRONMENT around point or region." - (let ((entry (assoc environment (LaTeX-environment-list)))) - (cond ((not (and entry (nth 1 entry))) - (LaTeX-insert-environment environment)) - ((numberp (nth 1 entry)) - (let ((count (nth 1 entry)) - (args "")) - (while (> count 0) - (setq args (concat args TeX-grop TeX-grcl)) - (setq count (- count 1))) - (LaTeX-insert-environment environment args))) - ((or (stringp (nth 1 entry)) (vectorp (nth 1 entry))) - (let ((prompts (cdr entry)) - (args "")) - (dolist (elt prompts) - (let* ((optional (vectorp elt)) - (elt (if optional (elt elt 0) elt)) - (arg (TeX-read-string (concat (when optional "(Optional) ") - elt ": ")))) - (setq args (concat args - (cond ((and optional (> (length arg) 0)) - (concat LaTeX-optop arg LaTeX-optcl)) - ((not optional) - (concat TeX-grop arg TeX-grcl))))))) - (LaTeX-insert-environment environment args))) - (t - (apply (nth 1 entry) environment (nthcdr 2 entry)))))) - -(defun LaTeX-close-environment (&optional reopen) - "Create an \\end{...} to match the current environment. -With prefix-argument, reopen environment afterwards." - (interactive "*P") - (if (> (point) - (save-excursion - (beginning-of-line) - (when LaTeX-insert-into-comments - (if (looking-at comment-start-skip) - (goto-char (match-end 0)))) - (skip-chars-forward " \t") - (point))) - (LaTeX-newline)) - (let ((environment (LaTeX-current-environment 1)) marker) - (insert "\\end{" environment "}") - (indent-according-to-mode) - (if (or (not (looking-at "[ \t]*$")) - (and (TeX-in-commented-line) - (save-excursion (beginning-of-line 2) - (not (TeX-in-commented-line))))) - (LaTeX-newline) - (unless (= (forward-line 1) 0) - (insert "\n"))) - (indent-according-to-mode) - (when reopen - (save-excursion - (setq marker (point-marker)) - (set-marker-insertion-type marker t) - (LaTeX-environment-menu environment) - (delete-region (point) - (if (save-excursion (goto-char marker) - (bolp)) - (1- marker) - marker)) - (move-marker marker nil))))) - -(define-obsolete-variable-alias 'LaTeX-after-insert-env-hooks 'LaTeX-after-insert-env-hook "11.89") - -(defvar LaTeX-indent-environment-list) ;; Defined further below. - -(defvar LaTeX-after-insert-env-hook nil - "List of functions to be run at the end of `LaTeX-insert-environment'. -Each function is called with three arguments: the name of the -environment just inserted, the buffer position just before -\\begin and the position just before \\end.") - -(defun LaTeX-insert-environment (environment &optional extra) - "Insert LaTeX ENVIRONMENT with optional argument EXTRA." - (let ((active-mark (and (TeX-active-mark) (not (eq (mark) (point))))) - prefix content-start env-start env-end additional-indent) - (when (and active-mark (< (mark) (point))) (exchange-point-and-mark)) - ;; Compute the prefix. - (when (and LaTeX-insert-into-comments (TeX-in-commented-line)) - (save-excursion - (beginning-of-line) - (looking-at - (concat "^\\([ \t]*" TeX-comment-start-regexp "+\\)+[ \t]*")) - (setq prefix (match-string 0)))) - ;; What to do with the line containing point. - ;; - Open a new empty line for later insertion of "\begin{foo}" and - ;; put the point there. - ;; - If there were at first any non-whitespace texts between the - ;; point and EOL, send them into their new own line with possible - ;; comment prefix. - (cond (;; When the entire line consists of whitespaces except - ;; possible prefix... - (save-excursion (beginning-of-line) - (looking-at (concat prefix "[ \t]*$"))) - ;; ...make the line empty and put the point there. - (delete-region (match-beginning 0) (match-end 0))) - (;; When there are only whitespaces except possible prefix - ;; between the point and BOL (including the case the point - ;; is at BOL)... - (TeX-looking-at-backward (if prefix - (concat "^\\(" prefix "\\)?[ \t]*") - "^[ \t]*") - (line-beginning-position)) - ;; ...in this case, we have non-whitespace texts between - ;; the point and EOL, so send the entire line into a new - ;; next line and put the point on the empty line just - ;; created. - (beginning-of-line) - (newline) - (beginning-of-line 0) - ;; Take note that there are texts to be indented later - ;; unless the region is activated. - (unless active-mark - (setq additional-indent t))) - (;; In all other cases... - t - ;; ...insert a new empty line after deleting all - ;; whitespaces around the point, put the point there... - (delete-horizontal-space) - (if (eolp) - (newline) - ;; ...and if there were at first any non-whitespace texts - ;; between (the original position of) the point and EOL, - ;; send them into a new next line with possible comment - ;; prefix. - (newline 2) - (when prefix (insert prefix)) - (beginning-of-line 0) - ;; Take note that there are texts to be indented later - ;; unless the region is activated. - (unless active-mark - (setq additional-indent t))))) - ;; What to do with the line containing mark. - ;; If there is active region... - (when active-mark - ;; - Open a new empty line for later insertion of "\end{foo}" - ;; and put the mark there. - ;; - If there were at first any non-whitespace texts between the - ;; mark and EOL, pass them over the empty line and put them on - ;; their own line with possible comment prefix. - (save-excursion - (goto-char (mark)) - (cond (;; When the entire line consists of whitespaces except - ;; possible prefix... - (save-excursion (beginning-of-line) - (looking-at - (if prefix - (concat "\\(" prefix "\\)?[ \t]*$") - "[ \t]*$"))) - ;; ...make the line empty and put the mark there. - (delete-region (match-beginning 0) (match-end 0))) - (;; When there are only whitespaces except possible prefix - ;; between the mark and BOL (including the case the mark - ;; is at BOL)... - (TeX-looking-at-backward (if prefix - (concat "^\\(" prefix "\\)?[ \t]*") - "^[ \t]*") - (line-beginning-position)) - ;; ...in this case, we have non-whitespace texts - ;; between the mark and EOL, so send the entire line - ;; into a new next line and put the mark on the empty - ;; line just created. - (beginning-of-line) - (set-mark (point)) - (newline) - ;; Take note that there are texts to be indented later. - (setq additional-indent t)) - (;; In all other cases... - t - ;; ...make a new empty line after deleting all - ;; whitespaces around the mark, put the mark there... - (delete-horizontal-space) - (insert-before-markers "\n") - ;; ...and if there were at first any non-whitespace - ;; texts between (the original position of) the mark - ;; and EOL, send them into a new next line with - ;; possible comment prefix. - (unless (eolp) - (newline) - (when prefix (insert prefix)) - ;; Take note that there are texts to be indented - ;; later. - (setq additional-indent t)))))) - ;; Now insert the environment. - (when prefix (insert prefix)) - (setq env-start (point)) - (insert TeX-esc "begin" TeX-grop environment TeX-grcl) - (indent-according-to-mode) - (when extra (insert extra)) - (setq content-start (line-beginning-position 2)) - (unless active-mark - (newline) - (when prefix (insert prefix)) - (newline)) - (when active-mark (goto-char (mark))) - (when prefix (insert prefix)) - (insert TeX-esc "end" TeX-grop environment TeX-grcl) - (end-of-line 0) - (if active-mark - (progn - (or (assoc environment LaTeX-indent-environment-list) - (if auto-fill-function - ;; Fill the region only when `auto-fill-mode' is active. - (LaTeX-fill-region content-start (line-beginning-position 2)) - ;; Else just indent the region. (bug#48518) - (indent-region content-start (line-beginning-position 2)))) - (set-mark content-start)) - (indent-according-to-mode)) - ;; Indent \end{foo}. - (save-excursion (beginning-of-line 2) (indent-according-to-mode) - (when additional-indent - ;; Indent texts sent after the inserted - ;; environment. - (forward-line 1) (indent-according-to-mode))) - (TeX-math-input-method-off) - (setq env-end (save-excursion - (search-forward - (concat TeX-esc "end" TeX-grop - environment TeX-grcl)) - (match-beginning 0))) - (run-hook-with-args 'LaTeX-after-insert-env-hook - environment env-start env-end))) - -(defun LaTeX-environment-name-regexp () - "Return the regexp matching the name of a LaTeX environment. -This matches everything different from a TeX closing brace but -allowing one level of TeX group braces." - (concat "\\([^" (regexp-quote TeX-grcl) (regexp-quote TeX-grop) "]*\\(" - (regexp-quote TeX-grop) "[^" (regexp-quote TeX-grcl) - (regexp-quote TeX-grop) "]*" (regexp-quote TeX-grcl) "\\)*[^" - (regexp-quote TeX-grcl) (regexp-quote TeX-grop) "]*\\)")) - -(defvar LaTeX-after-modify-env-hook nil - "List of functions to be run at the end of `LaTeX-modify-environment'. -Each function is called with four arguments: the new name of the -environment, the former name of the environment, the buffer -position just before \\begin and the position just before -\\end.") - -(defun LaTeX-modify-environment (environment) - "Modify current ENVIRONMENT." - (let ((goto-end (lambda () - (LaTeX-find-matching-end) - (re-search-backward (concat (regexp-quote TeX-esc) - "end" - (regexp-quote TeX-grop) - "\\(" - (LaTeX-environment-name-regexp) - "\\)" - (regexp-quote TeX-grcl)) - (save-excursion (beginning-of-line 1) (point))))) - (goto-begin (lambda () - (LaTeX-find-matching-begin) - (prog1 (point) - (re-search-forward (concat (regexp-quote TeX-esc) - "begin" - (regexp-quote TeX-grop) - "\\(" - (LaTeX-environment-name-regexp) - "\\)" - (regexp-quote TeX-grcl)) - (save-excursion (end-of-line 1) (point))))))) - (save-excursion - (funcall goto-end) - (let ((old-env (match-string 1))) - (replace-match environment t t nil 1) - (beginning-of-line 1) - (funcall goto-begin) - (replace-match environment t t nil 1) - (end-of-line 1) - (run-hook-with-args 'LaTeX-after-modify-env-hook - environment old-env - (save-excursion (funcall goto-begin)) - (progn (funcall goto-end) (point))))))) - -(defvar LaTeX-syntactic-comments) ;; Defined further below. - -(defun LaTeX-current-environment (&optional arg) - "Return the name (a string) of the enclosing LaTeX environment. -With optional ARG>=1, find that outer level. - -If function is called inside a comment and -`LaTeX-syntactic-comments' is enabled, try to find the -environment in commented regions with the same comment prefix. - -The functions `LaTeX-find-matching-begin' and `LaTeX-find-matching-end' -work analogously." - (setq arg (if arg (if (< arg 1) 1 arg) 1)) - (let* ((in-comment (TeX-in-commented-line)) - (comment-prefix (and in-comment (TeX-comment-prefix))) - (case-fold-search nil)) - (save-excursion - (while (and (/= arg 0) - (re-search-backward - "\\\\\\(begin\\|end\\) *{\\([^}]+\\)}" nil t)) - (when (or (and LaTeX-syntactic-comments - (eq in-comment (TeX-in-commented-line)) - (or (not in-comment) - ;; Consider only matching prefixes in the - ;; commented case. - (string= comment-prefix (TeX-comment-prefix)))) - (and (not LaTeX-syntactic-comments) - (not (TeX-in-commented-line))) - ;; macrocode*? in docTeX-mode is special since we - ;; have also regular code lines not starting with a - ;; comment-prefix. Hence, the next check just looks - ;; if we're inside such a group and returns t to - ;; recognize such a situation. - (and (eq major-mode 'doctex-mode) - (member (match-string-no-properties 2) - '("macrocode" "macrocode*")))) - (setq arg (if (string= (match-string 1) "end") (1+ arg) (1- arg))))) - (if (/= arg 0) - "document" - (match-string-no-properties 2))))) - -(defun docTeX-in-macrocode-p () - "Determine if point is inside a macrocode environment." - (let ((case-fold-search nil)) - (save-excursion - (re-search-backward - (concat "^% " (regexp-quote TeX-esc) - "\\(begin\\|end\\)[ \t]*{macrocode\\*?}") nil 'move) - (not (or (bobp) - (= (char-after (match-beginning 1)) ?e)))))) - - -;;; Environment Hooks - -(defvar LaTeX-document-style-hook nil - "List of hooks to run when inserting a document environment. - -To insert a hook here, you must insert it in the appropriate style file.") - -(defun LaTeX-env-document (&optional _ignore) - "Create new LaTeX document. -Also inserts a \\documentclass macro if there's none already and -prompts for the insertion of \\usepackage macros. - -The compatibility argument IGNORE is ignored." - ;; just assume a single valid \\documentclass, i.e., one not in a - ;; commented line - (let ((found nil)) - (save-excursion - (while (and (not found) - (re-search-backward - "\\\\documentclass\\(\\[[^]\n\r]*\\]\\)?\\({[^}]+}\\)" - nil t)) - (and (not (TeX-in-commented-line)) - (setq found t)))) - (when (not found) - (TeX-insert-macro "documentclass") - (LaTeX-newline) - (LaTeX-newline) - ;; Add a newline only if some `\usepackage' has been inserted. - (if (LaTeX-insert-usepackages) - (LaTeX-newline)) - (LaTeX-newline) - (end-of-line 0))) - (LaTeX-insert-environment "document") - (run-hooks 'LaTeX-document-style-hook) - (setq LaTeX-document-style-hook nil)) - -(defcustom LaTeX-float "" - "Default float position for figures and tables. -If nil, act like the empty string is given, but do not prompt. -\(The standard LaTeX classes use [tbp] as float position if the -optional argument is omitted.)" - :group 'LaTeX-environment - :type '(choice (const :tag "Do not prompt" nil) - (const :tag "Empty" "") - (string :format "%v"))) -(make-variable-buffer-local 'LaTeX-float) - -(defcustom LaTeX-top-caption-list nil - "List of float environments with top caption." - :group 'LaTeX-environment - :type '(repeat (string :format "%v"))) - -(defgroup LaTeX-label nil - "Adding labels for LaTeX commands in AUCTeX." - :group 'LaTeX) - -(defcustom LaTeX-label-function #'LaTeX-label--default - "A function inserting a label at point or returning a label string. -Called with two argument NAME and NO-INSERT where NAME is the environment. -The function has to return the label inserted, or nil if no label was -inserted. If the optional argument NO-INSERT is non-nil, then -the function has to return the label as string without any -insertion or nil if no label was read in." - :group 'LaTeX-label - :type 'function) - -(defcustom LaTeX-figure-label "fig:" - "Default prefix to figure labels." - :group 'LaTeX-label - :group 'LaTeX-environment - :type 'string) - -(defcustom LaTeX-table-label "tab:" - "Default prefix to table labels." - :group 'LaTeX-label - :group 'LaTeX-environment - :type 'string) - -(defcustom LaTeX-listing-label "lst:" - "Default prefix to listing labels. -This prefix should apply to all environments which typeset -code listings and take a caption and label." - :group 'LaTeX-label - :group 'LaTeX-environment - :type 'string) - -(defcustom LaTeX-default-format "" - "Default format for array and tabular environments." - :group 'LaTeX-environment - :type 'string) -(make-variable-buffer-local 'LaTeX-default-format) - -(defcustom LaTeX-default-width "1.0\\linewidth" - "Default width for minipage and tabular* environments." - :group 'LaTeX-environment - :type 'string) -(make-variable-buffer-local 'LaTeX-default-width) - -(defcustom LaTeX-default-position "" - "Default position for array and tabular environments. -If nil, act like the empty string is given, but do not prompt." - :group 'LaTeX-environment - :type '(choice (const :tag "Do not prompt" nil) - (const :tag "Empty" "") - string)) -(make-variable-buffer-local 'LaTeX-default-position) - -(defcustom LaTeX-equation-label "eq:" - "Default prefix to equation labels." - :group 'LaTeX-label - :type 'string) - -(defcustom LaTeX-eqnarray-label LaTeX-equation-label - "Default prefix to eqnarray labels." - :group 'LaTeX-label - :type 'string) - -(defun LaTeX-env-item (environment) - "Insert ENVIRONMENT and the first item." - (LaTeX-insert-environment environment) - (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 and `auto-fill-mode' is active. - (when (and auto-fill-function - (not (looking-at "$")) - (not (assoc environment LaTeX-indent-environment-list)) - (> (- (line-end-position) (line-beginning-position)) - (current-fill-column))) - (LaTeX-fill-paragraph nil))) - -(defcustom LaTeX-label-alist - '(("figure" . LaTeX-figure-label) - ("table" . LaTeX-table-label) - ("figure*" . LaTeX-figure-label) - ("table*" . LaTeX-table-label) - ("equation" . LaTeX-equation-label) - ("eqnarray" . LaTeX-eqnarray-label)) - "Lookup prefixes for labels. -An alist where the CAR is the environment name, and the CDR -either the prefix or a symbol referring to one. - -If the name is not found, or if the CDR is nil, no label is -automatically inserted for that environment. - -If you want to automatically insert a label for a environment but -with an empty prefix, use the empty string \"\" as the CDR of the -corresponding entry." - :group 'LaTeX-label - :type '(repeat (cons (string :tag "Environment") - (choice (string :tag "Label prefix") - (symbol :tag "Label prefix symbol"))))) - -(make-variable-buffer-local 'LaTeX-label-alist) - -(defvar TeX-read-label-prefix nil - "Initial input for the label in `TeX-read-label'.") - -(defun LaTeX-label (name &optional type no-insert) - "Insert a label for NAME at point. -The optional TYPE argument can be either environment or section: -in the former case this function looks up `LaTeX-label-alist' to -choose which prefix to use for the label, in the latter case -`LaTeX-section-label' will be looked up instead. If TYPE is nil, -you will be always prompted for a label, with an empty default -prefix. - -If `LaTeX-label-function' is a valid function, LaTeX label will -transfer the job to this function. - -If the optional NO-INSERT is non-nil, only the label is returned -and no insertion happens. Otherwise the inserted label is -returned, nil if it is empty." - (let ((TeX-read-label-prefix - (cond - ((eq type 'environment) - (cdr (assoc name LaTeX-label-alist))) - ((eq type 'section) - (if (assoc name LaTeX-section-list) - (if (stringp LaTeX-section-label) - LaTeX-section-label - (and (listp LaTeX-section-label) - (cdr (assoc name LaTeX-section-label)))) - "")) - ((null type) - "") - (t - nil))) - ) ;; label - (when (symbolp TeX-read-label-prefix) - (setq TeX-read-label-prefix (symbol-value TeX-read-label-prefix))) - (when TeX-read-label-prefix - (funcall (or LaTeX-label-function #'LaTeX-label--default) - name no-insert)))) - -(defun LaTeX-label--default (_name no-insert) - ;; Use completing-read as we do with `C-c C-m \label RET' - (let ((label (TeX-read-label t "What label" t))) - ;; No label or empty string entered? - (if (or (string= TeX-read-label-prefix label) - (string= "" label)) - (setq label nil) - ;; We have a label; when NO-INSERT is nil, insert - ;; \label{label} in the buffer, add new label to list of - ;; known labels and return it - (unless no-insert - (insert TeX-esc "label" TeX-grop label TeX-grcl)) - (LaTeX-add-labels label) - label))) - -(defcustom LaTeX-short-caption-prompt-length 40 - "The length that the caption of a figure should be before -propting for \\caption's optional short-version." - :group 'LaTeX-environment - :type 'integer) - -(defun LaTeX-compose-caption-macro (caption &optional short-caption) - "Return a \\caption macro for a given CAPTION as a string. -If SHORT-CAPTION is non-nil pass it as an optional argument to -\\caption." - (let ((short-caption-string - (if (and short-caption - (not (string= short-caption ""))) - (concat LaTeX-optop short-caption LaTeX-optcl)))) - (concat TeX-esc "caption" short-caption-string - TeX-grop caption TeX-grcl))) - -(defun LaTeX-env-figure (environment) - "Create ENVIRONMENT with \\caption and \\label commands." - (let* ((float (and LaTeX-float ; LaTeX-float can be nil, i.e. - ; do not prompt - (TeX-read-string "(Optional) Float position: " LaTeX-float))) - (caption (TeX-read-string "Caption: ")) - (short-caption (when (>= (length caption) LaTeX-short-caption-prompt-length) - (TeX-read-string "(Optional) Short caption: "))) - (center (y-or-n-p "Center? ")) - (active-mark (and (TeX-active-mark) - (not (eq (mark) (point))))) - start-marker end-marker) - (when active-mark - (if (< (mark) (point)) - (exchange-point-and-mark)) - (setq start-marker (point-marker)) - (set-marker-insertion-type start-marker t) - (setq end-marker (copy-marker (mark)))) - (setq LaTeX-float float) - (LaTeX-insert-environment environment - (unless (zerop (length float)) - (concat LaTeX-optop float - LaTeX-optcl))) - (when active-mark - (goto-char start-marker) - (set-marker start-marker nil)) - (when center - (insert TeX-esc "centering") - (indent-according-to-mode) - (LaTeX-newline) - (indent-according-to-mode)) - ;; Insert caption and ask for a label, do nothing if user skips caption - (unless (zerop (length caption)) - (if (member environment LaTeX-top-caption-list) - ;; top caption - (progn - (insert (LaTeX-compose-caption-macro caption short-caption)) - ;; If `auto-fill-mode' is active, fill the caption. - (if auto-fill-function (LaTeX-fill-paragraph)) - (LaTeX-newline) - (indent-according-to-mode) - ;; ask for a label and insert a new line only if a label is - ;; actually inserted - (when (LaTeX-label environment 'environment) - (LaTeX-newline) - (indent-according-to-mode))) - ;; bottom caption (default) - (when active-mark (goto-char end-marker)) - (save-excursion - (LaTeX-newline) - (indent-according-to-mode) - ;; If there is an active region point is before the backslash of - ;; "\end" macro, go one line upwards. - (when active-mark (forward-line -1) (indent-according-to-mode)) - (insert (LaTeX-compose-caption-macro caption short-caption)) - ;; If `auto-fill-mode' is active, fill the caption. - (if auto-fill-function (LaTeX-fill-paragraph)) - ;; ask for a label and if necessary insert a new line between caption - ;; and label - (when (save-excursion (LaTeX-label environment 'environment)) - (LaTeX-newline) - (indent-according-to-mode))) - ;; Insert an empty line between caption and marked region, if any. - (when active-mark (LaTeX-newline) (forward-line -1)) - (indent-according-to-mode))) - (when (markerp end-marker) - (set-marker end-marker nil)) - (when (and (member environment '("table" "table*")) - ;; Suppose an existing tabular environment should just - ;; be wrapped into a table if there is an active region. - (not active-mark)) - (LaTeX-environment-menu LaTeX-default-tabular-environment)))) - -(defun LaTeX-env-array (environment) - "Insert ENVIRONMENT with position and column specifications. -Just like array and tabular." - (let ((pos (and LaTeX-default-position ; LaTeX-default-position can - ; be nil, i.e. do not prompt - (TeX-read-string "(Optional) Position: " LaTeX-default-position))) - (fmt (TeX-read-string - (if (string= LaTeX-default-format "") - "Format: " - (format "Format (default %s): " LaTeX-default-format)) - nil nil - (if (string= LaTeX-default-format "") - nil - LaTeX-default-format)))) - (setq LaTeX-default-position pos) - (setq LaTeX-default-format fmt) - (LaTeX-insert-environment environment - (concat - (unless (zerop (length pos)) - (concat LaTeX-optop pos LaTeX-optcl)) - (concat TeX-grop fmt TeX-grcl))) - (LaTeX-item-array t))) - -(defun LaTeX-env-label (environment) - "Insert ENVIRONMENT and prompt for label." - (LaTeX-insert-environment environment) - (when (TeX-active-mark) - ;; Point is at the end of the region. Move it back to the - ;; beginning of the region. - (exchange-point-and-mark) - (indent-according-to-mode)) - (when (LaTeX-label environment 'environment) - (LaTeX-newline) - (indent-according-to-mode)) - (when (TeX-active-mark) - (indent-region (point) (mark)) - ;; Restore the positions of point and mark. - (exchange-point-and-mark))) - -(defun LaTeX-env-list (environment) - "Insert ENVIRONMENT and the first item." - (let ((label (TeX-read-string "Default Label: "))) - (LaTeX-insert-environment environment - (format "{%s}{}" label)) - (end-of-line 0) - (delete-char 1) - (delete-horizontal-space)) - (LaTeX-insert-item)) - -(defun LaTeX-env-minipage (environment) - "Create new LaTeX minipage or minipage-like ENVIRONMENT." - (let* ((pos (and LaTeX-default-position ; LaTeX-default-position can - ; be nil, i.e. do not prompt - (completing-read - (TeX-argument-prompt t nil "Position") - '("t" "b" "c")))) - (height (when (and pos (not (string= pos ""))) - (completing-read (TeX-argument-prompt t nil "Height") - ;; A valid length can be a macro - ;; or a length of the form - ;; <value><dimension>. Input - ;; starting with a `\' can be - ;; completed with length macros. - (mapcar (lambda (elt) - (concat TeX-esc (car elt))) - (LaTeX-length-list))))) - (inner-pos (when (and height (not (string= height ""))) - (completing-read - (TeX-argument-prompt t nil "Inner position") - '("t" "b" "c" "s")))) - (width (TeX-read-string - (TeX-argument-prompt nil nil (format "Width (default %s)" - LaTeX-default-width)) - nil nil LaTeX-default-width))) - (setq LaTeX-default-position pos) - (setq LaTeX-default-width width) - (LaTeX-insert-environment environment - (concat - (unless (zerop (length pos)) - (concat LaTeX-optop pos LaTeX-optcl)) - (unless (zerop (length height)) - (concat LaTeX-optop height LaTeX-optcl)) - (unless (zerop (length inner-pos)) - (concat LaTeX-optop inner-pos LaTeX-optcl)) - (concat TeX-grop width TeX-grcl))))) - -(defun LaTeX-env-tabular* (environment) - "Insert ENVIRONMENT with width, position and column specifications." - (let ((width (TeX-read-string - (format "Width (default %s): " LaTeX-default-width) - nil nil LaTeX-default-width)) - (pos (and LaTeX-default-position ; LaTeX-default-position can - ; be nil, i.e. do not prompt - (TeX-read-string "(Optional) Position: " LaTeX-default-position))) - (fmt (TeX-read-string - (if (string= LaTeX-default-format "") - "Format: " - (format "Format (default %s): " LaTeX-default-format)) - nil nil - (if (string= LaTeX-default-format "") - nil - LaTeX-default-format)))) - (setq LaTeX-default-width width) - (setq LaTeX-default-position pos) - (setq LaTeX-default-format fmt) - (LaTeX-insert-environment environment - (concat - (concat TeX-grop width TeX-grcl) ;; not optional! - (unless (zerop (length pos)) - (concat LaTeX-optop pos LaTeX-optcl)) - (concat TeX-grop fmt TeX-grcl))) - (LaTeX-item-tabular* t))) - -(defun LaTeX-env-picture (environment) - "Insert ENVIRONMENT with width, height specifications." - (let ((width (TeX-read-string "Width: ")) - (height (TeX-read-string "Height: ")) - (x-offset (TeX-read-string "X Offset: ")) - (y-offset (TeX-read-string "Y Offset: "))) - (if (zerop (length x-offset)) - (setq x-offset "0")) - (if (zerop (length y-offset)) - (setq y-offset "0")) - (LaTeX-insert-environment environment - (concat - (format "(%s,%s)" width height) - (if (not (and (string= x-offset "0") - (string= y-offset "0"))) - (format "(%s,%s)" x-offset y-offset)))))) - -(defun LaTeX-env-bib (environment) - "Insert ENVIRONMENT with label for bibitem." - (LaTeX-insert-environment environment - (concat TeX-grop - (TeX-read-string - (format "Label for BibItem (default %s): " "99") - nil nil "99") - TeX-grcl)) - (end-of-line 0) - (delete-char 1) - (delete-horizontal-space) - (LaTeX-insert-item)) - -(defun LaTeX-env-contents (environment) - "Insert ENVIRONMENT with optional argument and filename for contents." - (let* ((opt '("overwrite" "force" "nosearch")) - (arg (mapconcat #'identity - (TeX-completing-read-multiple - (TeX-argument-prompt t nil "Options") - (if (string= environment "filecontents*") - opt - (cons "noheader" opt))) - ","))) - (LaTeX-insert-environment environment - (concat - (when (and arg (not (string= arg ""))) - (concat LaTeX-optop arg LaTeX-optcl)) - TeX-grop - (TeX-read-string "File: ") - TeX-grcl))) - (delete-horizontal-space)) - -(defun LaTeX-env-args (environment &rest args) - "Insert ENVIRONMENT and arguments defined by ARGS." - (LaTeX-insert-environment environment) - (save-excursion - (LaTeX-find-matching-begin) - (end-of-line) - (let ((TeX-exit-mark (or TeX-exit-mark - (make-marker)))) - (TeX-parse-arguments args)))) - -(defun LaTeX-env-label-as-keyval (_optional &optional keyword keyvals environment) - "Query for a label and insert it in the optional argument of an environment. -OPTIONAL is ignored. Optional KEYWORD is a string to search for -in the optional argument, label is only included if KEYWORD is -found. KEYVALS is a string with key=val's read in. If nil, this -function searchs for key=val's itself. ENVIRONMENT is a string -with the name of environment, if non-nil, don't bother to find -out." - (let ((env-start (make-marker)) - (body-start (make-marker)) - (opt-start (make-marker)) - (opt-end (make-marker)) - (currenv (or environment (LaTeX-current-environment)))) - ;; Save the starting point as we will come back here - (set-marker body-start (point)) - ;; Go to the start of the current environment and save the position - (LaTeX-find-matching-begin) - (set-marker env-start (point)) - ;; Check if an opt. argument is there; assume that it starts in - ;; the same line and save the points in markers - (when (re-search-forward - (concat "\\\\begin{" currenv "}[ \t]*\\[") body-start t) - (set-marker opt-start (1- (point))) - (goto-char opt-start) - (forward-sexp) - (set-marker opt-end (1- (point)))) - ;; If keyword argument is given and keyvals argument is not given, - ;; parse the optional argument and put it into keyvals - (when (and keyword - (marker-position opt-start) - (not keyvals)) - (setq keyvals (buffer-substring-no-properties - (1+ opt-start) opt-end))) - ;; If keyword is given, only insert a label when keyword is found - ;; inside the keyvals. If keyword is nil, then insert a label - ;; anyways - (if (stringp keyword) - (when (and (stringp keyvals) - (not (string= keyvals "")) - (string-match (concat keyword "[ \t]*=") keyvals)) - (goto-char opt-end) - (let ((opt-label (LaTeX-label currenv 'environment t))) - (when opt-label - (insert (if (equal (preceding-char) ?,) - "label=" - ",label=") - TeX-grop opt-label TeX-grcl)))) - (let ((opt-label (LaTeX-label currenv 'environment t))) - (when opt-label - ;; Check if an opt. argument is found and go to the end if - (if (marker-position opt-end) - (progn - (goto-char opt-end) - (insert (if (equal (preceding-char) ?,) - "label=" - ",label=") - TeX-grop opt-label TeX-grcl)) - ;; Otherwise start at the beginning of environment in - ;; order to not mess with any other mandatory arguments - ;; which can be there - (goto-char env-start) - (re-search-forward (concat "\\\\begin{" currenv "}")) - (insert LaTeX-optop "label=" TeX-grop opt-label TeX-grcl LaTeX-optcl))))) - ;; Go to where we started and clean up the markers - (goto-char body-start) - (set-marker env-start nil) - (set-marker body-start nil) - (set-marker opt-start nil) - (set-marker opt-end nil))) - -;;; Item hooks - -(defvar LaTeX-item-list nil - "A list of environments where items have a special syntax. -The cdr is the name of the function, used to insert this kind of items.") - -(defun LaTeX-insert-item () - "Insert a new item in an environment. -You may use `LaTeX-item-list' to change the routines used to insert the item." - (interactive "*") - (let ((environment (LaTeX-current-environment))) - (when (and (TeX-active-mark) - (> (point) (mark))) - (exchange-point-and-mark)) - (unless (bolp) (LaTeX-newline)) - (if (assoc environment LaTeX-item-list) - (funcall (cdr (assoc environment LaTeX-item-list))) - (TeX-insert-macro "item")) - (indent-according-to-mode))) - -(defvar TeX-arg-item-label-p) ;; Defined further below. - -(defun LaTeX-item-argument () - "Insert a new item with an optional argument." - (let ((TeX-arg-item-label-p t) - (TeX-insert-macro-default-style 'show-optional-args)) - (TeX-insert-macro "item"))) - -(defun LaTeX-item-bib () - "Insert a new bibitem." - (TeX-insert-macro "bibitem")) - -(defvar LaTeX-array-skipping-regexp (regexp-opt '("[t]" "[b]" "")) - "Regexp matching between \\begin{xxx} and column specification. -For array and tabular environments. See `LaTeX-insert-ampersands' for -detail.") - -(defvar LaTeX-tabular*-skipping-regexp - ;; Assume width specification contains neither nested curly brace - ;; pair nor escaped "}". - (concat "{[^}]*}[ \t]*" (regexp-opt '("[t]" "[b]" ""))) - "Regexp matching between \\begin{tabular*} and column specification. -For tabular* environment only. See `LaTeX-insert-ampersands' for detail.") - -(defun LaTeX-item-array (&optional suppress) - "Insert line break macro on the last line and suitable number of &'s. -For array and tabular environments. - -If SUPPRESS is non-nil, do not insert line break macro." - (unless suppress - (save-excursion - (end-of-line 0) - (just-one-space) - (TeX-insert-macro "\\"))) - (LaTeX-insert-ampersands - LaTeX-array-skipping-regexp #'LaTeX-array-count-columns)) - -(defun LaTeX-item-tabular* (&optional suppress) - "Insert line break macro on the last line and suitable number of &'s. -For tabular* environment only. - -If SUPPRESS is non-nil, do not insert line break macro." - (unless suppress - (save-excursion - (end-of-line 0) - (just-one-space) - (TeX-insert-macro "\\"))) - (LaTeX-insert-ampersands - LaTeX-tabular*-skipping-regexp #'LaTeX-array-count-columns)) - -(defun LaTeX-insert-ampersands (regexp func) - "Insert suitable number of ampersands for the current environment. -The number is calculated from REGEXP and FUNC. - -Example 1: -Consider the case that the current environment begins with -\\begin{array}[t]{|lcr|} -. REGEXP must be chosen to match \"[t]\", that is, the text between just -after \"\\begin{array}\" and just before \"{|lcr|}\", which encloses -the column specification. FUNC must return the number of ampersands to -be inserted, which is 2 since this example specifies three columns. -FUNC is called with two arguments START and END, which spans the column -specification (without enclosing braces.) REGEXP is used to determine -these START and END. - -Example 2: -This time the environment begins with -\\begin{tabular*}{1.0\\linewidth}[b]{c@{,}p{5ex}} -. REGEXP must match \"{1.0\\linewidth}[b]\" and FUNC must return 1 from -the text \"c@{,}p{5ex}\" between START and END specified two columns. - -FUNC should return nil if it cannot determine the number of ampersands." - (let* ((cur (point)) - (num - (save-excursion - (ignore-errors - (LaTeX-find-matching-begin) - ;; Skip over "\begin{xxx}" and possible whitespaces. - (forward-list 1) - (skip-chars-forward " \t") - ;; Skip over the text specified by REGEXP and whitespaces. - (when (let ((case-fold-search nil)) - (re-search-forward regexp cur)) - (skip-chars-forward " \t") - (when (eq (following-char) ?{) - ;; We have reached the target "{yyy}" part. - (forward-char 1) - ;; The next line doesn't move point, so point - ;; is left just after the opening brace. - (let ((pos (TeX-find-closing-brace))) - (if pos - ;; Calculate number of ampersands to be inserted. - (funcall func (point) (1- pos)))))))))) - (if (natnump num) - (save-excursion (insert (make-string num ?&)))))) - -(defvar LaTeX-array-column-letters "clrp" - "Column letters for array-like environments. -See `LaTeX-array-count-columns' for detail.") - -(defun LaTeX-array-count-columns (start end) - "Count number of ampersands to be inserted. -The columns are specified by the letters found in the string -`LaTeX-array-column-letters' and the number of those letters within the -text between START and END is basically considered to be the number of -columns. The arguments surrounded between braces such as p{30pt} do not -interfere the count of columns. - -Return one less number than the columns, or nil on failing to count the -right number." - (save-excursion - (let (p (cols 0)) - (goto-char start) - (while (< (setq p (point)) end) - - ;; The below block accounts for one unit of move for - ;; one column. - (setq cols (+ cols - ;; treat *-operator specially. - (if (eq (following-char) ?*) - ;; *-operator is there. - (progn - ;; pick up repetition number and count - ;; how many columns are repeated. - (re-search-forward - "\\*[ \t\r\n%]*{[ \t\r\n%]*\\([0-9]+\\)[ \t\r\n%]*}" end) - (let ((n (string-to-number - (match-string-no-properties 1))) - ;; get start and end of repeated spec. - (s (progn (down-list 1) (point))) - (e (progn (up-list 1) (1- (point))))) - (* n (1+ (LaTeX-array-count-columns s e))))) - ;; not *-operator. - (skip-chars-forward - LaTeX-array-column-letters end)))) - ;; Do not skip over `*' (see above) and `[' (siunitx has `S[key=val]':): - (skip-chars-forward (concat - "^" LaTeX-array-column-letters "*" - TeX-grop LaTeX-optop) end) - (when (or (eq (following-char) ?\{) - (eq (following-char) ?\[)) - (forward-list 1)) - - ;; Not sure whether this is really necessary or not, but - ;; prepare for possible infinite loop anyway. - (when (eq p (point)) - (setq cols nil) - (goto-char end))) - ;; The number of ampersands is one less than column. - (if cols (1- cols))))) - -;;; Parser - -(defvar LaTeX-auto-style nil) -(defvar LaTeX-auto-arguments nil) -(defvar LaTeX-auto-optional nil) -(defvar LaTeX-auto-env-args nil) -(defvar LaTeX-auto-env-args-with-opt nil) - -(TeX-auto-add-type "label" "LaTeX") -(TeX-auto-add-type "bibitem" "LaTeX") -(TeX-auto-add-type "environment" "LaTeX") -(TeX-auto-add-type "bibliography" "LaTeX" "bibliographies") -(TeX-auto-add-type "index-entry" "LaTeX" "index-entries") -(TeX-auto-add-type "pagestyle" "LaTeX") -(TeX-auto-add-type "counter" "LaTeX") -(TeX-auto-add-type "length" "LaTeX") -(TeX-auto-add-type "savebox" "LaTeX" "saveboxes") - -(defvar LaTeX-auto-minimal-regexp-list - '(("\\\\document\\(style\\|class\\)\ -\\(\\[\\(\\([^#\\%]\\|%[^\n\r]*[\n\r]\\)*\\)\\]\\)?\ -{\\([^#\\.\n\r]+?\\)}" - (3 5 1) LaTeX-auto-style) - ("\\\\use\\(package\\)\\(\\[\\([^]]*\\)\\]\\)?\ -{\\(\\([^#}\\.%]\\|%[^\n\r]*[\n\r]\\)+?\\)}" - (3 4 1) LaTeX-auto-style)) - "Minimal list of regular expressions matching LaTeX macro definitions.") - -(defvar LaTeX-auto-label-regexp-list - '(("\\\\label{\\([^\n\r%\\{}]+\\)}" 1 LaTeX-auto-label)) - "List of regular expression matching LaTeX labels only.") - -(defvar LaTeX-auto-index-regexp-list - '(("\\\\\\(index\\|glossary\\){\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}" - 2 LaTeX-auto-index-entry)) - "List of regular expression matching LaTeX index/glossary entries only. -Regexp allows for up to 3 levels of parenthesis inside the index argument. -This is necessary since index entries may contain commands and stuff.") - -(defvar LaTeX-auto-class-regexp-list - '(;; \RequirePackage[<options>]{<package>}[<date>] - ("\\\\Require\\(Package\\)\\(\\[\\([^]]*\\)\\]\\)?\ -{\\([^#\\.\n\r]+?\\)}" - (3 4 1) LaTeX-auto-style) - ;; \RequirePackageWithOptions{<package>}[<date>], - ("\\\\Require\\(Package\\)WithOptions\\(\\){\\([^#\\.\n\r]+?\\)}" - (2 3 1) LaTeX-auto-style) - ;; \LoadClass[<options>]{<package>}[<date>] - ("\\\\Load\\(Class\\)\\(\\[\\([^]]*\\)\\]\\)?{\\([^#\\.\n\r]+?\\)}" - (3 4 1) LaTeX-auto-style) - ;; \LoadClassWithOptions{<package>}[<date>] - ("\\\\Load\\(Class\\)WithOptions\\(\\){\\([^#\\.\n\r]+?\\)}" - (2 3 1) LaTeX-auto-style) - ;; \DeclareRobustCommand{<cmd>}[<num>][<default>]{<definition>}, - ;; \DeclareRobustCommand*{<cmd>}[<num>][<default>]{<definition>} - ("\\\\DeclareRobustCommand\\*?{?\\\\\\([A-Za-z]+\\)}?\ -\\[\\([0-9]+\\)\\]\\[\\([^\n\r]*?\\)\\]" - (1 2 3) LaTeX-auto-optional) - ("\\\\DeclareRobustCommand\\*?{?\\\\\\([A-Za-z]+\\)}?\\[\\([0-9]+\\)\\]" - (1 2) LaTeX-auto-arguments) - ("\\\\DeclareRobustCommand\\*?{?\\\\\\([A-Za-z]+\\)}?" - 1 TeX-auto-symbol) - ;; Patterns for commands described in "LaTeX2e font selection" (fntguide) - ("\\\\DeclareMath\\(?:Symbol\\|Delimiter\\|Accent\\|Radical\\)\ -{?\\\\\\([A-Za-z]+\\)}?" - 1 TeX-auto-symbol) - ("\\\\\\(Declare\\|Provide\\)Text\ -\\(?:Command\\|Symbol\\|Accent\\|Composite\\){?\\\\\\([A-Za-z]+\\)}?" - 1 TeX-auto-symbol) - ("\\\\Declare\\(?:Text\\|Old\\)FontCommand{?\\\\\\([A-Za-z]+\\)}?" - 1 TeX-auto-symbol)) - "List of regular expressions matching macros in LaTeX classes and packages.") - -(defvar LaTeX-auto-pagestyle-regexp-list - '(("\\\\ps@\\([A-Za-z]+\\)" 1 LaTeX-auto-pagestyle)) - "List of regular expressions matching LaTeX pagestyles only.") - -(defvar LaTeX-auto-counter-regexp-list - '(("\\\\newcounter *{\\([A-Za-z]+\\)}" 1 LaTeX-auto-counter) - ("\\\\@definecounter{\\([A-Za-z]+\\)}" 1 LaTeX-auto-counter)) - "List of regular expressions matching LaTeX counters only.") - -(defvar LaTeX-auto-length-regexp-list - '(("\\\\newlength *{?\\\\\\([A-Za-z]+\\)}?" 1 LaTeX-auto-length)) - "List of regular expressions matching LaTeX lengths only.") - -(defvar LaTeX-auto-savebox-regexp-list - '(("\\\\newsavebox *{?\\\\\\([A-Za-z]+\\)}?" 1 LaTeX-auto-savebox)) - "List of regular expressions matching LaTeX saveboxes only.") - -(defvar LaTeX-auto-regexp-list - (append - (let ((token TeX-token-char)) - `((,(concat "\\\\\\(re\\)?\\(?:new\\|provide\\)command\\*?" - "{?\\\\\\(" token "+\\)}?\\[\\([0-9]+\\)\\]\\[\\([^\n\r]*\\)\\]") - (2 3 4 1) LaTeX-auto-optional) - (,(concat "\\\\\\(re\\)?\\(?:new\\|provide\\)command\\*?" - "{?\\\\\\(" token "+\\)}?\\[\\([0-9]+\\)\\]") - (2 3 1) LaTeX-auto-arguments) - (,(concat "\\\\\\(?:new\\|provide\\)command\\*?{?\\\\\\(" token "+\\)}?") - 1 TeX-auto-symbol) - ("\\\\\\(re\\)?newenvironment\\*?{\\([^}]+\\)}\\[\\([0-9]+\\)\\]\\[" - (2 3 1) LaTeX-auto-env-args-with-opt) - ("\\\\\\(re\\)?newenvironment\\*?{\\([^}]+\\)}\\[\\([0-9]+\\)\\]" - (2 3 1) LaTeX-auto-env-args) - ("\\\\newenvironment\\*?{\\([^}]+\\)}" - 1 LaTeX-auto-environment) - (,(concat "\\\\newtheorem{\\(" token "+\\)}") 1 LaTeX-auto-environment) - ("\\\\input{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" - 1 TeX-auto-file) - ("\\\\include{\\(\\.*[^#}%\\\\\\.\n\r]+\\)\\(\\.[^#}%\\\\\\.\n\r]+\\)?}" - 1 TeX-auto-file) - (,(concat "\\\\bibitem{\\(" token "[^, \n\r\t%\"#'()={}]*\\)}") - 1 LaTeX-auto-bibitem) - (,(concat "\\\\bibitem\\[[^][\n\r]+\\]{\\(" token "[^, \n\r\t%\"#'()={}]*\\)}") - 1 LaTeX-auto-bibitem) - ("\\\\bibliography{\\([^#}\\\\\n\r]+\\)}" 1 LaTeX-auto-bibliography) - ("\\\\addbibresource\\(?:\\[[^]]+\\]\\)?{\\([^#}\\\\\n\r]+\\)\\..+}" - 1 LaTeX-auto-bibliography) - ("\\\\add\\(?:global\\|section\\)bib\\(?:\\[[^]]+\\]\\)?{\\([^#}\\\\\n\r\.]+\\)\\(?:\\..+\\)?}" 1 LaTeX-auto-bibliography) - ("\\\\newrefsection\\[\\([^]]+\\)\\]" 1 LaTeX-split-bibs) - ("\\\\begin{refsection}\\[\\([^]]+\\)\\]" 1 LaTeX-split-bibs))) - LaTeX-auto-class-regexp-list - LaTeX-auto-label-regexp-list - LaTeX-auto-index-regexp-list - LaTeX-auto-minimal-regexp-list - LaTeX-auto-pagestyle-regexp-list - LaTeX-auto-counter-regexp-list - LaTeX-auto-length-regexp-list - LaTeX-auto-savebox-regexp-list) - "List of regular expression matching common LaTeX macro definitions.") - -(defun LaTeX-split-bibs (match) - "Extract bibliography resources from MATCH. -Split the string at commas and remove Biber file extensions." - (let ((bibs (split-string (TeX-match-buffer match) " *, *"))) - (dolist (bib bibs) - (LaTeX-add-bibliographies (replace-regexp-in-string - (concat "\\(?:\\." - (mapconcat #'identity - TeX-Biber-file-extensions - "\\|\\.") - "\\)") - "" bib))))) - -(defun LaTeX-auto-prepare () - "Prepare for LaTeX parsing." - (setq LaTeX-auto-arguments nil - LaTeX-auto-optional nil - LaTeX-auto-env-args nil - LaTeX-auto-style nil - LaTeX-auto-end-symbol nil)) - -(add-hook 'TeX-auto-prepare-hook #'LaTeX-auto-prepare) - -(defun LaTeX-listify-package-options (options) - "Return a list from a comma-separated string of package OPTIONS. -The input string may include LaTeX comments and newlines." - ;; We jump through all those hoops and don't just use `split-string' - ;; or the like in order to be able to deal with key=value package - ;; options which can look like this: "pdftitle={A Perfect Day}, - ;; colorlinks=false" - (let (opts match start) - (with-temp-buffer - (set-syntax-table LaTeX-mode-syntax-table) - (insert options) - (newline) ; So that the last entry can be found. - (goto-char (point-min)) - (setq start (point)) - (while (re-search-forward "[{ ,%\n\r]" nil t) - (setq match (match-string 0)) - (cond - ;; Step over groups. (Let's hope nobody uses escaped braces.) - ((string= match "{") - (up-list)) - ;; Get rid of whitespace. - ((string= match " ") - (delete-region (1- (point)) - (save-excursion - (skip-chars-forward " ") - (point)))) - ;; Add entry to output. - ((or (string= match ",") (= (point) (point-max))) - (let ((entry (buffer-substring-no-properties - start (1- (point))))) - (unless (member entry opts) - (setq opts (append opts (list entry))))) - (setq start (point))) - ;; Get rid of comments. - ((string= match "%") - (delete-region (1- (point)) - (line-beginning-position 2))) - ;; Get rid of newlines. - ((or (string= match "\n") (string= match "\r")) - (delete-char -1))))) - opts)) - -(defvar LaTeX-provided-class-options nil - "Alist of options provided to LaTeX classes. -For each element, the CAR is the name of the class, the CDR is -the list of options provided to it. - -For example, its value will be - ((\"book\" \"a4paper\" \"11pt\" \"openany\" \"fleqn\") - ...) -See also `LaTeX-provided-package-options'.") -(make-variable-buffer-local 'LaTeX-provided-class-options) - -(defun LaTeX-provided-class-options-member (class option) - "Return non-nil if OPTION has been given to CLASS at load time. -The value is actually the tail of the list of options given to CLASS." - (member option (cdr (assoc class LaTeX-provided-class-options)))) - -(defun LaTeX-match-class-option (regexp) - "Check if a documentclass option matching REGEXP is active. -Return first found class option matching REGEXP, or nil if not found." - (TeX-member regexp (apply #'append - (mapcar #'cdr LaTeX-provided-class-options)) - #'string-match)) - -(defvar LaTeX-provided-package-options nil - "Alist of options provided to LaTeX packages. -For each element, the CAR is the name of the package, the CDR is -the list of options provided to it. - -For example, its value will be - ((\"babel\" \"german\") - (\"geometry\" \"a4paper\" \"top=2cm\" \"bottom=2cm\" \"left=2.5cm\" \"right=2.5cm\") - ...) -See also `LaTeX-provided-class-options'.") -(make-variable-buffer-local 'LaTeX-provided-package-options) - -(defun LaTeX-provided-package-options-member (package option) - "Return non-nil if OPTION has been given to PACKAGE at load time. -The value is actually the tail of the list of options given to PACKAGE." - (member option (cdr (assoc package LaTeX-provided-package-options)))) - -(defun LaTeX-auto-cleanup () - "Cleanup after LaTeX parsing." - - ;; Cleanup BibTeX/Biber files - (setq LaTeX-auto-bibliography - (apply #'append (mapcar (lambda (arg) - (split-string arg ",")) - LaTeX-auto-bibliography))) - - ;; Reset class and packages options for the current buffer - (setq LaTeX-provided-class-options nil) - (setq LaTeX-provided-package-options nil) - - ;; Cleanup document classes and packages - (unless (null LaTeX-auto-style) - (while LaTeX-auto-style - (let* ((entry (car LaTeX-auto-style)) - (options (nth 0 entry)) - (style (nth 1 entry)) - (class (nth 2 entry))) - - ;; Next document style. - (setq LaTeX-auto-style (cdr LaTeX-auto-style)) - - ;; Get the options. - (setq options (LaTeX-listify-package-options options)) - - ;; Treat documentclass/documentstyle specially. - (if (or (string-equal "package" class) - (string-equal "Package" class)) - (dolist (elt (split-string - style "\\([ \t\r\n]\\|%[^\n\r]*[\n\r]\\|,\\)+")) - ;; Append style to the style list. - (add-to-list 'TeX-auto-file elt t) - ;; Append to `LaTeX-provided-package-options' the name of the - ;; package and the options provided to it at load time. - (unless (equal options '("")) - (TeX-add-to-alist 'LaTeX-provided-package-options - (list (cons elt options))))) - ;; And a special "art10" style file combining style and size. - (add-to-list 'TeX-auto-file style t) - (add-to-list 'TeX-auto-file - (concat - (cond ((string-equal "article" style) - "art") - ((string-equal "book" style) - "bk") - ((string-equal "report" style) - "rep") - ((string-equal "jarticle" style) - "jart") - ((string-equal "jbook" style) - "jbk") - ((string-equal "jreport" style) - "jrep") - ((string-equal "j-article" style) - "j-art") - ((string-equal "j-book" style) - "j-bk") - ((string-equal "j-report" style ) - "j-rep") - (t style)) - (cond ((member "11pt" options) - "11") - ((member "12pt" options) - "12") - (t - "10"))) - t) - (unless (equal options '("")) - (TeX-add-to-alist 'LaTeX-provided-class-options - (list (cons style options))))) - - ;; The third argument if "class" indicates LaTeX2e features. - (cond ((or (string-equal class "class") - (string-equal class "Class")) - (add-to-list 'TeX-auto-file "latex2e")) - ((string-equal class "style") - (add-to-list 'TeX-auto-file "latex2")))))) - - ;; Cleanup optional arguments - (mapc (lambda (entry) - ;; If we're renewcommand-ing and there is already an entry - ;; in `TeX-auto-symbol', delete it first: - (when (and (string= (nth 2 entry) "re") - (assoc (car entry) TeX-auto-symbol)) - (setq TeX-auto-symbol - (assq-delete-all (car (assoc (car entry) - TeX-auto-symbol)) - TeX-auto-symbol))) - (add-to-list 'TeX-auto-symbol - (list (nth 0 entry) - (string-to-number (nth 1 entry))))) - LaTeX-auto-arguments) - - ;; Cleanup default optional arguments - (mapc (lambda (entry) - ;; If we're renewcommand-ing and there is already an entry - ;; in `TeX-auto-symbol', delete it first: - (when (and (string= (nth 3 entry) "re") - (assoc (car entry) TeX-auto-symbol)) - (setq TeX-auto-symbol - (assq-delete-all (car (assoc (car entry) - TeX-auto-symbol)) - TeX-auto-symbol))) - (add-to-list 'TeX-auto-symbol - (list (nth 0 entry) - (vector "argument") - (1- (string-to-number (nth 1 entry)))))) - LaTeX-auto-optional) - - ;; Cleanup environments arguments - (mapc (lambda (entry) - ;; If we're renewenvironment-ing and there is already an - ;; entry in `LaTeX-auto-environment', delete it first: - (when (and (string= (nth 2 entry) "re") - (assoc (car entry) LaTeX-auto-environment)) - (setq LaTeX-auto-environment - (assq-delete-all (car (assoc (car entry) - LaTeX-auto-environment)) - LaTeX-auto-environment))) - (add-to-list 'LaTeX-auto-environment - (list (nth 0 entry) - (string-to-number (nth 1 entry))))) - LaTeX-auto-env-args) - - ;; Ditto for environments with an optional arg - (mapc (lambda (entry) - ;; If we're renewenvironment-ing and there is already an - ;; entry in `LaTeX-auto-environment', delete it first: - (when (and (string= (nth 2 entry) "re") - (assoc (car entry) LaTeX-auto-environment)) - (setq LaTeX-auto-environment - (assq-delete-all (car (assoc (car entry) - LaTeX-auto-environment)) - LaTeX-auto-environment))) - (add-to-list 'LaTeX-auto-environment - (list (nth 0 entry) 'LaTeX-env-args (vector "argument") - (1- (string-to-number (nth 1 entry)))))) - LaTeX-auto-env-args-with-opt) - - ;; Cleanup use of def to add environments - ;; NOTE: This uses an O(N^2) algorithm, while an O(N log N) - ;; algorithm is possible. - (mapc (lambda (symbol) - (if (not (TeX-member symbol TeX-auto-symbol #'equal)) - ;; No matching symbol, insert in list - (add-to-list 'TeX-auto-symbol (concat "end" symbol)) - ;; Matching symbol found, remove from list - (if (equal (car TeX-auto-symbol) symbol) - ;; Is it the first symbol? - (setq TeX-auto-symbol (cdr TeX-auto-symbol)) - ;; Nope! Travel the list - (let ((list TeX-auto-symbol)) - (while (consp (cdr list)) - ;; Until we find it. - (if (equal (car (cdr list)) symbol) - ;; Then remove it. - (setcdr list (cdr (cdr list)))) - (setq list (cdr list))))) - ;; and add the symbol as an environment. - (add-to-list 'LaTeX-auto-environment symbol))) - LaTeX-auto-end-symbol)) - -(add-hook 'TeX-auto-cleanup-hook #'LaTeX-auto-cleanup) - -(advice-add 'LaTeX-add-bibliographies :after #'TeX-run-style-hooks) - -;;; Biber support - -(defvar LaTeX-using-Biber nil - "Used to track whether Biber is in use.") -(make-variable-buffer-local 'LaTeX-using-Biber) - -;;; BibTeX - -(defvar BibTeX-auto-regexp-list - '(("@[Ss][Tt][Rr][Ii][Nn][Gg]" 1 ignore) - ("@[a-zA-Z]+[{(][ \t]*\\([^, \n\r\t%\"#'()={}]*\\)" 1 LaTeX-auto-bibitem)) - "List of regexp-list expressions matching BibTeX items.") - -;;;###autoload -(defun BibTeX-auto-store () - "This function should be called from `bibtex-mode-hook'. -It will setup BibTeX to store keys in an auto file." - ;; We want this to be early in the list, so we do not - ;; add it before we enter BibTeX mode the first time. - (add-hook 'write-contents-functions #'TeX-safe-auto-write nil t) - (TeX-bibtex-set-BibTeX-dialect) - (set (make-local-variable 'TeX-auto-untabify) nil) - (set (make-local-variable 'TeX-auto-parse-length) 999999) - (set (make-local-variable 'TeX-auto-regexp-list) BibTeX-auto-regexp-list) - (set (make-local-variable 'TeX-master) t)) - -;;; Macro Argument Hooks - -(defun TeX-arg-conditional (_optional expr then else) - "Implement if EXPR THEN ELSE. - -If EXPR evaluate to true, parse THEN as an argument list, else -parse ELSE as an argument list. The compatibility argument -OPTIONAL is ignored." - (TeX-parse-arguments (if (eval expr t) then else))) - -(defun TeX-arg-eval (optional &rest args) - "Evaluate ARGS and insert value in buffer. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one." - (TeX-argument-insert (eval args t) optional)) - -(defun TeX-read-label (optional &optional prompt definition) - "Prompt for a label completing with known labels and return it. -This function always returns a string depending on user input: -the returned value can be an empty string \"\", the value of -`TeX-read-label-prefix' if present (for example, \"fig:\") or a -complete label input (for example, \"fig:foo\"). If OPTIONAL is -non-nil, indicate optional as part of prompt in minibuffer. Use -PROMPT as the prompt string. If DEFINITION is non-nil, add the -chosen label to the list of defined labels. -`TeX-read-label-prefix' is used as initial input for the label. -Also check if label is already defined and ask user for -confirmation before proceeding." - (let (label valid) - (while (not valid) - (setq label - (completing-read - (TeX-argument-prompt optional prompt "Key") - (LaTeX-label-list) nil nil TeX-read-label-prefix)) - ;; If we're defining a label, check if it's already defined and - ;; ask user for confirmation, otherwise ask again - (cond ((and definition - (assoc label (LaTeX-label-list))) - (ding) - (when (y-or-n-p - ;; Emacs 24 compatibility - (if (fboundp 'format-message) - (format-message "Label `%s' exists. Use anyway? " label) - (format "Label `%s' exists. Use anyway? " label))) - (setq valid t))) - (t - (setq valid t)))) - ;; Only add a newly defined label to list of known one if it is - ;; not empty and not equal to `TeX-read-label-prefix', if given - (when (and definition - (not (string-equal "" label)) - (if TeX-read-label-prefix - (not (string-equal TeX-read-label-prefix label)) - t)) - (LaTeX-add-labels label)) - ;; Return label, can be empty string "", TeX-read-label-prefix - ;; only "fig:" or the real thing like "fig:foo" - label)) - -(defun TeX-arg-label (optional &optional prompt definition) - "Prompt for a label completing with known labels. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. If DEFINITION is non-nil, add the chosen label to the -list of defined labels. `TeX-read-label-prefix' is used as -initial input for the label." - (TeX-argument-insert - (TeX-read-label optional prompt definition) optional optional)) - -(defvar reftex-ref-macro-prompt) - -(defun TeX-arg-ref (optional &optional prompt definition) - "Let-bind `reftex-ref-macro-prompt' to nil and pass arguments -to `TeX-arg-label'. - -See the documentation of `TeX-arg-label' for details on the -arguments: OPTIONAL, PROMPT, and DEFINITION." - (let ((reftex-ref-macro-prompt nil)) - (TeX-arg-label optional prompt definition))) - -(defun TeX-arg-index-tag (optional &optional prompt &rest _args) - "Prompt for an index tag. -This is the name of an index, not the entry. - -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. ARGS is unused." - (TeX-argument-insert - (TeX-read-string (TeX-argument-prompt optional prompt "Index tag")) - optional)) - -(defun TeX-arg-index (optional &optional prompt &rest _args) - "Prompt for an index entry completing with known entries. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. ARGS is unused." - (let ((entry (completing-read (TeX-argument-prompt optional prompt "Key") - (LaTeX-index-entry-list)))) - (if (and (not (string-equal "" entry)) - (not (member (list entry) (LaTeX-index-entry-list)))) - (LaTeX-add-index-entries entry)) - (TeX-argument-insert entry optional optional))) - -(defalias 'TeX-arg-define-index #'TeX-arg-index) - -(defun TeX-arg-macro (optional &optional prompt definition) - "Prompt for a TeX macro with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. If DEFINITION is non-nil, add the chosen macro to the -list of defined macros." - (let ((macro (completing-read (TeX-argument-prompt optional prompt - (concat "Macro: " - TeX-esc) - t) - (TeX-symbol-list)))) - (if (and definition (not (string-equal "" macro))) - (TeX-add-symbols macro)) - (TeX-argument-insert macro optional TeX-esc))) - -(defun TeX-arg-environment (optional &optional prompt definition) - "Prompt for a LaTeX environment with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. If DEFINITION is non-nil, add the chosen environment to -the list of defined environments." - (let ((environment (completing-read (TeX-argument-prompt optional prompt - "Environment") - (LaTeX-environment-list)))) - (if (and definition (not (string-equal "" environment))) - (LaTeX-add-environments environment)) - - (TeX-argument-insert environment optional))) - -;; Why is DEFINITION unused? -(defun TeX-arg-cite (optional &optional prompt _definition) - "Prompt for a BibTeX citation with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. DEFINITION is unused." - (let ((items (multi-prompt "," t (TeX-argument-prompt optional prompt "Key") - (LaTeX-bibitem-list)))) - (apply #'LaTeX-add-bibitems items) - (TeX-argument-insert (mapconcat #'identity items ",") optional optional))) - -(defun TeX-arg-counter (optional &optional prompt definition) - "Prompt for a LaTeX counter. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. If DEFINITION is non-nil, add the chosen counter to -the list of defined counters." - (let ((counter (completing-read (TeX-argument-prompt optional prompt - "Counter") - (LaTeX-counter-list)))) - (if (and definition (not (string-equal "" counter))) - (LaTeX-add-counters counter)) - (TeX-argument-insert counter optional))) - -(defun TeX-arg-savebox (optional &optional prompt definition) - "Prompt for a LaTeX savebox. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. If definition is non-nil, the savebox is added to the -list of defined saveboxes." - (let ((savebox (completing-read (TeX-argument-prompt optional prompt - (concat "Savebox: " - TeX-esc) t) - (LaTeX-savebox-list)))) - (if (and definition (not (zerop (length savebox)))) - (LaTeX-add-saveboxes savebox)) - (TeX-argument-insert savebox optional TeX-esc))) - -(defun TeX-arg-length (optional &optional prompt default initial-input - definition) - "Prompt for a LaTeX length. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. DEFAULT is passed to `completing-read', which see. If -INITIAL-INPUT is non-nil, insert it in the minibuffer initially, -with point positioned at the end. If DEFINITION is non-nil, the -length is added to the list of defined length." - (let ((length - (completing-read - (TeX-argument-prompt optional - ;; Cater for the case when PROMPT and - ;; DEFAULT are both given: - (if (and prompt default) - (concat prompt " (default " default ")") - prompt) - (concat "Length" - (when (and default (not optional)) - (concat " (default " default ")")))) - ;; A valid length can be a macro or a length of the form - ;; <value><dimension>. Input starting with a `\' can be - ;; completed with length macros. - (mapcar (lambda (elt) (concat TeX-esc (car elt))) - (LaTeX-length-list)) - ;; Some macros takes as argument only a length macro (e.g., - ;; `\setlength' in its first argument, and `\newlength'), in - ;; this case is convenient to set `\\' as initial input. - nil nil initial-input nil default))) - (if (and definition (not (zerop (length length)))) - ;; Strip leading TeX-esc from macro name - (LaTeX-add-lengths (substring length 1))) - (TeX-argument-insert length optional))) - -(defun TeX-arg-file (optional &optional prompt) - "Prompt for a filename in the current directory. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-argument-insert (read-file-name (TeX-argument-prompt optional - prompt "File") - "" "" nil) - optional)) - -(defun TeX-arg-file-name (optional &optional prompt) - "Prompt for a file name. -Initial input is the name of the file being visited in the -current buffer, with extension. If OPTIONAL is non-nil, insert -it as an optional argument. Use PROMPT as the prompt string." - (let ((name (file-name-nondirectory buffer-file-name))) - (TeX-argument-insert - (TeX-read-string - (TeX-argument-prompt optional - (when prompt - (if optional - prompt - (format (concat prompt " (default %s)") name))) - (if optional - "Name" - (format "Name (default %s)" name))) - nil nil (if optional nil name)) - optional))) - -(defun TeX-arg-file-name-sans-extension (optional &optional prompt) - "Prompt for a file name. -Initial input is the name of the file being visited in the -current buffer, without extension. If OPTIONAL is non-nil, -insert it as an optional argument. Use PROMPT as the prompt -string." - (let ((name (file-name-sans-extension - (file-name-nondirectory buffer-file-name)))) - (TeX-argument-insert - (TeX-read-string - (TeX-argument-prompt optional - (when prompt - (if optional - prompt - (format (concat prompt " (default %s)") name))) - (if optional - "Name" - (format "Name (default %s)" name))) - nil nil (if optional nil name)) - optional))) - -(defun TeX-arg-define-label (optional &optional prompt) - "Prompt for a label completing with known labels. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. `TeX-read-label-prefix' is used as initial input for the -label." - (TeX-arg-label optional prompt t)) - -(defun TeX-arg-default-argument-value (optional &optional prompt) - "Prompt for the default value for the first argument of a LaTeX macro. - -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-argument-insert - (TeX-read-string - (TeX-argument-prompt optional prompt "Default value for first argument")) - optional)) - -(defun TeX-arg-define-macro-arguments (optional &optional prompt) - "Prompt for the number of arguments for a LaTeX macro. If this -is non-zero, also prompt for the default value for the first -argument. - -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (let ((arg-count (TeX-read-string - (TeX-argument-prompt optional prompt - "Number of arguments" - nil)))) - (unless (or (string= arg-count "0") - (string= arg-count "")) - (TeX-argument-insert arg-count optional) - (unless (string-equal LaTeX-version "2") - (TeX-arg-default-argument-value optional))))) - -(defun TeX-arg-define-macro (optional &optional prompt) - "Prompt for a TeX macro with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-arg-macro optional prompt t)) - -(defun TeX-arg-define-environment (optional &optional prompt) - "Prompt for a LaTeX environment with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-arg-environment optional prompt t)) - -(defun TeX-arg-define-cite (optional &optional prompt) - "Prompt for a BibTeX citation. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-arg-cite optional prompt t)) - -(defun TeX-arg-define-counter (optional &optional prompt) - "Prompt for a LaTeX counter. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-arg-counter optional prompt t)) - -(defun TeX-arg-define-savebox (optional &optional prompt) - "Prompt for a LaTeX savebox. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-arg-savebox optional prompt t)) - -(defun TeX-arg-define-length (optional &optional prompt) - "Prompt for a LaTeX length. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-arg-length optional prompt nil "\\" t)) - -(defcustom LaTeX-style-list '(("amsart") - ("amsbook") - ("article") - ("beamer") - ("book") - ("dinbrief") - ("foils") - ("letter") - ("memoir") - ("minimal") - ("prosper") - ("report") - ("scrartcl") - ("scrbook") - ("scrlttr2") - ("scrreprt") - ("slides")) - "List of document classes offered when inserting a document environment. - -If `TeX-arg-input-file-search' is set to t, you will get -completion with all LaTeX classes available in your distribution -and this variable will be ignored." - :group 'LaTeX-environment - :type '(repeat (group (string :format "%v")))) - -(defvar LaTeX-global-class-files nil - "List of the LaTeX class files. -Initialized once at the first time you prompt for a LaTeX class. -May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -;; Add the variable to `TeX-normal-mode-reset-list': -(add-to-list 'TeX-normal-mode-reset-list 'TeX-global-class-files) - -(defcustom TeX-arg-input-file-search t - "If `TeX-arg-input-file' should search for files. -If the value is t, files in TeX's search path are searched for -and provided for completion. The file name is then inserted -without directory and extension. If the value is nil, the file -name can be specified manually and is inserted with a path -relative to the directory of the current buffer's file and with -extension. If the value is `ask', you are asked for the method -to use every time `TeX-arg-input-file' is called." - :group 'LaTeX-macro - :type '(choice (const t) (const nil) (const ask))) - -(defvar TeX-after-document-hook nil - "List of functions to be run at the end of `TeX-arg-document'. - -To insert a hook here, you must insert it in the appropiate style file.") - -(defun TeX-arg-document (_optional &optional _ignore) - "Insert arguments to documentclass. -OPTIONAL and IGNORE are ignored." - (let* ((TeX-file-extensions '("cls")) - (crm-separator ",") - style var options defopt optprmpt) - (unless LaTeX-global-class-files - (setq LaTeX-global-class-files - (if (if (eq TeX-arg-input-file-search 'ask) - (not (y-or-n-p "Find class yourself? ")) - TeX-arg-input-file-search) - (prog2 - (message "Searching for LaTeX classes...") - (TeX-search-files-by-type 'texinputs 'global t t) - (message "Searching for LaTeX classes...done")) - LaTeX-style-list))) - (setq style (completing-read - (concat "Document class (default " LaTeX-default-style "): ") - LaTeX-global-class-files nil nil nil nil LaTeX-default-style)) - ;; Clean up hook before use. - (setq TeX-after-document-hook nil) - (TeX-load-style style) - (setq var (intern (format "LaTeX-%s-class-options" style))) - (setq defopt (if (stringp LaTeX-default-options) - LaTeX-default-options - (mapconcat #'identity LaTeX-default-options ","))) - (setq optprmpt - (if (and defopt (not (string-equal defopt ""))) - (format "Options (default %s): " defopt) "Options: ")) - (if (or (and (boundp var) - (listp (symbol-value var))) - (fboundp var)) - (if (functionp var) - (setq options (funcall var)) - (when (symbol-value var) - (setq options - (mapconcat #'identity - (TeX-completing-read-multiple - optprmpt (mapcar #'list (symbol-value var)) - nil nil nil nil defopt) - ",")))) - (setq options (TeX-read-string optprmpt nil nil defopt))) - (unless (zerop (length options)) - (insert LaTeX-optop options LaTeX-optcl) - (let ((opts (LaTeX-listify-package-options options))) - (TeX-add-to-alist 'LaTeX-provided-class-options - (list (cons style opts))))) - (insert TeX-grop style TeX-grcl)) - - (TeX-update-style t) - (run-hooks 'TeX-after-document-hook)) - -(defvar LaTeX-after-usepackage-hook nil - "List of functions to be run at the end of `LaTeX-arg-usepackage'. - -To insert a hook here, you must insert it in the appropiate style file.") - -(defvar TeX-global-input-files nil - "List of the non-local TeX input files. -Initialized once at the first time you prompt for an input file. -May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -(defvar TeX-global-input-files-with-extension nil - "List of the non-local TeX input files with extension. -Initialized once at the first time you prompt for an input file -inside a file hook command. -May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -(defvar LaTeX-global-package-files nil - "List of the LaTeX package files. -Initialized once at the first time you prompt for a LaTeX package. -May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -;; Add the variables to `TeX-normal-mode-reset-list': -(add-to-list 'TeX-normal-mode-reset-list 'TeX-global-input-files) -(add-to-list 'TeX-normal-mode-reset-list 'TeX-global-input-files-with-extension) -(add-to-list 'TeX-normal-mode-reset-list 'LaTeX-global-package-files) - -(defun LaTeX-arg-usepackage-read-packages-with-options () - "Read the packages and the options for the usepackage macro. - -If at least one package is provided, this function returns a cons -cell, whose CAR is the list of packages and the CDR is the string -of the options, nil otherwise." - (let* ((TeX-file-extensions '("sty")) - (crm-separator ",") - packages var options) - (unless LaTeX-global-package-files - (if (if (eq TeX-arg-input-file-search 'ask) - (not (y-or-n-p "Find packages yourself? ")) - TeX-arg-input-file-search) - (progn - (message "Searching for LaTeX packages...") - (setq LaTeX-global-package-files - (mapcar #'list (TeX-search-files-by-type - 'texinputs 'global t t))) - (message "Searching for LaTeX packages...done")))) - (setq packages (TeX-completing-read-multiple - "Packages: " LaTeX-global-package-files)) - ;; Clean up hook before use in `LaTeX-arg-usepackage-insert'. - (setq LaTeX-after-usepackage-hook nil) - (mapc #'TeX-load-style packages) - ;; Prompt for options only if at least one package has been supplied, return - ;; nil otherwise. - (when packages - (setq var (if (= 1 (length packages)) - (intern (format "LaTeX-%s-package-options" (car packages))) - ;; Something like `\usepackage[options]{pkg1,pkg2,pkg3,...}' is - ;; allowed (provided that pkg1, pkg2, pkg3, ... accept same - ;; options). When there is more than one package, set `var' to - ;; a dummy value so next `if' enters else form. - t)) - (if (or (and (boundp var) - (listp (symbol-value var))) - (fboundp var)) - (if (functionp var) - (setq options (funcall var)) - (when (symbol-value var) - (setq options - (mapconcat #'identity - (TeX-completing-read-multiple - "Options: " (mapcar #'list (symbol-value var))) - ",")))) - (setq options (TeX-read-string "Options: "))) - (cons packages options)))) - -(defun LaTeX-arg-usepackage-insert (packages options) - "Actually insert arguments to usepackage." - (unless (zerop (length options)) - (let ((opts (LaTeX-listify-package-options options))) - (mapc (lambda (elt) - (TeX-add-to-alist 'LaTeX-provided-package-options - (list (cons elt opts)))) - packages)) - (insert LaTeX-optop options LaTeX-optcl)) - (insert TeX-grop (mapconcat #'identity packages ",") TeX-grcl) - (run-hooks 'LaTeX-after-usepackage-hook) - (apply #'TeX-run-style-hooks packages)) - -(defun LaTeX-arg-usepackage (_optional) - "Insert arguments to usepackage. -OPTIONAL is ignored." - (let* ((packages-options (LaTeX-arg-usepackage-read-packages-with-options)) - (packages (car packages-options)) - (options (cdr packages-options))) - (LaTeX-arg-usepackage-insert packages options))) - -(defun LaTeX-insert-usepackages () - "Prompt for the insertion of usepackage macros until empty -input is reached. - -Return t if at least one \\usepackage has been inserted, nil -otherwise." - (let (packages-options packages options (inserted nil)) - (while (setq packages-options - (LaTeX-arg-usepackage-read-packages-with-options)) - (setq packages (car packages-options)) - (setq options (cdr packages-options)) - (insert TeX-esc "usepackage") - (LaTeX-arg-usepackage-insert packages options) - (LaTeX-newline) - (setq inserted t)) - inserted)) - -(defcustom LaTeX-search-files-type-alist - '((texinputs "${TEXINPUTS.latex}" ("tex/generic/" "tex/latex/") - TeX-file-extensions) - (docs "${TEXDOCS}" ("doc/") TeX-doc-extensions) - (graphics "${TEXINPUTS}" ("tex/") LaTeX-includegraphics-extensions) - (bibinputs "${BIBINPUTS}" ("bibtex/bib/") BibTeX-file-extensions) - (bstinputs "${BSTINPUTS}" ("bibtex/bst/") BibTeX-style-extensions) - (bbxinputs "" ("tex/latex/") BibLaTeX-style-extensions) - (biberinputs "${BIBINPUTS}" ("bibtex/bib/") TeX-Biber-file-extensions)) - "Alist of filetypes with locations and file extensions. -Each element of the alist consists of a symbol expressing the -filetype, a variable which can be expanded on kpathsea-based -systems into the directories where files of the given type -reside, a list of absolute directories, relative directories -below the root of a TDS-compliant TeX tree or a list of variables -with either type of directories as an alternative for -non-kpathsea-based systems and a list of extensions to be matched -upon a file search. Note that the directories have to end with a -directory separator. - -Reset the mode for a change of this variable to take effect." - :group 'TeX-file - :type '(alist :key-type symbol - :value-type - (group (string :tag "Kpathsea variable") - (choice :tag "Directories" - (repeat :tag "TDS subdirectories" string) - (repeat :tag "Absolute directories" directory) - (repeat :tag "Variables" variable)) - (choice :tag "Extensions" - variable (repeat string))))) - -(defun TeX-arg-input-file (optional &optional prompt local) - "Prompt for a tex or sty file. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. PROMPT is the prompt, -LOCAL is a flag. If the flag is set, only complete with local -files." - (let ((search (if (eq TeX-arg-input-file-search 'ask) - (not (y-or-n-p "Find file yourself? ")) - TeX-arg-input-file-search)) - file style) - (if search - (progn - (unless (or TeX-global-input-files local) - (message "Searching for files...") - (setq TeX-global-input-files - (mapcar #'list (TeX-search-files-by-type - 'texinputs 'global t t))) - (message "Searching for files...done")) - (setq file (completing-read - (TeX-argument-prompt optional prompt "File") - (TeX-delete-dups-by-car - (append (mapcar #'list (TeX-search-files-by-type - 'texinputs 'local t t)) - (unless local - TeX-global-input-files)))) - style file)) - (setq file (read-file-name - (TeX-argument-prompt optional prompt "File") nil "")) - (unless (string-equal file "") - (setq file (file-relative-name file))) - (setq style (file-name-sans-extension (file-name-nondirectory file)))) - (unless (string-equal "" style) - (TeX-run-style-hooks style)) - (TeX-argument-insert file optional))) - -(defvar BibTeX-global-style-files nil - "Association list of BibTeX style files. - -Initialized once at the first time you prompt for an input file. -May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -(defvar BibLaTeX-global-style-files nil - "Association list of BibLaTeX style files. - -Initialized once at the first time you prompt for a BibLaTeX -style. May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -;; Add both variables to `TeX-normal-mode-reset-list': -(add-to-list 'TeX-normal-mode-reset-list 'BibTeX-global-style-files) -(add-to-list 'TeX-normal-mode-reset-list 'BibLaTeX-global-style-files) - -(defun TeX-arg-bibstyle (optional &optional prompt) - "Prompt for a BibTeX style file. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (message "Searching for BibTeX styles...") - (or BibTeX-global-style-files - (setq BibTeX-global-style-files - (mapcar #'list (TeX-search-files-by-type 'bstinputs 'global t t)))) - (message "Searching for BibTeX styles...done") - (TeX-argument-insert - (completing-read (TeX-argument-prompt optional prompt "BibTeX style") - (append (mapcar #'list (TeX-search-files-by-type - 'bstinputs 'local t t)) - BibTeX-global-style-files)) - optional)) - -(defvar BibTeX-global-files nil - "Association list of BibTeX files. - -Initialized once at the first time you prompt for a BibTeX file. -May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -(defvar TeX-Biber-global-files nil - "Association list of Biber files. - -Initialized once at the first time you prompt for an Biber file. -May be reset with `\\[universal-argument] \\[TeX-normal-mode]'.") - -(add-to-list 'TeX-normal-mode-reset-list 'BibTeX-global-files) -(add-to-list 'TeX-normal-mode-reset-list 'TeX-Biber-global-files) - -(defun TeX-arg-bibliography (optional &optional prompt) - "Prompt for a BibTeX database file. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (message "Searching for BibTeX files...") - (or BibTeX-global-files - (setq BibTeX-global-files - (mapcar #'list (TeX-search-files-by-type 'bibinputs 'global t t)))) - (message "Searching for BibTeX files...done") - (let ((styles (multi-prompt - "," t - (TeX-argument-prompt optional prompt "BibTeX files") - (append (mapcar #'list (TeX-search-files-by-type - 'bibinputs 'local t t)) - BibTeX-global-files)))) - (apply #'LaTeX-add-bibliographies styles) - ;; Run style files associated to the bibliography database files in order to - ;; immediately fill `LaTeX-bibitem-list'. - (mapc #'TeX-run-style-hooks styles) - (TeX-argument-insert (mapconcat #'identity styles ",") optional))) - -(defun TeX-arg-corner (optional &optional prompt) - "Prompt for a LaTeX side or corner position with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-argument-insert - (completing-read (TeX-argument-prompt optional prompt "Position") - '("l" "r" "t" "b" "tl" "tr" "bl" "br") - nil t) - optional)) - -(defun TeX-arg-lr (optional &optional prompt) - "Prompt for a LaTeX side with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (TeX-argument-insert - (completing-read (TeX-argument-prompt optional prompt "Position") - '("l" "r") - nil t) - optional)) - -(defun TeX-arg-tb (optional &optional prompt poslist) - "Prompt for a LaTeX side with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. POSLIST contains the positioning characters offered for -completion. It can be the symbols `center', `stretch' or nil -with the following completion list: - center t, b, c - stretch t, b, c, s - nil t, b" - (TeX-argument-insert - (completing-read (TeX-argument-prompt optional prompt "Position") - (cond ((eq poslist 'center) - '("t" "b" "c")) - ((eq poslist 'stretch) - '("t" "b" "c" "s")) - (t - '("t" "b"))) - nil t) - optional)) - -(defcustom TeX-date-format "%Y/%m/%d" - "The default date format prompted by `TeX-arg-date'." - :group 'LaTeX-macro - :type 'string) - -(defun TeX-arg-date (optional &optional prompt) - "Prompt for a date, defaulting to the current date. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (let ((default (format-time-string TeX-date-format (current-time)))) - (TeX-argument-insert - (TeX-read-string - (TeX-argument-prompt optional - (when prompt - (format (concat prompt " (default %s)") default)) - (format "Date (default %s)" default)) - nil nil default) - optional))) - -(defun TeX-arg-version (optional &optional prompt) - "Prompt for the version of a file. -Use as initial input the current date. If OPTIONAL is non-nil, -insert the resulting value as an optional argument, otherwise as -a mandatory one. Use PROMPT as the prompt string." - (let ((version (format-time-string "%Y/%m/%d" (current-time)))) - (TeX-argument-insert - (TeX-read-string - (TeX-argument-prompt optional - (when prompt - (format (concat prompt " (default %s)") version)) - (format "Version (default %s)" version)) - nil nil version) - optional))) - -(defun TeX-arg-pagestyle (optional &optional prompt definition) - "Prompt for a LaTeX pagestyle with completion. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string. If DEFINITION is non-nil, add the chosen pagestyle to -the list of defined pagestyles." - (let ((pagestyle (completing-read (TeX-argument-prompt optional prompt - "Pagestyle") - (LaTeX-pagestyle-list)))) - (if (and definition (not (string-equal "" pagestyle))) - (LaTeX-add-pagestyles pagestyle)) - (TeX-argument-insert pagestyle optional))) - -(defcustom LaTeX-default-verb-delimiter ?| - "Default delimiter for `\\verb' macros." - :group 'LaTeX-macro - :type 'character) - -(defun TeX-arg-verb (_optional &optional _ignore) - "Prompt for delimiter and text. -The compatibility argument OPTIONAL and IGNORE are ignored." - (let ((del (read-quoted-char - (concat "Delimiter (default " - (char-to-string LaTeX-default-verb-delimiter) "): ")))) - (when (<= del ?\ ) (setq del LaTeX-default-verb-delimiter)) - (if (TeX-active-mark) - (progn - (insert del) - (goto-char (mark)) - (insert del)) - (insert del (read-from-minibuffer "Text: ") del)) - (setq LaTeX-default-verb-delimiter del))) - -(defun TeX-arg-verb-delim-or-brace (optional &optional prompt) - "Prompt for delimiter and text. -If OPTIONAL, indicate optional argument in minibuffer. PROMPT is -a string replacing the default one when asking the user for text. -This function is intended for \\verb like macros which take their -argument in delimiters like \"\| \|\" or braces \"\{ \}\"." - (let ((del (read-quoted-char - (concat "Delimiter (default " - (char-to-string LaTeX-default-verb-delimiter) "): ")))) - (when (<= del ?\ ) - (setq del LaTeX-default-verb-delimiter)) - (if (TeX-active-mark) - (progn - (insert del) - (goto-char (mark)) - ;; If the delimiter was an opening brace, close it with a - ;; brace, otherwise use the delimiter again - (insert (if (= del ?\{) - ?\} - del))) - ;; Same thing again - (insert del (read-from-minibuffer - (TeX-argument-prompt optional prompt "Text")) - (if (= del ?\{) - ?\} - del))) - ;; Do not set `LaTeX-default-verb-delimiter' if the user input was - ;; an opening brace. This would give funny results for the next - ;; "C-c C-m \verb RET" - (unless (= del ?\{) - (setq LaTeX-default-verb-delimiter del)))) - -(defun TeX-arg-pair (_optional first second) - "Insert a pair of number, prompted by FIRST and SECOND. - -The numbers are surounded by parenthesizes and separated with a -comma. The compatibility argument OPTIONAL is ignored." - (insert "(" (TeX-read-string (concat first ": ")) "," - (TeX-read-string (concat second ": ")) ")")) - -(defun TeX-arg-size (optional) - "Insert width and height as a pair. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one." - (TeX-arg-pair optional "Width" "Height")) - -(defun TeX-arg-coordinate (optional) - "Insert x and y coordinate as a pair. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one." - (TeX-arg-pair optional "X position" "Y position")) - -(defconst TeX-braces-default-association - '(("[" . "]") - ("\\{" . "\\}") - ("(" . ")") - ("|" . "|") - ("\\|" . "\\|") - ("/" . "/") - ("\\backslash" . "\\backslash") - ("\\lfloor" . "\\rfloor") - ("\\lceil" . "\\rceil") - ("\\langle" . "\\rangle"))) - -(defcustom TeX-braces-user-association nil - "A list of your personal association of brace symbols. -These are used for \\left and \\right. - -The car of each entry is the brace used with \\left, -the cdr is the brace used with \\right." - :group 'LaTeX-macro - :group 'LaTeX-math - :type '(repeat (cons :format "%v" - (string :tag "Left") - (string :tag "Right")))) - -(defvar TeX-braces-association - (append TeX-braces-user-association - TeX-braces-default-association) - "A list of association of brace symbols for \\left and \\right. -The car of each entry is the brace used with \\left, -the cdr is the brace used with \\right.") - -(defcustom LaTeX-electric-left-right-brace nil - "If non-nil, insert right brace with suitable macro after typing left brace." - :group 'LaTeX-macro - :type 'boolean) - -(defvar TeX-left-right-braces - '(("[") ("]") ("\\{") ("\\}") ("(") (")") ("|") ("\\|") - ("/") ("\\backslash") ("\\lfloor") ("\\rfloor") - ("\\lceil") ("\\rceil") ("\\langle") ("\\rangle") - ("\\uparrow") ("\\Uparrow") ("\\downarrow") ("\\Downarrow") - ("\\updownarrow") ("\\Updownarrow") (".")) - "List of symbols which can follow the \\left or \\right command.") - -(defvar LaTeX-left-right-macros-association - '(("left" . "right") - ("bigl" . "bigr") ("Bigl" . "Bigr") - ("biggl" . "biggr") ("Biggl" . "Biggr")) - "Alist of macros for adjusting size of left and right braces. -The car of each entry is for left brace and the cdr is for right brace.") - -(defun TeX-arg-insert-braces (optional &optional prompt) - "Prompt for a brace for \\left and insert the corresponding \\right. -If OPTIONAL is non-nil, insert the resulting value as an optional -argument, otherwise as a mandatory one. Use PROMPT as the prompt -string." - (let (left-macro) - (save-excursion - ;; Obtain macro name such as "left", "bigl" etc. - (setq left-macro (buffer-substring-no-properties - (point) - (progn (backward-word 1) (point)))) - (backward-char) - (LaTeX-newline) - (indent-according-to-mode) - ;; Delete possibly produced blank line. - (beginning-of-line 0) - (if (looking-at "^[ \t]*$") - (progn (delete-horizontal-space) - (delete-char 1)))) - (let ((left-brace (completing-read - (TeX-argument-prompt optional prompt - "Which brace") - TeX-left-right-braces))) - (insert left-brace) - (LaTeX-newline) - (save-excursion - (if (TeX-active-mark) - (goto-char (mark))) - (LaTeX-newline) - (LaTeX-insert-corresponding-right-macro-and-brace - left-macro left-brace optional prompt) - (indent-according-to-mode)) - (indent-according-to-mode)))) - -(defvar TeX-arg-right-insert-p) ;; Defined further below. - -(defun TeX-arg-insert-right-brace-maybe (optional) - "Insert the suitable right brace macro such as \\rangle. -Insertion is done when `TeX-arg-right-insert-p' is non-nil. -If the left brace macro is preceded by \\left, \\bigl etc., -supply the corresponding macro such as \\right before the right brace macro." - ;; Nothing is done when TeX-arg-right-insert-p is nil. - (when TeX-arg-right-insert-p - (let (left-brace left-macro) - (save-excursion - ;; Obtain left brace macro name such as "\langle". - (setq left-brace (buffer-substring-no-properties - (point) - (progn (backward-word) (backward-char) - (point))) - ;; Obtain the name of preceding left macro, if any, - ;; such as "left", "bigl" etc. - left-macro (LaTeX--find-preceding-left-macro-name))) - (save-excursion - (if (TeX-active-mark) - (goto-char (mark))) - (LaTeX-insert-corresponding-right-macro-and-brace - left-macro left-brace optional))))) - -(defun LaTeX-insert-left-brace (arg) - "Insert typed left brace ARG times and possibly a correspondig right brace. -Automatic right brace insertion is done only if no prefix ARG is given and -`LaTeX-electric-left-right-brace' is non-nil. -Normally bound to keys \(, { and [." - (interactive "*P") - ;; If you change the condition for `auto-p', adjust the condition in - ;; the `delete-selection' property, just below this defun, accordingly. - (let ((auto-p (and LaTeX-electric-left-right-brace (not arg)))) - (if (and auto-p - (TeX-active-mark) - (> (point) (mark))) - (exchange-point-and-mark)) - (if auto-p - ;; Should supply corresponding right brace with possible - ;; \right-like macro. - (let ((lbrace (char-to-string last-command-event)) lmacro skip-p) - ;; Use `insert' rather than `self-insert-command' so that - ;; unexcpected side effects, e.g. `electric-pair-mode', - ;; won't mess up the following outcomes. (bug#47936) - (insert last-command-event) - (save-excursion - (backward-char) - ;; The brace "{" is exceptional in two aspects. - ;; 1. "\{" should be considered as a single brace - ;; like "(" and "[". - ;; 2. "\left{" is nonsense while "\left\{" and - ;; "\left(" are not. - (if (string= lbrace TeX-grop) - ;; If "{" follows "\", set lbrace to "\{". - (if (TeX-escaped-p) - (progn - (backward-char) - (setq lbrace (concat TeX-esc TeX-grop))) - ;; Otherwise, don't search for left macros. - (setq skip-p t))) - (unless skip-p - ;; Obtain the name of preceding left macro, if any, - ;; such as "left", "bigl" etc. - (setq lmacro (LaTeX--find-preceding-left-macro-name)))) - (let ((TeX-arg-right-insert-p t) - ;; "{" and "}" are paired temporally so that typing - ;; a single "{" should insert a pair "{}". - (TeX-braces-association - (cons (cons TeX-grop TeX-grcl) TeX-braces-association))) - (save-excursion - (if (TeX-active-mark) - (goto-char (mark))) - (LaTeX-insert-corresponding-right-macro-and-brace - lmacro lbrace)))) - ;; Don't supply right brace and just act as ordinary - ;; `self-insert-command'. - (self-insert-command (prefix-numeric-value arg))))) -;; Cater for `delete-selection-mode' (bug#36385) -;; See the header comment of delsel.el for detail. -(put #'LaTeX-insert-left-brace 'delete-selection - (lambda () - ;; Consult `delete-selection' property when - ;; `LaTeX-insert-left-brace' works just the same as - ;; `self-insert-command'. - (and (or (not LaTeX-electric-left-right-brace) - current-prefix-arg) - (let ((f (get #'self-insert-command 'delete-selection))) - ;; If `delete-selection' property of - ;; `self-insert-command' is one of the predefined - ;; special symbols, just return itself. - (if (memq f '(yank supersede kill t nil)) - ;; FIXME: if this list of special symbols is - ;; extended in future delsel.el, this discrimination - ;; will become wrong. - f - ;; Otherwise, call it as a function and return - ;; its value. - (funcall f)))))) - -(defun LaTeX-insert-corresponding-right-macro-and-brace - (lmacro lbrace &optional optional prompt) - "Insert right macro and brace correspoinding to LMACRO and LBRACE. -Left-right association is determined through -`LaTeX-left-right-macros-association' and `TeX-braces-association'. - -If brace association can't be determined or `TeX-arg-right-insert-p' -is nil, consult user which brace should be used." - ;; This function is called with LMACRO being one of the following - ;; possibilities. - ;; (1) nil, which means LBRACE is isolated. - ;; (2) null string, which means LBRACE follows right after "\" to - ;; form "\(" or "\[". - ;; (3) a string in CARs of `LaTeX-left-right-macros-association'. - (let ((rmacro (cdr (assoc lmacro LaTeX-left-right-macros-association))) - (rbrace (cdr (assoc lbrace TeX-braces-association)))) - ;; Since braces like "\(" and "\)" should be paired, RMACRO - ;; should be considered as null string in the case (2). - (if (string= lmacro "") - (setq rmacro "")) - ;; Insert right macros such as "\right", "\bigr" etc., if necessary. - ;; Even single "\" will be inserted so that "\)" or "\]" is - ;; inserted after "\(", "\[". - (if rmacro - (insert TeX-esc rmacro)) - (cond - ((and TeX-arg-right-insert-p rbrace) - (insert rbrace)) - (rmacro - (insert (completing-read - (TeX-argument-prompt - optional prompt - (format "Which brace (default %s)" - (or rbrace "."))) TeX-left-right-braces - nil nil nil nil (or rbrace "."))))))) - -(defun LaTeX--find-preceding-left-macro-name () - "Return the left macro name just before the point, if any. -If the preceding macro isn't left macros such as \\left, \\bigl etc., -return nil. -If the point is just after unescaped `TeX-esc', return the null string." - ;; \left-!- => "left" - ;; \-!- => "" - ;; \infty-!- => nil - ;; \&-!- => nil - ;; \mathrm{abc}-!- => nil - ;; {blah blah blah}-!- => nil - ;; \\-!- => nil - (let ((name (buffer-substring-no-properties - (point) - ;; This is only a helper function, so we do not - ;; preserve point by save-excursion. - (progn - ;; Assume left macro names consist of only A-Z and a-z. - (skip-chars-backward "A-Za-z") - (point))))) - (if (and (TeX-escaped-p) - (or (string= name "") - (assoc name LaTeX-left-right-macros-association))) - name))) -(define-obsolete-function-alias - 'LaTeX-find-preceeding-left-macro-name - #'LaTeX--find-preceding-left-macro-name "AUCTeX 12.2" - "Compatibility function for typo in its name.") - -(defcustom LaTeX-default-author 'user-full-name - "Initial input to `LaTeX-arg-author' prompt. -If nil, do not prompt at all." - :group 'LaTeX-macro - :type '(choice (const :tag "User name in Emacs" user-full-name) - (const :tag "Do not prompt" nil) - string)) - -(defun LaTeX-arg-author (optional &optional prompt) - "Prompt for author name. -Insert the given value as a TeX macro argument. If OPTIONAL is -non-nil, insert it as an optional argument. Use PROMPT as the -prompt string. `LaTeX-default-author' is the initial input." - (let ((author (if LaTeX-default-author - (TeX-read-string - (TeX-argument-prompt optional prompt "Author(s)") - (if (symbolp LaTeX-default-author) - (symbol-value LaTeX-default-author) - LaTeX-default-author)) - ""))) - (TeX-argument-insert author optional nil))) - -(defun TeX-read-key-val (optional key-val-alist &optional prompt) - "Prompt for keys and values in KEY-VAL-ALIST and return them. -If OPTIONAL is non-nil, indicate in the prompt that we are -reading an optional argument. KEY-VAL-ALIST is an alist. The -car of each element should be a string representing a key and the -optional cdr should be a list with strings to be used as values -for the key. KEY-VAL-ALIST can be a symbol or a function call -returning an alist. Use PROMPT as the prompt string." - (multi-prompt-key-value - (TeX-argument-prompt optional prompt "Options (k=v)") - (cond ((and (symbolp key-val-alist) - (boundp key-val-alist)) - (symbol-value key-val-alist)) - ((and (listp key-val-alist) - (symbolp (car key-val-alist)) - (fboundp (car key-val-alist))) - (let ((head (car key-val-alist)) - (tail (cdr key-val-alist))) - (apply head tail))) - (t - key-val-alist)))) - -(defun TeX-arg-key-val (optional key-val-alist &optional prompt) - "Prompt for keys and values in KEY-VAL-ALIST. -Insert the given value as a TeX macro argument. If OPTIONAL is -non-nil, insert it as an optional argument. KEY-VAL-ALIST is an -alist. The car of each element should be a string representing a -key and the optional cdr should be a list with strings to be used -as values for the key. Use PROMPT as the prompt string." - (let ((options (TeX-read-key-val optional key-val-alist prompt))) - (TeX-argument-insert options optional))) - -(defun TeX-read-hook () - "Read a LaTeX hook and return it as a string." - (let* ((hook (completing-read - (TeX-argument-prompt nil nil "Hook") - '("cmd" - "env" - ;; From ltfilehook-doc.pdf - "file" "include" "class" "package" - ;; From lthooks-doc.pdf - "begindocument" "enddocument" - "rmfamily" "sffamily" - "ttfamily" "normalfont" - "bfseries" "mdseries" - ;; From ltshipout-doc.pdf - "shipout" - ;; From ltpara-doc.pdf - "para"))) - (place (lambda (&optional opt pr) - (completing-read - (TeX-argument-prompt opt pr "Where") - (cond ((member hook '("env" "para")) - '("after" "before" "begin" "end")) - ((string= hook "include") - '("after" "before" "end" "excluded")) - ((string= hook "begindocument") - '("before" "end")) - ((string= hook "enddocument") - '("afterlastpage" "afteraux" "info" "end")) - ((member hook '("bfseries" "mdseries")) - '("defaults")) - ((string= hook "shipout") - '("before" "after" - "foreground" "background" - "firstpage" "lastpage")) - (t - '("after" "before")))))) - (search (lambda () - (if (eq TeX-arg-input-file-search 'ask) - (not (y-or-n-p "Find file yourself? ")) - TeX-arg-input-file-search))) - name where files) - (cond ((string= hook "cmd") - ;; cmd/<name>/<where>: <where> is one of (before|after) - (setq name (completing-read - (TeX-argument-prompt nil nil "Command") - (TeX-symbol-list))) - (setq where (funcall place))) - - ;; env/<name>/<where>: <where> is one of (before|after|begin|end) - ((string= hook "env") - (setq name (completing-read - (TeX-argument-prompt nil nil "Environment") - (LaTeX-environment-list))) - (setq where (funcall place))) - - ;; file/<file-name.xxx>/<where>: <file-name> is optional and - ;; must be with extension and <where> is one of - ;; (before|after) - ((string= hook "file") - (if (funcall search) - (progn - (unless TeX-global-input-files-with-extension - (setq TeX-global-input-files-with-extension - (prog2 - (message "Searching for files...") - (mapcar #'list - (TeX-search-files-by-type 'texinputs - 'global - t nil)) - (message "Searching for files...done")))) - (setq name - (completing-read - (TeX-argument-prompt t nil "File") - TeX-global-input-files-with-extension))) - (setq name - (file-name-nondirectory - (read-file-name - (TeX-argument-prompt t nil "File") - nil "")))) - (setq where (funcall place))) - - ;; include/<file-name>/<where>: <file-name> is optional and - ;; <where> is one of (before|after|end|excluded) - ((string= hook "include") - (if (funcall search) - (progn - (setq files - (prog2 - (message "Searching for files...") - ;; \include looks for files with TeX content, - ;; so limit the search: - (let* ((TeX-file-extensions '("tex" "ltx"))) - (TeX-search-files-by-type 'texinputs 'local t t)) - (message "Searching for files...done"))) - (setq name (completing-read - (TeX-argument-prompt t nil "File") - files))) - (setq name - (file-name-base - (read-file-name - (TeX-argument-prompt t nil "File") - nil "")))) - (setq where (funcall place))) - - ;; class/<doc-class>/<where>: <doc-class> is optional and - ;; <where> is one of (before|after) - ((string= hook "class") - (if (funcall search) - (progn - (unless LaTeX-global-class-files - (setq LaTeX-global-class-files - (prog2 - (message "Searching for LaTeX classes...") - (let* ((TeX-file-extensions '("cls"))) - (mapcar #'list - (TeX-search-files-by-type 'texinputs - 'global - t t))) - (message "Searching for LaTeX classes...done")))) - (setq name (completing-read - (TeX-argument-prompt t nil "Document class") - LaTeX-global-class-files))) - (setq name - (file-name-base - (read-file-name - (TeX-argument-prompt t nil "Document class") - nil "")))) - (setq where (funcall place))) - - ;; package/<pack-name>/<where>: <pack-name> is optional and - ;; <where> is one of (before|after) - ((string= hook "package") - (if (funcall search) - (progn - (unless LaTeX-global-package-files - (setq LaTeX-global-package-files - (prog2 - (message "Searching for LaTeX packages...") - (let* ((TeX-file-extensions '("sty"))) - (mapcar #'list - (TeX-search-files-by-type 'texinputs - 'global - t t))) - (message "Searching for LaTeX packages...done")))) - (setq name (completing-read - (TeX-argument-prompt t nil "Package") - LaTeX-global-package-files))) - (setq name (file-name-base - (read-file-name - (TeX-argument-prompt t nil "Package") - nil "")))) - (setq where (funcall place))) - - ;; begindocument/<where>: <where> is empty or one of - ;; (before|end) - ((string= hook "begindocument") - (setq where (funcall place t))) - - ;; enddocument/<where>: <where> is empty or one of - ;; (afterlastpage|afteraux|info|end) - ((string= hook "enddocument") - (setq where (funcall place t))) - - ;; bfseries|mdseries/<where>: <where> is empty or defaults - ((member hook '("bfseries" "mdseries")) - (setq where (funcall place t))) - - ;; shipout/<where>: <where> is one of - ;; (before|after|foreground|background|firstpage|lastpage) - ((string= hook "shipout") - (setq where (funcall place))) - - ;; Other hooks or user specific input, do nothing: - (t nil)) - - ;; Process the input: Concat the given parts and return it - (concat hook - (when (and name (not (string= name ""))) - (concat "/" name)) - (when (and where (not (string= where ""))) - (concat "/" where))))) - -(defun TeX-arg-hook (optional) - "Prompt for a LaTeX hook. -Insert the given hook as a TeX macro argument. If OPTIONAL is -non-nil, insert it as an optional argument." - (TeX-argument-insert (TeX-read-hook) optional)) - -;;; Verbatim constructs - -(defcustom LaTeX-verbatim-macros-with-delims - '("verb" "verb*") - "Macros for inline verbatim with arguments in delimiters, like \\foo|...|. - -Programs should not use this variable directly but the function -`LaTeX-verbatim-macros-with-delims' which returns a value -including buffer-local keyword additions via -`LaTeX-verbatim-macros-with-delims-local' as well." - :group 'LaTeX-macro - :type '(repeat (string))) - -(defvar LaTeX-verbatim-macros-with-delims-local nil - "Buffer-local variable for inline verbatim with args in delimiters. - -Style files should add constructs to this variable and not to -`LaTeX-verbatim-macros-with-delims'. - -Programs should not use this variable directly but the function -`LaTeX-verbatim-macros-with-delims' which returns a value -including values of the variable -`LaTeX-verbatim-macros-with-delims' as well.") -(make-variable-buffer-local 'LaTeX-verbatim-macros-with-delims-local) -(put 'LaTeX-verbatim-macros-with-delims-local 'safe-local-variable - #'TeX--list-of-string-p) - - -(defcustom LaTeX-verbatim-macros-with-braces nil - "Macros for inline verbatim with arguments in braces, like \\foo{...}. - -Programs should not use this variable directly but the function -`LaTeX-verbatim-macros-with-braces' which returns a value -including buffer-local keyword additions via -`LaTeX-verbatim-macros-with-braces-local' as well." - :group 'LaTeX-macro - :type '(repeat (string))) - -(defvar LaTeX-verbatim-macros-with-braces-local nil - "Buffer-local variable for inline verbatim with args in braces. - -Style files should add constructs to this variable and not to -`LaTeX-verbatim-macros-with-braces'. - -Programs should not use this variable directly but the function -`LaTeX-verbatim-macros-with-braces' which returns a value -including values of the variable -`LaTeX-verbatim-macros-with-braces' as well.") -(make-variable-buffer-local 'LaTeX-verbatim-macros-with-braces-local) -(put 'LaTeX-verbatim-macros-with-braces-local 'safe-local-variable - #'TeX--list-of-string-p) - -(defcustom LaTeX-verbatim-environments - '("verbatim" "verbatim*" "filecontents" "filecontents*") - "Verbatim environments. - -Programs should not use this variable directly but the function -`LaTeX-verbatim-environments' which returns a value including -buffer-local keyword additions via -`LaTeX-verbatim-environments-local' as well." - :group 'LaTeX-environment - :type '(repeat (string))) - -(defvar LaTeX-verbatim-environments-local nil - "Buffer-local variable for verbatim environments. - -Style files should add constructs to this variable and not to -`LaTeX-verbatim-environments'. - -Programs should not use this variable directly but the function -`LaTeX-verbatim-environments' which returns a value including -values of the variable `LaTeX-verbatim-environments' as well.") -(make-variable-buffer-local 'LaTeX-verbatim-environments-local) -(put 'LaTeX-verbatim-environments-local 'safe-local-variable - #'TeX--list-of-string-p) - -(defun LaTeX-verbatim-macros-with-delims () - "Return list of verbatim macros with delimiters." - (append LaTeX-verbatim-macros-with-delims - LaTeX-verbatim-macros-with-delims-local)) - -(defun LaTeX-verbatim-macros-with-braces () - "Return list of verbatim macros with braces." - (append LaTeX-verbatim-macros-with-braces - LaTeX-verbatim-macros-with-braces-local)) - -(defun LaTeX-verbatim-environments () - "Return list of verbatim environments." - (append LaTeX-verbatim-environments - LaTeX-verbatim-environments-local)) - -(defun LaTeX-verbatim-macro-boundaries () - "Return boundaries of verbatim macro. -Boundaries are returned as a cons cell where the car is the macro -start and the cdr the macro end. - -Only macros which enclose their arguments with special -non-parenthetical delimiters, like \\verb+foo+, are recognized." - (save-excursion - (let ((orig (point)) - (verbatim-regexp (regexp-opt (LaTeX-verbatim-macros-with-delims) t))) - ;; Search backwards for the macro start, unless we are facing one - (unless (looking-at (concat (regexp-quote TeX-esc) verbatim-regexp)) - (catch 'found - (while (progn - (skip-chars-backward (concat "^\n" (regexp-quote TeX-esc)) - (line-beginning-position)) - (when (looking-at verbatim-regexp) (throw 'found nil)) - (or (bobp) (forward-char -1)) - (/= (point) (line-beginning-position)))))) - ;; Search forward for the macro end, unless we failed to find a start - (unless (bolp) - (let* ((beg (1- (point))) - (macro-end (match-end 0)) - ;; XXX: Here we assume we are dealing with \verb which - ;; expects the delimiter right behind the command. - ;; However, \lstinline can also cope with whitespace as - ;; well as an optional argument after the command. - (delimiter (buffer-substring-no-properties - macro-end (1+ macro-end)))) - ;; Heuristic: If an opening brace is encountered, search for - ;; both the opening and the closing brace as an end marker. - ;; Like that the function should work for \verb|...| as well - ;; as for \url{...}. - (when (string= delimiter TeX-grop) - (setq delimiter (concat delimiter TeX-grcl))) - (goto-char (1+ macro-end)) - (skip-chars-forward (concat "^" delimiter)) - (when (<= orig (point)) - (cons beg (1+ (point))))))))) - -(defun LaTeX-current-verbatim-macro () - "Return name of verbatim macro containing point, nil if none is present." - (let ((macro-boundaries (LaTeX-verbatim-macro-boundaries))) - (when macro-boundaries - (save-excursion - (goto-char (car macro-boundaries)) - (forward-char (length TeX-esc)) - (buffer-substring-no-properties - (point) (progn (skip-chars-forward "@A-Za-z*") (point))))))) - -(defun LaTeX-verbatim-p (&optional pos) - "Return non-nil if position POS is in a verbatim-like construct." - (when pos (goto-char pos)) - (save-match-data - (or (when (fboundp 'font-latex-faces-present-p) - (font-latex-faces-present-p 'font-latex-verbatim-face)) - (member (LaTeX-current-verbatim-macro) - (LaTeX-verbatim-macros-with-delims)) - (member (TeX-current-macro) (LaTeX-verbatim-macros-with-braces)) - (member (LaTeX-current-environment) (LaTeX-verbatim-environments))))) - - -;;; Formatting - -(defcustom LaTeX-syntactic-comments t - "If non-nil comments will be handled according to LaTeX syntax. -This variable influences, among others, the behavior of -indentation and filling which will take LaTeX syntax into -consideration just as is in the non-commented source code." - :type 'boolean - :group 'LaTeX) - - -;;; Indentation - -;; We are distinguishing two different types of comments: -;; -;; 1) Comments starting in column one (line comments) -;; -;; 2) Comments starting after column one with only whitespace -;; preceding it. -;; -;; (There is actually a third type: Comments preceded not only by -;; whitespace but by some code as well; so-called code comments. But -;; they are not relevant for the following explanations.) -;; -;; Additionally we are distinguishing two different types of -;; indentation: -;; -;; a) Outer indentation: Indentation before the comment character(s). -;; -;; b) Inner indentation: Indentation after the comment character(s) -;; (taking into account possible comment padding). -;; -;; Comments can be filled syntax-aware or not. -;; -;; In `doctex-mode' line comments should always be indented -;; syntax-aware and the comment character has to be anchored at the -;; first column (unless the appear in a macrocode environment). Other -;; comments not in the documentation parts always start after the -;; first column and can be indented syntax-aware or not. If they are -;; indented syntax-aware both the indentation before and after the -;; comment character(s) have to be checked and adjusted. Indentation -;; should not move the comment character(s) to the first column. With -;; `LaTeX-syntactic-comments' disabled, line comments should still be -;; indented syntax-aware. -;; -;; In `latex-mode' comments starting in different columns don't have -;; to be handled differently. They don't have to be anchored in -;; column one. That means that in any case indentation before and -;; after the comment characters has to be checked and adjusted. - -(defgroup LaTeX-indentation nil - "Indentation of LaTeX code in AUCTeX" - :group 'LaTeX - :group 'TeX-indentation) - -(defcustom LaTeX-indent-level 2 - "Indentation of begin-end blocks in LaTeX." - :group 'LaTeX-indentation - :type 'integer) - -(defcustom LaTeX-item-indent (- LaTeX-indent-level) - "Extra indentation for lines beginning with an item." - :group 'LaTeX-indentation - :type 'integer) - -(defcustom LaTeX-item-regexp "\\(bib\\)?item\\b" - "Regular expression matching macros considered items." - :group 'LaTeX-indentation - :type 'regexp) - -(defcustom LaTeX-indent-environment-list - '(("verbatim" current-indentation) - ("verbatim*" current-indentation) - ("filecontents" current-indentation) - ("filecontents*" current-indentation) - ("tabular" LaTeX-indent-tabular) - ("tabular*" LaTeX-indent-tabular) - ("array" LaTeX-indent-tabular) - ("eqnarray" LaTeX-indent-tabular) - ("eqnarray*" LaTeX-indent-tabular) - ;; envs of amsmath.sty - ("align" LaTeX-indent-tabular) - ("align*" LaTeX-indent-tabular) - ("aligned" LaTeX-indent-tabular) - ("alignat" LaTeX-indent-tabular) - ("alignat*" LaTeX-indent-tabular) - ("alignedat" LaTeX-indent-tabular) - ("xalignat" LaTeX-indent-tabular) - ("xalignat*" LaTeX-indent-tabular) - ("xxalignat" LaTeX-indent-tabular) - ("flalign" LaTeX-indent-tabular) - ("flalign*" LaTeX-indent-tabular) - ("split" LaTeX-indent-tabular) - ("matrix" LaTeX-indent-tabular) - ("pmatrix" LaTeX-indent-tabular) - ("bmatrix" LaTeX-indent-tabular) - ("Bmatrix" LaTeX-indent-tabular) - ("vmatrix" LaTeX-indent-tabular) - ("Vmatrix" LaTeX-indent-tabular) - ("smallmatrix" LaTeX-indent-tabular) - ("cases" LaTeX-indent-tabular) - ;; envs of mathtools.sty - ("matrix*" LaTeX-indent-tabular) - ("pmatrix*" LaTeX-indent-tabular) - ("bmatrix*" LaTeX-indent-tabular) - ("Bmatrix*" LaTeX-indent-tabular) - ("vmatrix*" LaTeX-indent-tabular) - ("Vmatrix*" LaTeX-indent-tabular) - ("smallmatrix*" LaTeX-indent-tabular) - ("psmallmatrix" LaTeX-indent-tabular) - ("psmallmatrix*" LaTeX-indent-tabular) - ("bsmallmatrix" LaTeX-indent-tabular) - ("bsmallmatrix*" LaTeX-indent-tabular) - ("vsmallmatrix" LaTeX-indent-tabular) - ("vsmallmatrix*" LaTeX-indent-tabular) - ("Vsmallmatrix" LaTeX-indent-tabular) - ("Vsmallmatrix*" LaTeX-indent-tabular) - ("dcases" LaTeX-indent-tabular) - ("dcases*" LaTeX-indent-tabular) - ("rcases" LaTeX-indent-tabular) - ("rcases*" LaTeX-indent-tabular) - ("drcases" LaTeX-indent-tabular) - ("drcases*" LaTeX-indent-tabular) - ("cases*" LaTeX-indent-tabular) - ;; The following should have their own, smart indentation function. - ;; Some other day. - ("displaymath") - ("equation") - ("picture") - ("tabbing") - ;; envs from amsmath.sty - ("gather") ("gather*") ("gathered") - ("equation*") ("multline") ("multline*") - ;; envs from doc.sty - ("macrocode") ("macrocode*")) - "Alist of environments with special indentation. -The second element in each entry is the function to calculate the -indentation level in columns. - -Environments present in this list are not filled by filling -functions, see `LaTeX-fill-region-as-paragraph'." - :group 'LaTeX-indentation - :type '(repeat (list (string :tag "Environment") - (option function)))) - -(defcustom LaTeX-indent-environment-check t - "If non-nil, check for any special environments." - :group 'LaTeX-indentation - :type 'boolean) - -(defcustom LaTeX-document-regexp "document" - "Regexp matching environments in which the indentation starts at col 0." - :group 'LaTeX-indentation - :type 'regexp) - -(defcustom LaTeX-begin-regexp "begin\\b\\|\\[" - "Regexp matching macros considered begins." - :group 'LaTeX-indentation - :type 'regexp) - -(defcustom LaTeX-end-regexp "end\\b\\|\\]" - "Regexp matching macros considered ends." - :group 'LaTeX-indentation - :type 'regexp) - -(defcustom LaTeX-left-right-indent-level LaTeX-indent-level - "The level of indentation produced by a \\left macro." - :group 'LaTeX-indentation - :type 'integer) - -(defcustom LaTeX-indent-comment-start-regexp "%" - "Regexp matching comments ending the indent level count. -This means, we just count the LaTeX tokens \\left, \\right, \\begin, -and \\end up to the first occurence of text matching this regexp. -Thus, the default \"%\" stops counting the tokens at a comment. A -value of \"%[^>]\" would allow you to alter the indentation with -comments, for example with comment `%> \\begin'. -Lines which start with `%' are not considered at all, regardless of this -value." - :group 'LaTeX-indentation - :type 'regexp) - -(defvar docTeX-indent-inner-fixed - `((,(concat (regexp-quote TeX-esc) - "\\(begin\\|end\\)[ \t]*{macrocode\\*?}") - 4 t) - (,(concat (regexp-quote TeX-esc) - "\\(begin\\|end\\)[ \t]*{\\(macro\\|environment\\)\\*?}") - 0 nil)) - "List of items which should have a fixed inner indentation. -The items consist of three parts. The first is a regular -expression which should match the respective string. The second -is the amount of spaces to be used for indentation. The third -toggles if comment padding is relevant or not. If t padding is -part of the amount given, if nil the amount of spaces will be -inserted after potential padding.") - -(defvar-local LaTeX-indent-begin-list nil - "List of macros increasing indentation. -Each item in this list is a string with the name of the macro -without a backslash. The final regexp will be calculated by the -function `LaTeX-indent-commands-regexp-make'. A regexp for the -\\if contructs is added by the function as well. AUCTeX styles -should add their macros to this variable and then run -`LaTeX-indent-commands-regexp-make'.") - -(defvar-local LaTeX-indent-begin-exceptions-list nil - "List of macros which shouldn't increase the indentation. -Each item in this list is a string without a backslash and will -mostly start with 'if'. These macros should not increase -indentation although they start with 'if', for example the -'ifthenelse' macro provided by the ifthen package. AUCTeX styles -should add their macros to this variable and then run -`LaTeX-indent-commands-regexp-make'.") - -(defvar-local LaTeX-indent-mid-list nil - "List of macros which backindent the line where they appear. -Each item in this list is a string with the name of the macro -without a backslash. The final regexp will be calculated by the -function `LaTeX-indent-commands-regexp-make' which takes care of -\\else and \\or. AUCTeX styles should add their macros to this -variable and then run `LaTeX-indent-commands-regexp-make'.") - -(defvar-local LaTeX-indent-end-list nil - "List of macros decreasing indentation. -Each item in this list is a string with the name of the macro -without a backslash. The final regexp will be calculated by the -function `LaTeX-indent-commands-regexp-make' which takes care of -\\fi. AUCTeX styles should add their macros to this variable and -then run `LaTeX-indent-commands-regexp-make'.") - -(defvar-local LaTeX-indent-begin-regexp-local nil - "Regexp calculated from `LaTeX-indent-begin-list'. -The value is calculated and set by the function -`LaTeX-indent-commands-regexp-make' which already takes care of -\\if constructs.") - -(defvar-local LaTeX-indent-begin-regexp-exceptions-local nil - "Regexp calculated from `LaTeX-indent-begin-exceptions-list'. -The value is calculated and set by the function -`LaTeX-indent-commands-regexp-make' which already takes care of -\\ifthenelse.") - -(defvar-local LaTeX-indent-mid-regexp-local nil - "Regexp calculated from `LaTeX-indent-mid-list'. -The value is calculated and set by the function -`LaTeX-indent-commands-regexp-make' which already takes care of -\\else and \\or.") - -(defvar-local LaTeX-indent-end-regexp-local nil - "Regexp calculated from `LaTeX-indent-end-list'. -The value is calculated and set by the function -`LaTeX-indent-commands-regexp-make' which already takes care of -\\fi.") - -(defun LaTeX-indent-commands-regexp-make () - "Calculate final regexp for adjusting indentation. -This function takes the elements provided in -`LaTeX-indent-begin-list', `LaTeX-indent-begin-exceptions-list', -`LaTeX-indent-mid-list' and `LaTeX-indent-end-list' and generates -the regexp's which are stored in -`LaTeX-indent-begin-regexp-local', -`LaTeX-indent-begin-regexp-exceptions-local', -`LaTeX-indent-mid-regexp-local' and -`LaTeX-indent-end-regexp-local' accordingly. Some standard -macros are added to the regexp's. This function is called in -`LaTeX-common-initialization' to set the regexp's." - (let* (cmds - symbs - (func (lambda (in regexp out) - (setq cmds nil - symbs nil) - (dolist (elt in) - (if (string-match "[^a-zA-Z@]" elt) - (push elt symbs) - (push elt cmds))) - (set out (concat regexp - (when cmds - (concat "\\|" - (regexp-opt cmds) - "\\b")) - (when symbs - (concat "\\|" - (regexp-opt symbs)))))))) - (funcall func - LaTeX-indent-begin-list - "if[a-zA-Z@]*\\b" - 'LaTeX-indent-begin-regexp-local) - (funcall func - LaTeX-indent-mid-list - "else\\b\\|or\\b" - 'LaTeX-indent-mid-regexp-local) - (funcall func - LaTeX-indent-end-list - "fi\\b" - 'LaTeX-indent-end-regexp-local) - (funcall func - LaTeX-indent-begin-exceptions-list - "ifthenelse\\b" - 'LaTeX-indent-begin-regexp-exceptions-local))) - -(defun LaTeX-indent-line () - "Indent the line containing point, as LaTeX source. -Add `LaTeX-indent-level' indentation in each \\begin{ - \\end{ block. -Lines starting with an item is given an extra indentation of -`LaTeX-item-indent'." - (interactive) - (let* ((case-fold-search nil) - ;; Compute a fill prefix. Whitespace after the comment - ;; characters will be disregarded and replaced by - ;; `comment-padding'. - (fill-prefix - (and (TeX-in-commented-line) - (save-excursion - (beginning-of-line) - (looking-at - (concat "\\([ \t]*" TeX-comment-start-regexp "+\\)+")) - (concat (match-string 0) (TeX-comment-padding-string)))))) - (save-excursion - (cond ((and fill-prefix - (TeX-in-line-comment) - (eq major-mode 'doctex-mode)) - ;; If point is in a line comment in `doctex-mode' we only - ;; consider the inner indentation. - (let ((inner-indent (LaTeX-indent-calculate 'inner))) - (when (/= (LaTeX-current-indentation 'inner) inner-indent) - (LaTeX-indent-inner-do inner-indent)))) - ((and fill-prefix - LaTeX-syntactic-comments) - ;; In any other case of a comment we have to consider - ;; outer and inner indentation if we do syntax-aware - ;; indentation. - (let ((inner-indent (LaTeX-indent-calculate 'inner)) - (outer-indent (LaTeX-indent-calculate 'outer))) - (when (/= (LaTeX-current-indentation 'inner) inner-indent) - (LaTeX-indent-inner-do inner-indent)) - (when (/= (LaTeX-current-indentation 'outer) outer-indent) - (LaTeX-indent-outer-do outer-indent)))) - (t - ;; The default is to adapt whitespace before any - ;; non-whitespace character, i.e. to do outer - ;; indentation. - (let ((outer-indent (LaTeX-indent-calculate 'outer))) - (when (/= (LaTeX-current-indentation 'outer) outer-indent) - (LaTeX-indent-outer-do outer-indent)))))) - (when (< (current-column) (save-excursion - (LaTeX-back-to-indentation) (current-column))) - (LaTeX-back-to-indentation)))) - -(defun LaTeX-indent-inner-do (inner-indent) - ;; Small helper function for `LaTeX-indent-line' to perform - ;; indentation after a comment character. It requires that - ;; `LaTeX-indent-line' already set the appropriate variables and - ;; should not be used outside of `LaTeX-indent-line'. - (move-to-left-margin) - (TeX-re-search-forward-unescaped - (concat "\\(" TeX-comment-start-regexp "+[ \t]*\\)+") (line-end-position) t) - (delete-region (line-beginning-position) (point)) - (insert fill-prefix) - (indent-to (+ inner-indent (length fill-prefix)))) - -(defun LaTeX-indent-outer-do (outer-indent) - ;; Small helper function for `LaTeX-indent-line' to perform - ;; indentation of normal lines or before a comment character in a - ;; commented line. It requires that `LaTeX-indent-line' already set - ;; the appropriate variables and should not be used outside of - ;; `LaTeX-indent-line'. - (back-to-indentation) - (delete-region (line-beginning-position) (point)) - (indent-to outer-indent)) - -(defun LaTeX-verbatim-regexp (&optional comment) - "Calculate the verbatim env regex from `LaTeX-verbatim-environments'. -If optional argument COMMENT is non-nil, include comment env from -`LaTeX-comment-env-list'." - (regexp-opt (append (LaTeX-verbatim-environments) - (if comment LaTeX-comment-env-list)))) - -(defun LaTeX-indent-calculate (&optional force-type) - "Return the indentation of a line of LaTeX source. -FORCE-TYPE can be used to force the calculation of an inner or -outer indentation in case of a commented line. The symbols -`inner' and `outer' are recognized." - (save-excursion - (LaTeX-back-to-indentation force-type) - (let ((i 0) - (list-length (safe-length docTeX-indent-inner-fixed)) - (case-fold-search nil) - entry - found) - (cond ((save-excursion (beginning-of-line) (bobp)) 0) - ((and (eq major-mode 'doctex-mode) - fill-prefix - (TeX-in-line-comment) - (progn - (while (and (< i list-length) - (not found)) - (setq entry (nth i docTeX-indent-inner-fixed)) - (when (looking-at (nth 0 entry)) - (setq found t)) - (setq i (1+ i))) - found)) - (if (nth 2 entry) - (- (nth 1 entry) (if (integerp comment-padding) - comment-padding - (length comment-padding))) - (nth 1 entry))) - ((looking-at (concat (regexp-quote TeX-esc) - "\\(begin\\|end\\){" - (LaTeX-verbatim-regexp t) - "}")) - ;; \end{verbatim} must be flush left, otherwise an unwanted - ;; empty line appears in LaTeX's output. - 0) - ((and LaTeX-indent-environment-check - ;; Special environments. - (let ((entry (assoc (or LaTeX-current-environment - (LaTeX-current-environment)) - LaTeX-indent-environment-list))) - (and entry - (nth 1 entry) - (funcall (nth 1 entry)))))) - ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-end-regexp - "\\)")) - ;; Backindent at \end. - (- (LaTeX-indent-calculate-last force-type) LaTeX-indent-level)) - ((looking-at (concat (regexp-quote TeX-esc) "right\\b")) - ;; Backindent at \right. - (- (LaTeX-indent-calculate-last force-type) - LaTeX-left-right-indent-level)) - ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-item-regexp - "\\)")) - ;; Items. - (+ (LaTeX-indent-calculate-last force-type) LaTeX-item-indent)) - ;; Other (La)TeX programming constructs which end - ;; something, \fi for example where we backindent: - ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-indent-end-regexp-local - "\\)")) - (- (LaTeX-indent-calculate-last force-type) LaTeX-indent-level)) - ;; (La)TeX programming contructs which backindent only the - ;; current line, for example \or or \else where we backindent: - ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-indent-mid-regexp-local - "\\)")) - (- (LaTeX-indent-calculate-last force-type) LaTeX-indent-level)) - ((memq (char-after) (append - TeX-indent-close-delimiters '(?\}))) - ;; End brace in the start of the line. - (- (LaTeX-indent-calculate-last force-type) - TeX-brace-indent-level)) - (t (LaTeX-indent-calculate-last force-type)))))) - -(defun LaTeX-indent-level-count () - "Count indentation change caused by macros in the current line. -Macros contain \\left, \\right, \\begin, \\end and \\if-\\fi -constructs. A special case is \\newif where the following -\\if<foo> should not change the indentation." - (save-excursion - (save-restriction - (let ((count 0)) - (narrow-to-region (point) - (save-excursion - (re-search-forward - (concat "[^" TeX-esc "]" - "\\(" LaTeX-indent-comment-start-regexp - "\\)\\|\n\\|\\'")) - (backward-char) - (point))) - (while (search-forward TeX-esc nil t) - (cond - ((looking-at "left\\b") - (setq count (+ count LaTeX-left-right-indent-level))) - ((looking-at "right\\b") - (setq count (- count LaTeX-left-right-indent-level))) - ((looking-at LaTeX-begin-regexp) - (setq count (+ count LaTeX-indent-level))) - ((looking-at LaTeX-end-regexp) - (setq count (- count LaTeX-indent-level))) - ((looking-at "newif\\b") - (search-forward TeX-esc (line-end-position) t)) - ((and (not (looking-at LaTeX-indent-begin-regexp-exceptions-local)) - (looking-at LaTeX-indent-begin-regexp-local)) - (setq count (+ count LaTeX-indent-level))) - ((looking-at LaTeX-indent-end-regexp-local) - (setq count (- count LaTeX-indent-level))) - ((looking-at (regexp-quote TeX-esc)) - (forward-char 1)))) - count)))) - -(defun LaTeX-indent-calculate-last (&optional force-type) - "Return the correct indentation of a normal line of text. -The point is supposed to be at the beginning of the current line. -FORCE-TYPE can be used to force the calculation of an inner or -outer indentation in case of a commented line. The symbols -`inner' and `outer' are recognized." - (let (line-comment-current-flag - line-comment-last-flag - comment-current-flag - comment-last-flag) - (beginning-of-line) - (setq line-comment-current-flag (TeX-in-line-comment) - comment-current-flag (TeX-in-commented-line)) - (if comment-current-flag - (skip-chars-backward "%\n\t ") - (skip-chars-backward "\n\t ")) - (beginning-of-line) - ;; If we are called in a non-comment line, skip over comment - ;; lines. The computation of indentation should in this case - ;; rather take the last non-comment line into account. - ;; Otherwise there might arise problems with e.g. multi-line - ;; code comments. This behavior is not enabled in docTeX mode - ;; where large amounts of line comments may have to be skipped - ;; and indentation should not be influenced by unrelated code in - ;; other macrocode environments. - (while (and (not (eq major-mode 'doctex-mode)) - (not comment-current-flag) - (TeX-in-commented-line) - (not (bobp))) - (skip-chars-backward "\n\t ") - (beginning-of-line)) - (setq line-comment-last-flag (TeX-in-line-comment) - comment-last-flag (TeX-in-commented-line)) - (LaTeX-back-to-indentation force-type) - ;; Separate line comments and other stuff (normal text/code and - ;; code comments). Additionally we don't want to compute inner - ;; indentation when a commented and a non-commented line are - ;; compared. - (cond ((or (and (eq major-mode 'doctex-mode) - (or (and line-comment-current-flag - (not line-comment-last-flag)) - (and (not line-comment-current-flag) - line-comment-last-flag))) - (and force-type - (eq force-type 'inner) - (or (and comment-current-flag - (not comment-last-flag)) - (and (not comment-current-flag) - comment-last-flag)))) - 0) - ((looking-at (concat (regexp-quote TeX-esc) - "begin *{\\(" - LaTeX-document-regexp - "\\)}")) - ;; I dislike having all of the document indented... - (+ (LaTeX-current-indentation force-type) - ;; Some people have opening braces at the end of the - ;; line, e.g. in case of `\begin{letter}{%'. - (TeX-brace-count-line))) - ((and (eq major-mode 'doctex-mode) - (looking-at (concat (regexp-quote TeX-esc) - "end[ \t]*{macrocode\\*?}")) - fill-prefix - (TeX-in-line-comment)) - ;; Reset indentation to zero after a macrocode environment - ;; only when we're not still inside a describing - ;; environment like "macro" or "environment" etc. Text - ;; inside these environments after '\end{macrocode}' is - ;; indented with `LaTeX-indent-level': - (let ((outer-env (LaTeX-current-environment 2))) - (cond ((member outer-env '("macro" "environment")) - LaTeX-indent-level) - ((and (fboundp 'LaTeX-doc-NewDocElement-list) - (LaTeX-doc-NewDocElement-list) - (member outer-env - (mapcar #'cadr (LaTeX-doc-NewDocElement-list)))) - LaTeX-indent-level) - (t 0)))) - ((looking-at (concat (regexp-quote TeX-esc) - "begin *{" - ;; Don't give optional argument here - ;; because indent would be disabled - ;; inside comment env otherwise. - (LaTeX-verbatim-regexp) - "}")) - 0) - ((looking-at (concat (regexp-quote TeX-esc) - "end *{" - (LaTeX-verbatim-regexp t) - "}")) - ;; If I see an \end{verbatim} in the previous line I skip - ;; back to the preceding \begin{verbatim}. - (save-excursion - (if (re-search-backward (concat (regexp-quote TeX-esc) - "begin *{" - (LaTeX-verbatim-regexp t) - "}") 0 t) - (LaTeX-indent-calculate-last force-type) - 0))) - (t (+ (LaTeX-current-indentation force-type) - (if (not (and force-type - (eq force-type 'outer) - (TeX-in-commented-line))) - (+ (LaTeX-indent-level-count) - (TeX-brace-count-line)) - 0) - (cond ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-end-regexp - "\\)")) - LaTeX-indent-level) - ((looking-at - (concat (regexp-quote TeX-esc) "right\\b")) - LaTeX-left-right-indent-level) - ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-item-regexp - "\\)")) - (- LaTeX-item-indent)) - ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-indent-end-regexp-local - "\\)")) - LaTeX-indent-level) - ((looking-at (concat (regexp-quote TeX-esc) - "\\(" - LaTeX-indent-mid-regexp-local - "\\)")) - LaTeX-indent-level) - ((memq (char-after) (append - TeX-indent-close-delimiters - '(?\}))) - TeX-brace-indent-level) - (t 0))))))) - -(defun LaTeX-current-indentation (&optional force-type) - "Return the indentation of a line. -FORCE-TYPE can be used to force the calculation of an inner or -outer indentation in case of a commented line. The symbols -`inner' and `outer' are recognized." - (if (and fill-prefix - (or (and force-type - (eq force-type 'inner)) - (and (not force-type) - (or - ;; If `LaTeX-syntactic-comments' is not enabled, - ;; do conventional indentation - LaTeX-syntactic-comments - ;; Line comments in `doctex-mode' are always - ;; indented syntax-aware so we need their inner - ;; indentation. - (and (TeX-in-line-comment) - (eq major-mode 'doctex-mode)))))) - ;; INNER indentation - (save-excursion - (beginning-of-line) - (looking-at (concat "\\(?:[ \t]*" TeX-comment-start-regexp "+\\)+" - "\\([ \t]*\\)")) - (- (length (match-string 1)) (length (TeX-comment-padding-string)))) - ;; OUTER indentation - (current-indentation))) - -(defun LaTeX-back-to-indentation (&optional force-type) - "Move point to the first non-whitespace character on this line. -If it is commented and comments are formatted syntax-aware move -point to the first non-whitespace character after the comment -character(s), but only if `this-command' is not a newline -command, that is, `TeX-newline' or the value of -`TeX-newline-function'. The optional argument FORCE-TYPE can be -used to force point being moved to the inner or outer indentation -in case of a commented line. The symbols `inner' and `outer' are -recognized." - (if (or (and force-type - (eq force-type 'inner)) - (and (not force-type) - (or (and (TeX-in-line-comment) - (eq major-mode 'doctex-mode)) - (and (TeX-in-commented-line) - ;; Only move after the % if we're not - ;; performing a newline command (bug#47757). - (not (memq this-command - `( TeX-newline - ,TeX-newline-function))) - LaTeX-syntactic-comments)))) - (progn - (beginning-of-line) - ;; Should this be anchored at the start of the line? - (TeX-re-search-forward-unescaped - (concat "\\(?:" TeX-comment-start-regexp "+[ \t]*\\)+") - (line-end-position) t)) - (back-to-indentation))) - - -;;; Filling - -;; The default value should try not to break formulae across lines (this is -;; useful for preview-latex) and give a meaningful filling. -(defcustom LaTeX-fill-break-at-separators '(\\\( \\\[) - "List of separators before or after which respectively a line -break will be inserted if they do not fit into one line." - :group 'LaTeX - :type '(set :tag "Contents" - (const :tag "Opening Brace" \{) - (const :tag "Closing Brace" \}) - (const :tag "Opening Bracket" \[) - (const :tag "Opening Inline Math Switches" \\\() - (const :tag "Closing Inline Math Switches" \\\)) - (const :tag "Opening Display Math Switch" \\\[) - (const :tag "Closing Display Math Switch" \\\]))) - -(defcustom LaTeX-fill-break-before-code-comments t - "If non-nil, a line with some code followed by a comment will -be broken before the last non-comment word in case the comment -does not fit into the line." - :group 'LaTeX - :type 'boolean) - -(defcustom LaTeX-fill-excluded-macros nil - "List of macro names (without leading \\) whose arguments must -not be subject to filling." - :group 'LaTeX - :type '(repeat string)) - -(defvar LaTeX-nospace-between-char-regexp "\\c|" - "Regexp matching a character where no interword space is necessary. -Words formed by such characters can be broken across newlines.") - -(defvar LaTeX-fill-newline-hook nil - "Hook run after `LaTeX-fill-newline' inserted and indented a new line.") - -(defun LaTeX-fill-region-as-paragraph (from to &optional justify-flag) - "Fill region as one paragraph. -Break lines to fit `fill-column', but leave all lines ending with -\\\\ \(plus its optional argument) alone. Lines with code -comments and lines ending with `\\par' are included in filling but -act as boundaries. Prefix arg means justify too. From program, -pass args FROM, TO and JUSTIFY-FLAG. - -You can disable filling inside a specific environment by adding -it to `LaTeX-indent-environment-list', only indentation is -performed in that case." - (interactive "*r\nP") - (let ((end-marker (copy-marker to)) has-code-comment has-regexp-match) - (if (or (assoc (LaTeX-current-environment) LaTeX-indent-environment-list) - (member (TeX-current-macro) LaTeX-fill-excluded-macros) - ;; This could be generalized, if there are more cases where - ;; a special string at the start of a region to fill should - ;; inhibit filling. - (progn (save-excursion (goto-char from) - (looking-at (concat TeX-comment-start-regexp - "+[ \t]*" - "Local Variables:"))))) - ;; Filling disabled, only do indentation. - (indent-region from to nil) - ;; XXX: This `save-restriction' is a leftover of older codes and - ;; can now be removed. - (save-restriction - (goto-char from) - (while (< (point) end-marker) - ;; Code comments. - (catch 'found - (while (setq has-code-comment - (TeX-search-forward-comment-start end-marker)) - ;; See if there is at least one non-whitespace - ;; character before the comment starts. - (goto-char has-code-comment) - (skip-chars-backward " \t" (line-beginning-position)) - (if (not (bolp)) - ;; A real code comment. - (throw 'found t) - ;; Not a code comment. Continue the loop. - (forward-line 1) - (if (> (point) end-marker) - (goto-char end-marker))))) - - ;; Go back to the former point for the next regexp search. - (goto-char from) - - (when (setq has-regexp-match - (re-search-forward - (concat - "\\(" - ;; Lines ending with `\par'. - ;; XXX: Why exclude \n? vv - "\\(?:\\=\\|[^" TeX-esc "\n]\\)\\(?:" - (regexp-quote (concat TeX-esc TeX-esc)) - "\\)*" - (regexp-quote TeX-esc) "par[ \t]*" - ;; XXX: What's this "whitespaces in braces" ? - ;; vvvvvvvv - "\\(?:{[ \t]*}\\)?[ \t]*$" - "\\)\\|" - ;; Lines ending with `\\'. - ;; XXX: This matches a line ending with "\\\ ". - ;; Should we avoid such corner case? - (regexp-quote (concat TeX-esc TeX-esc)) - ;; XXX: Why not just "\\s-*\\*?" ? - "\\(?:\\s-*\\*\\)?" - ;; XXX: Why not "\\s-*\\(?:\\[[^]]*\\]\\)?" ? - "\\(?:\\s-*\\[[^]]*\\]\\)?" - "\\s-*$") - (or has-code-comment end-marker) t)) - ;; The regexp matched before the code comment (if any). - (setq has-code-comment nil)) - - ;; Here no need to go back to the former position because - ;; "ELSE" part of the following `if' doesn't rely on the - ;; current point. - ;; (goto-char from) - - (if (or has-code-comment has-regexp-match) - (progn - (goto-char (or has-code-comment has-regexp-match)) - (goto-char (line-end-position)) - (delete-horizontal-space) - ;; I doubt very much if we want justify - - ;; this is a line with \\ - ;; if you think otherwise - uncomment the next line - ;; (and justify-flag (justify-current-line)) - (forward-char) - ;; keep our position in a buffer - (save-excursion - ;; Code comments and lines ending with `\par' are - ;; included in filling. Lines ending with `\\' are - ;; skipped. - (if (or has-code-comment - (match-beginning 1)) - (LaTeX-fill-region-as-para-do from (point) justify-flag) - (LaTeX-fill-region-as-para-do - from (line-beginning-position 0) justify-flag) - ;; At least indent the line ending with `\\'. - (indent-according-to-mode))) - (setq from (point))) - ;; ELSE part follows - loop termination relies on a fact - ;; that (LaTeX-fill-region-as-para-do) moves point past - ;; the filled region - (LaTeX-fill-region-as-para-do from end-marker justify-flag))))) - (set-marker end-marker nil))) - -;; The content of `LaTeX-fill-region-as-para-do' was copied from the -;; function `fill-region-as-paragraph' in `fill.el' (CVS Emacs, -;; January 2004) and adapted to the needs of AUCTeX. - -(defun LaTeX-fill-region-as-para-do (from to &optional justify - nosqueeze squeeze-after) - "Fill the region defined by FROM and TO as one paragraph. -It removes any paragraph breaks in the region and extra newlines at the end, -indents and fills lines between the margins given by the -`current-left-margin' and `current-fill-column' functions. -\(In most cases, the variable `fill-column' controls the width.) -It leaves point at the beginning of the line following the paragraph. - -Normally performs justification according to the `current-justification' -function, but with a prefix arg, does full justification instead. - -From a program, optional third arg JUSTIFY can specify any type of -justification. Fourth arg NOSQUEEZE non-nil means not to make spaces -between words canonical before filling. Fifth arg SQUEEZE-AFTER, if non-nil, -means don't canonicalize spaces before that position. - -Return the `fill-prefix' used for filling. - -If `sentence-end-double-space' is non-nil, then period followed by one -space does not end a sentence, so don't break a line there." - (interactive (progn - (barf-if-buffer-read-only) - (list (region-beginning) (region-end) - (if current-prefix-arg 'full)))) - (unless (memq justify '(t nil none full center left right)) - (setq justify 'full)) - - ;; Make sure "to" is the endpoint. - (goto-char (min from to)) - (setq to (max from to)) - ;; Ignore blank lines at beginning of region. - (skip-chars-forward " \t\n") - - (let ((from-plus-indent (point)) - (oneleft nil)) - - (beginning-of-line) - (setq from (point)) - - ;; Delete all but one soft newline at end of region. - ;; And leave TO before that one. - (goto-char to) - (while (and (> (point) from) (eq ?\n (char-after (1- (point))))) - (if (and oneleft - (not (and use-hard-newlines - (get-text-property (1- (point)) 'hard)))) - (delete-char -1) - (backward-char 1) - (setq oneleft t))) - (setq to (copy-marker (point) t)) - (goto-char from-plus-indent)) - - (if (not (> to (point))) - ;; There is no paragraph, only whitespace: exit now. - (progn - (set-marker to nil) - nil) - - (or justify (setq justify (current-justification))) - - ;; Don't let Adaptive Fill mode alter the fill prefix permanently. - (let ((fill-prefix fill-prefix)) - ;; Figure out how this paragraph is indented, if desired. - (when (and adaptive-fill-mode - (or (null fill-prefix) (string= fill-prefix ""))) - (setq fill-prefix (fill-context-prefix from to)) - ;; Ignore a white-space only fill-prefix - ;; if we indent-according-to-mode. - (when (and fill-prefix fill-indent-according-to-mode - (string-match "\\`[ \t]*\\'" fill-prefix)) - (setq fill-prefix nil))) - - (goto-char from) - (beginning-of-line) - - (if (not justify) ; filling disabled: just check indentation - (progn - (goto-char from) - (while (< (point) to) - (if (and (not (eolp)) - (< (LaTeX-current-indentation) (current-left-margin))) - (fill-indent-to-left-margin)) - (forward-line 1))) - - (when use-hard-newlines - (remove-text-properties from to '(hard nil))) - ;; Make sure first line is indented (at least) to left margin... - (indent-according-to-mode) - ;; Delete the fill-prefix from every line. - (fill-delete-prefix from to fill-prefix) - - (setq from (point)) - - ;; FROM, and point, are now before the text to fill, - ;; but after any fill prefix on the first line. - - (fill-delete-newlines from to justify nosqueeze squeeze-after) - - ;; This is the actual FILLING LOOP. - (goto-char from) - (let* (linebeg - (code-comment-start (save-excursion - (LaTeX-back-to-indentation) - (TeX-search-forward-comment-start - (line-end-position)))) - (end-marker (save-excursion - (goto-char (or code-comment-start to)) - (point-marker))) - (LaTeX-current-environment (LaTeX-current-environment))) - ;; Fill until point is greater than the end point. If there - ;; is a code comment, use the code comment's start as a - ;; limit. - (while (and (< (point) (marker-position end-marker)) - (or (not code-comment-start) - (and code-comment-start - (> (- (marker-position end-marker) - (line-beginning-position)) - fill-column)))) - (setq linebeg (point)) - (move-to-column (current-fill-column)) - (if (when (< (point) (marker-position end-marker)) - ;; Find the position where we'll break the line. - (forward-char 1) ; Use an immediately following - ; space, if any. - (LaTeX-fill-move-to-break-point linebeg) - - ;; Check again to see if we got to the end of - ;; the paragraph. - (skip-chars-forward " \t") - (< (point) (marker-position end-marker))) - ;; Found a place to cut. - (progn - (LaTeX-fill-newline) - (when justify - ;; Justify the line just ended, if desired. - (save-excursion - (forward-line -1) - (justify-current-line justify nil t)))) - - (goto-char end-marker) - ;; Justify this last line, if desired. - (if justify (justify-current-line justify t t)))) - - ;; Fill a code comment if necessary. (Enable this code if - ;; you want the comment part in lines with code comments to - ;; be filled. Originally it was disabled because the - ;; indentation code indented the lines following the line - ;; with the code comment to the column of the comment - ;; starters. That means, it would have looked like this: - ;; | code code code % comment - ;; | % comment - ;; | code code code - ;; This now (2005-07-29) is not the case anymore. But as - ;; filling code comments like this would split a single - ;; paragraph into two separate ones, we still leave it - ;; disabled. I leave the code here in case it is useful for - ;; somebody. - ;; (when (and code-comment-start - ;; (> (- (line-end-position) (line-beginning-position)) - ;; fill-column)) - ;; (LaTeX-fill-code-comment justify)) - - ;; The following is an alternative strategy to minimize the - ;; occurence of overfull lines with code comments. A line - ;; will be broken before the last non-comment word if the - ;; code comment does not fit into the line. - (when (and LaTeX-fill-break-before-code-comments - code-comment-start - (> (- (line-end-position) (line-beginning-position)) - fill-column)) - (beginning-of-line) - (goto-char end-marker) - (while (not (looking-at TeX-comment-start-regexp)) (forward-char)) - (skip-chars-backward " \t") - (skip-chars-backward "^ \t\n") - (unless (or (bolp) - ;; Comment starters and whitespace. - (TeX-looking-at-backward - (concat "^\\([ \t]*" TeX-comment-start-regexp "+\\)*" - "[ \t]*") - (line-beginning-position))) - (LaTeX-fill-newline))) - (set-marker end-marker nil))) - ;; Leave point after final newline. - (goto-char to) - (unless (eobp) (forward-char 1)) - (set-marker to nil) - ;; Return the fill-prefix we used - fill-prefix))) - -(defun LaTeX-fill-move-to-break-point (linebeg) - "Move to the position where the line should be broken." - (fill-move-to-break-point linebeg) - ;; Prevent line break between 2-byte char and 1-byte char. - (when (and (or (and (not (looking-at LaTeX-nospace-between-char-regexp)) - (TeX-looking-at-backward - LaTeX-nospace-between-char-regexp 1)) - (and (not (TeX-looking-at-backward - LaTeX-nospace-between-char-regexp 1)) - (looking-at LaTeX-nospace-between-char-regexp))) - (re-search-backward - (concat LaTeX-nospace-between-char-regexp - LaTeX-nospace-between-char-regexp - LaTeX-nospace-between-char-regexp - "\\|" - ".\\ca\\s +\\ca") linebeg t)) - (if (looking-at "..\\c>") - (forward-char 1) - (forward-char 2))) - ;; Cater for Japanese Macro - (when (and (boundp 'japanese-TeX-mode) japanese-TeX-mode - (aref (char-category-set (char-after)) ?j) - (TeX-looking-at-backward (concat (regexp-quote TeX-esc) TeX-token-char "*") - (1- (- (point) linebeg))) - (not (TeX-escaped-p (match-beginning 0)))) - (goto-char (match-beginning 0))) - ;; Cater for \verb|...| (and similar) contructs which should not be - ;; broken. (FIXME: Make it work with shortvrb.sty (also loaded by - ;; doc.sty) where |...| is allowed. Arbitrary delimiters may be - ;; chosen with \MakeShortVerb{<char>}.) This could probably be - ;; handled with `fill-nobreak-predicate', but this is not available - ;; in XEmacs. - (let ((final-breakpoint (point)) - (verb-macros (regexp-opt (append (LaTeX-verbatim-macros-with-delims) - (LaTeX-verbatim-macros-with-braces))))) - (save-excursion - ;; Look for the start of a verbatim macro in the current line. - (when (re-search-backward (concat (regexp-quote TeX-esc) - "\\(?:" verb-macros "\\)\\([^a-z@*]\\)") - (line-beginning-position) t) - ;; Determine start and end of verbatim macro. - (let ((beg (point)) - (end (if (not (string-match "[ [{]" (match-string 1))) - (cdr (LaTeX-verbatim-macro-boundaries)) - (TeX-find-macro-end)))) - ;; Determine if macro end is behind fill column. - (when (and end - (> (- end (line-beginning-position)) - (current-fill-column)) - (> end final-breakpoint)) - ;; Search backwards for place to break before the macro. - (goto-char beg) - (skip-chars-backward "^ \n") - ;; Determine if point ended up at the beginning of the line. - (when (save-excursion (skip-chars-backward " \t%") (bolp)) - ;; Search forward for a place to break after the macro. - (goto-char end) - (skip-chars-forward "^ \n" (point-max))) - (setq final-breakpoint (point)))))) - (goto-char final-breakpoint)) - (when LaTeX-fill-break-at-separators - (let ((orig-breakpoint (point)) - (final-breakpoint (point)) - start-point) - (save-excursion - (beginning-of-line) - (LaTeX-back-to-indentation 'outer) - (setq start-point (point)) - ;; Find occurences of [, $, {, }, \(, \), \[, \] or $$. - (while (and (= final-breakpoint orig-breakpoint) - (TeX-re-search-forward-unescaped - (concat "[[{}]\\|\\$\\$?\\|" - (regexp-quote TeX-esc) "[][()]") - orig-breakpoint t)) - (let ((match-string (match-string 0))) - (cond - ;; [ (opening bracket) (The closing bracket should - ;; already be handled implicitely by the code for the - ;; opening brace.) - ((save-excursion - (and (memq '\[ LaTeX-fill-break-at-separators) - (string= match-string "[") - (TeX-re-search-forward-unescaped (concat "\\][ \t]*{") - (line-end-position) t) - (> (- (or (TeX-find-closing-brace) - (line-end-position)) - (line-beginning-position)) - fill-column))) - (save-excursion - (skip-chars-backward "^ \n") - (when (> (point) start-point) - (setq final-breakpoint (point))))) - ;; { (opening brace) - ((save-excursion - (and (memq '\{ LaTeX-fill-break-at-separators) - (string= match-string "{") - (> (- (save-excursion - ;; `TeX-find-closing-brace' is not enough - ;; if there is no breakpoint in form of - ;; whitespace after the brace. - (goto-char (or (TeX-find-closing-brace) - (line-end-position))) - (skip-chars-forward "^ \t\n") - (point)) - (line-beginning-position)) - fill-column))) - (save-excursion - (skip-chars-backward "^ \n") - ;; The following is a primitive and error-prone method - ;; to cope with point probably being inside square - ;; brackets. A better way would be to use functions - ;; to determine if point is inside an optional - ;; argument and to jump to the start and end brackets. - (when (save-excursion - (TeX-re-search-forward-unescaped - (concat "\\][ \t]*{") orig-breakpoint t)) - (TeX-search-backward-unescaped "[" - (line-beginning-position) t) - (skip-chars-backward "^ \n")) - (when (> (point) start-point) - (setq final-breakpoint (point))))) - ;; } (closing brace) - ((save-excursion - (and (memq '\} LaTeX-fill-break-at-separators) - (string= match-string "}") - (save-excursion - (backward-char 2) - (not (TeX-find-opening-brace - nil (line-beginning-position)))))) - (save-excursion - (skip-chars-forward "^ \n") - (when (> (point) start-point) - (setq final-breakpoint (point))))) - ;; $ or \( or \[ or $$ (opening math) - ((save-excursion - (and (or (and (memq '\\\( LaTeX-fill-break-at-separators) - (or (and (string= match-string "$") - (texmathp)) - (string= match-string "\\("))) - (and (memq '\\\[ LaTeX-fill-break-at-separators) - (or (string= match-string "\\[") - (and (string= match-string "$$") - (texmathp))))) - (> (- (save-excursion - (TeX-search-forward-unescaped - (cond ((string= match-string "\\(") - (concat TeX-esc ")")) - ((string= match-string "$") "$") - ((string= match-string "$$") "$$") - (t (concat TeX-esc "]"))) - (point-max) t) - (skip-chars-forward "^ \n") - (point)) - (line-beginning-position)) - fill-column))) - (save-excursion - (skip-chars-backward "^ \n") - (when (> (point) start-point) - (setq final-breakpoint (point))))) - ;; $ or \) or \] or $$ (closing math) - ((save-excursion - (and (or (and (memq '\\\) LaTeX-fill-break-at-separators) - (or (and (string= match-string "$") - (not (texmathp))) - (string= match-string "\\)"))) - (and (memq '\\\] LaTeX-fill-break-at-separators) - (or (string= match-string "\\]") - (and (string= match-string "$$") - (not (texmathp)))))) - (if (member match-string '("$" "$$")) - (save-excursion - (skip-chars-backward "$") - (TeX-search-backward-unescaped - match-string (line-beginning-position) t)) - (texmathp-match-switch (line-beginning-position))))) - (save-excursion - (skip-chars-forward "^ \n") - (when (> (point) start-point) - (setq final-breakpoint (point))))))))) - (goto-char final-breakpoint)))) - -;; The content of `LaTeX-fill-newline' was copied from the function -;; `fill-newline' in `fill.el' (CVS Emacs, January 2004) and adapted -;; to the needs of AUCTeX. -(defun LaTeX-fill-newline () - "Replace whitespace here with one newline and indent the line." - (skip-chars-backward " \t") - (newline 1) - ;; Give newline the properties of the space(s) it replaces - (set-text-properties (1- (point)) (point) - (text-properties-at (point))) - (and (looking-at "\\( [ \t]*\\)\\(\\c|\\)?") - (or (aref (char-category-set (or (char-before (1- (point))) ?\000)) ?|) - (match-end 2)) - ;; When refilling later on, this newline would normally not - ;; be replaced by a space, so we need to mark it specially to - ;; re-install the space when we unfill. - (put-text-property (1- (point)) (point) 'fill-space (match-string 1))) - ;; If we don't want breaks in invisible text, don't insert - ;; an invisible newline. - (if fill-nobreak-invisible - (remove-text-properties (1- (point)) (point) - '(invisible t))) - ;; Insert the fill prefix. - (and fill-prefix (not (equal fill-prefix "")) - ;; Markers that were after the whitespace are now at point: insert - ;; before them so they don't get stuck before the prefix. - (insert-before-markers-and-inherit fill-prefix)) - (indent-according-to-mode) - (run-hooks 'LaTeX-fill-newline-hook)) - -(defun LaTeX-fill-paragraph (&optional justify) - "Like `fill-paragraph', but handle LaTeX comments. -If any of the current line is a comment, fill the comment or the -paragraph of it that point is in. Code comments, that is, comments -with uncommented code preceding them in the same line, will not -be filled unless the cursor is placed on the line with the -code comment. - -If LaTeX syntax is taken into consideration during filling -depends on the value of `LaTeX-syntactic-comments'." - (interactive "P") - (if (save-excursion - (beginning-of-line) - (looking-at (concat TeX-comment-start-regexp "*[ \t]*$"))) - ;; Don't do anything if we look at an empty line and let - ;; `fill-paragraph' think we successfully filled the paragraph. - t - (let (;; Non-nil if the current line contains a comment. - has-comment - ;; Non-nil if the current line contains code and a comment. - has-code-and-comment - code-comment-start - ;; If has-comment, the appropriate fill-prefix for the comment. - comment-fill-prefix) - - ;; Figure out what kind of comment we are looking at. - (cond - ;; A line only with potential whitespace followed by a - ;; comment on it? - ((save-excursion - (beginning-of-line) - (looking-at (concat "^[ \t]*" TeX-comment-start-regexp - "\\(" TeX-comment-start-regexp "\\|[ \t]\\)*"))) - (setq has-comment t - comment-fill-prefix (TeX-match-buffer 0))) - ;; A line with some code, followed by a comment? - ((and (setq code-comment-start (save-excursion - (beginning-of-line) - (TeX-search-forward-comment-start - (line-end-position)))) - (> (point) code-comment-start) - (not (TeX-in-commented-line)) - (save-excursion - (goto-char code-comment-start) - ;; See if there is at least one non-whitespace character - ;; before the comment starts. - (re-search-backward "[^ \t\n]" (line-beginning-position) t))) - (setq has-comment t - has-code-and-comment t))) - - (cond - ;; Code comments. - (has-code-and-comment - (save-excursion - (when (>= (- code-comment-start (line-beginning-position)) - fill-column) - ;; If start of code comment is beyond fill column, fill it as a - ;; regular paragraph before it is filled as a code comment. - (let ((end-marker (save-excursion (end-of-line) (point-marker)))) - (LaTeX-fill-region-as-paragraph (line-beginning-position) - (line-beginning-position 2) - justify) - (goto-char end-marker) - (beginning-of-line) - (set-marker end-marker nil))) - (LaTeX-fill-code-comment justify))) - ;; Syntax-aware filling: - ;; * `LaTeX-syntactic-comments' enabled: Everything. - ;; * `LaTeX-syntactic-comments' disabled: Uncommented code and - ;; line comments in `doctex-mode'. - ((or (or LaTeX-syntactic-comments - (and (not LaTeX-syntactic-comments) - (not has-comment))) - (and (eq major-mode 'doctex-mode) - (TeX-in-line-comment))) - (let ((fill-prefix comment-fill-prefix)) - (save-excursion - (let* ((end (progn (LaTeX-forward-paragraph) - (or (bolp) (newline 1)) - (and (eobp) (not (bolp)) (open-line 1)) - (point))) - (start - (progn - (LaTeX-backward-paragraph) - (while (and (looking-at - (concat "$\\|[ \t]+$\\|" - "[ \t]*" TeX-comment-start-regexp - "+[ \t]*$")) - (< (point) end)) - (forward-line)) - (point)))) - (LaTeX-fill-region-as-paragraph start end justify))))) - ;; Non-syntax-aware filling. - (t - (save-excursion - (save-restriction - (beginning-of-line) - (narrow-to-region - ;; Find the first line we should include in the region to fill. - (save-excursion - (while (and (zerop (forward-line -1)) - (looking-at (concat "^[ \t]*" - TeX-comment-start-regexp)))) - ;; We may have gone too far. Go forward again. - (or (looking-at (concat ".*" TeX-comment-start-regexp)) - (forward-line 1)) - (point)) - ;; Find the beginning of the first line past the region to fill. - (save-excursion - (while (progn (forward-line 1) - (looking-at (concat "^[ \t]*" - TeX-comment-start-regexp)))) - (point))) - ;; The definitions of `paragraph-start' and - ;; `paragraph-separate' will still make - ;; `forward-paragraph' and `backward-paragraph' stop at - ;; the respective (La)TeX commands. If these should be - ;; disregarded, the definitions would have to be changed - ;; accordingly. (Lines with only `%' characters on them - ;; can be paragraph boundaries.) - (let* ((paragraph-start - (concat paragraph-start "\\|" - "\\(" TeX-comment-start-regexp "\\|[ \t]\\)*$")) - (paragraph-separate - (concat paragraph-separate "\\|" - "\\(" TeX-comment-start-regexp "\\|[ \t]\\)*$")) - (fill-prefix comment-fill-prefix) - (end (progn (forward-paragraph) - (or (bolp) (newline 1)) - (point))) - (beg (progn (backward-paragraph) - (point)))) - (fill-region-as-paragraph - beg end - justify nil - (save-excursion - (goto-char beg) - (if (looking-at fill-prefix) - nil - (re-search-forward comment-start-skip nil t) - (point))))))))) - t))) - -(defun LaTeX-fill-code-comment (&optional justify-flag) - "Fill a line including code followed by a comment." - (let ((beg (line-beginning-position)) - fill-prefix code-comment-start) - (indent-according-to-mode) - (when (when (setq code-comment-start (save-excursion - (goto-char beg) - (TeX-search-forward-comment-start - (line-end-position)))) - (goto-char code-comment-start) - (while (not (looking-at TeX-comment-start-regexp)) (forward-char)) - ;; See if there is at least one non-whitespace character - ;; before the comment starts. - (save-excursion - (re-search-backward "[^ \t\n]" (line-beginning-position) t))) - (setq fill-prefix - (concat - (if indent-tabs-mode - (concat (make-string (/ (current-column) tab-width) ?\t) - (make-string (% (current-column) tab-width) ?\ )) - (make-string (current-column) ?\ )) - (progn - (looking-at (concat TeX-comment-start-regexp "+[ \t]*")) - (TeX-match-buffer 0)))) - (fill-region-as-paragraph beg (line-beginning-position 2) - justify-flag nil - (save-excursion - (goto-char beg) - (if (looking-at fill-prefix) - nil - (re-search-forward comment-start-skip nil t) - (point))))))) - -(defun LaTeX-fill-region (from to &optional justify what) - "Fill and indent the text in region from FROM to TO as LaTeX text. -Prefix arg (non-nil third arg JUSTIFY, if called from program) -means justify as well. Fourth arg WHAT is a word to be displayed when -formatting." - (interactive "*r\nP") - (save-excursion - (let ((to (set-marker (make-marker) to)) - (next-par (make-marker))) - (goto-char from) - (beginning-of-line) - (setq from (point)) - (catch 'end-of-buffer - (while (and (< (point) to)) - (message "Formatting%s...%d%%" - (or what "") - (/ (* 100 (- (point) from)) (- to from))) - (save-excursion (LaTeX-fill-paragraph justify)) - (if (marker-position next-par) - (goto-char (marker-position next-par)) - (LaTeX-forward-paragraph)) - (when (eobp) (throw 'end-of-buffer t)) - (LaTeX-forward-paragraph) - (set-marker next-par (point)) - (LaTeX-backward-paragraph) - (while (and (not (eobp)) - (looking-at - (concat "^\\($\\|[ \t]+$\\|[ \t]*" - TeX-comment-start-regexp "+[ \t]*$\\)"))) - (forward-line 1)))) - (set-marker next-par nil) - (set-marker to nil))) - (message "Formatting%s...done" (or what ""))) - -(defun LaTeX-find-matching-end () - "Move point to the \\end of the current environment. - -If function is called inside a comment and -`LaTeX-syntactic-comments' is enabled, try to find the -environment in commented regions with the same comment prefix." - (interactive) - (let* ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b")) - (level 1) - (in-comment (TeX-in-commented-line)) - (comment-prefix (and in-comment (TeX-comment-prefix))) - (case-fold-search nil)) - (let ((pt (point))) - (skip-chars-backward (concat "a-zA-Z \t" (regexp-quote TeX-grop))) - (unless (bolp) - (backward-char 1) - (if (and (looking-at regexp) - (char-equal (char-after (1+ (match-beginning 0))) ?e)) - (setq level 0) - (goto-char pt)))) - (while (and (> level 0) (re-search-forward regexp nil t)) - (when (or (and LaTeX-syntactic-comments - (eq in-comment (TeX-in-commented-line)) - ;; If we are in a commented line, check if the - ;; prefix matches the one we started out with. - (or (not in-comment) - (string= comment-prefix (TeX-comment-prefix)))) - (and (not LaTeX-syntactic-comments) - (not (TeX-in-commented-line)))) - (if (= (char-after (1+ (match-beginning 0))) ?b) ;;begin - (setq level (1+ level)) - (setq level (1- level))))) - (if (= level 0) - (re-search-forward - (concat TeX-grop (LaTeX-environment-name-regexp) TeX-grcl)) - (error "Can't locate end of current environment")))) - -(defun LaTeX-find-matching-begin () - "Move point to the \\begin of the current environment. - -If function is called inside a comment and -`LaTeX-syntactic-comments' is enabled, try to find the -environment in commented regions with the same comment prefix." - (interactive) - (let* ((regexp (concat (regexp-quote TeX-esc) "\\(begin\\|end\\)\\b")) - (level 1) - (in-comment (TeX-in-commented-line)) - (comment-prefix (and in-comment (TeX-comment-prefix))) - (case-fold-search nil)) - (skip-chars-backward (concat "a-zA-Z \t" (regexp-quote TeX-grop))) - (unless (bolp) - (backward-char 1) - (and (looking-at regexp) - (char-equal (char-after (1+ (match-beginning 0))) ?b) - (setq level 0))) - (while (and (> level 0) (re-search-backward regexp nil t)) - (when (or (and LaTeX-syntactic-comments - (eq in-comment (TeX-in-commented-line)) - ;; If we are in a commented line, check if the - ;; prefix matches the one we started out with. - (or (not in-comment) - (string= comment-prefix (TeX-comment-prefix)))) - (and (not LaTeX-syntactic-comments) - (not (TeX-in-commented-line)))) - (if (= (char-after (1+ (match-beginning 0))) ?e) ;;end - (setq level (1+ level)) - (setq level (1- level))))) - (or (= level 0) - (error "Can't locate beginning of current environment")))) - -(defun LaTeX-mark-environment (&optional count) - "Set mark to end of current environment and point to the matching begin. -If prefix argument COUNT is given, mark the respective number of -enclosing environments. The command will not work properly if -there are unbalanced begin-end pairs in comments and verbatim -environments." - (interactive "p") - (setq count (if count (abs count) 1)) - (let ((cur (point)) beg end) - ;; Only change point and mark after beginning and end were found. - ;; Point should not end up in the middle of nowhere if the search fails. - (save-excursion - (dotimes (_ count) (LaTeX-find-matching-end)) - (setq end (line-beginning-position 2)) - (goto-char cur) - (dotimes (_ count) (LaTeX-find-matching-begin)) - (setq beg (point))) - (push-mark end) - (goto-char beg) - (TeX-activate-region))) - -(defun LaTeX-fill-environment (justify) - "Fill and indent current environment as LaTeX text." - (interactive "*P") - (save-excursion - (LaTeX-mark-environment) - (re-search-forward "{\\([^}]+\\)}") - (LaTeX-fill-region (region-beginning) (region-end) justify - (concat " environment " (TeX-match-buffer 1))))) - -(defun LaTeX-fill-section (justify) - "Fill and indent current logical section as LaTeX text." - (interactive "*P") - (save-excursion - (LaTeX-mark-section) - (re-search-forward "{\\([^}]+\\)}") - (LaTeX-fill-region (region-beginning) (region-end) justify - (concat " section " (TeX-match-buffer 1))))) - -(defun LaTeX-mark-section (&optional no-subsections) - "Set mark at end of current logical section, and point at top. -If optional argument NO-SUBSECTIONS is non-nil, mark only the -region from the current section start to the next sectioning -command. Thereby subsections are not being marked. - -If the function `outline-mark-subtree' is not available, -`LaTeX-mark-section' always behaves like this regardless of the -value of NO-SUBSECTIONS." - (interactive "P") - (if (or no-subsections - (not (fboundp 'outline-mark-subtree))) - (progn - (re-search-forward (concat "\\(" (LaTeX-outline-regexp) - "\\|\\'\\)")) - (beginning-of-line) - (push-mark (point) nil t) - (re-search-backward (concat "\\(" (LaTeX-outline-regexp) - "\\|\\`\\)"))) - (outline-mark-subtree) - (when (and transient-mark-mode - (not mark-active)) - (setq mark-active t) - (run-hooks 'activate-mark-hook))) - (TeX-activate-region)) - -(defun LaTeX-fill-buffer (justify) - "Fill and indent current buffer as LaTeX text." - (interactive "*P") - (save-excursion - (LaTeX-fill-region - (point-min) - (point-max) - justify - (concat " buffer " (buffer-name))))) - - -;;; Navigation - -(defvar LaTeX-paragraph-commands-internal - '("[" "]" ; display math - "appendix" "begin" "caption" "chapter" "end" "include" "includeonly" - "label" "maketitle" "newblock" "noindent" "par" "paragraph" "part" - "section" "subsection" "subsubsection" "tableofcontents" - "newpage" "clearpage") - "Internal list of LaTeX macros that should have their own line.") - -(defvar LaTeX-paragraph-commands) - -(defun LaTeX-paragraph-commands-regexp-make () - "Return a regular expression matching defined paragraph commands. -Regexp part containing TeX control words is postfixed with `\\b' -to avoid ambiguities (for example, \\par vs. \\parencite)." - (let (cmds symbs) - (dolist (mac (append LaTeX-paragraph-commands - LaTeX-paragraph-commands-internal)) - (if (string-match "[^a-zA-Z]" mac) - (push mac symbs) - (push mac cmds))) - (concat (regexp-quote TeX-esc) "\\(?:" - (regexp-opt cmds "\\(?:") - "\\b" - "\\|" - (regexp-opt symbs) - "\\)"))) - -(defvar LaTeX-paragraph-commands-regexp) - -(defcustom LaTeX-paragraph-commands nil - "List of LaTeX macros that should have their own line. -The list should contain macro names without the leading backslash." - :group 'LaTeX-macro - :type '(repeat (string)) - :set (lambda (symbol value) - (set-default symbol value) - (setq LaTeX-paragraph-commands-regexp - (LaTeX-paragraph-commands-regexp-make)))) - -(defvar LaTeX-paragraph-commands-regexp (LaTeX-paragraph-commands-regexp-make) - "Regular expression matching LaTeX macros that should have their own line.") - -(defun LaTeX-set-paragraph-start () - "Set `paragraph-start'." - (setq paragraph-start - (concat - "[ \t]*%*[ \t]*\\(" - LaTeX-paragraph-commands-regexp "\\|" - (regexp-quote TeX-esc) "\\(" LaTeX-item-regexp "\\)\\|" - "\\$\\$\\|" ; Plain TeX display math (Some people actually use this - ; with LaTeX. Yuck.) - "$\\)"))) - -(defun LaTeX-paragraph-commands-add-locally (commands) - "Make COMMANDS be recognized as paragraph commands. -COMMANDS can be a single string or a list of strings which will -be added to `LaTeX-paragraph-commands-internal'. Additionally -`LaTeX-paragraph-commands-regexp' will be updated and both -variables will be made buffer-local. This is mainly a -convenience function which can be used in style files." - (make-local-variable 'LaTeX-paragraph-commands-internal) - (make-local-variable 'LaTeX-paragraph-commands-regexp) - (unless (listp commands) (setq commands (list commands))) - (dolist (elt commands) - (add-to-list 'LaTeX-paragraph-commands-internal elt)) - (setq LaTeX-paragraph-commands-regexp (LaTeX-paragraph-commands-regexp-make)) - (LaTeX-set-paragraph-start)) - -(defun LaTeX-forward-paragraph (&optional count) - "Move forward to end of paragraph. -If COUNT is non-nil, do it COUNT times." - (or count (setq count 1)) - (dotimes (_ count) - (let* ((macro-start (TeX-find-macro-start)) - (paragraph-command-start - (cond - ;; Point is inside of a paragraph command. - ((and macro-start - (save-excursion - (goto-char macro-start) - (looking-at LaTeX-paragraph-commands-regexp))) - (match-beginning 0)) - ;; Point is before a paragraph command in the same line. - ((looking-at - (concat "[ \t]*\\(?:" TeX-comment-start-regexp - "\\(?:" TeX-comment-start-regexp "\\|[ \t]\\)*\\)?" - "\\(" LaTeX-paragraph-commands-regexp "\\)")) - (match-beginning 1)))) - macro-end) - ;; If a paragraph command is encountered there are two cases to be - ;; distinguished: - ;; 1) If the end of the paragraph command coincides (apart from - ;; potential whitespace) with the end of the line, is only - ;; followed by a comment or is directly followed by a macro, - ;; it is assumed that it should be handled separately. - ;; 2) If the end of the paragraph command is followed by other - ;; code, it is assumed that it should be included with the rest - ;; of the paragraph. - (if (and paragraph-command-start - (save-excursion - (goto-char paragraph-command-start) - (setq macro-end (goto-char (TeX-find-macro-end))) - (looking-at (concat (regexp-quote TeX-esc) "[@A-Za-z]+\\|" - "[ \t]*\\($\\|" - TeX-comment-start-regexp "\\)")))) - (progn - (goto-char macro-end) - ;; If the paragraph command is followed directly by - ;; another macro, regard the latter as part of the - ;; paragraph command's paragraph. - (when (looking-at (concat (regexp-quote TeX-esc) "[@A-Za-z]+")) - (goto-char (TeX-find-macro-end))) - (forward-line)) - (let (limit) - (goto-char (min (save-excursion - (forward-paragraph) - (setq limit (point))) - (save-excursion - (TeX-forward-comment-skip 1 limit) - (point))))))))) - -(defun LaTeX-backward-paragraph (&optional count) - "Move backward to beginning of paragraph. -If COUNT is non-nil, do it COUNT times." - (or count (setq count 1)) - (dotimes (_ count) - (let* ((macro-start (TeX-find-macro-start))) - (if (and macro-start - ;; Point really has to be inside of the macro, not before it. - (not (= macro-start (point))) - (save-excursion - (goto-char macro-start) - (looking-at LaTeX-paragraph-commands-regexp))) - ;; Point is inside of a paragraph command. - (progn - (goto-char macro-start) - (beginning-of-line)) - (let (limit - (start (line-beginning-position))) - (goto-char - (max (save-excursion - (backward-paragraph) - (setq limit (point))) - ;; Search for possible transitions from commented to - ;; uncommented regions and vice versa. - (save-excursion - (TeX-backward-comment-skip 1 limit) - (point)) - ;; Search for paragraph commands. - (save-excursion - (let ((end-point 0) macro-bol) - (when (setq macro-bol - (re-search-backward - (format "^[ \t]*%s*[ \t]*\\(%s\\)" - TeX-comment-start-regexp - LaTeX-paragraph-commands-regexp) - limit t)) - (if (and (string= (match-string 1) "\\begin") - (progn - (goto-char (match-end 1)) - (skip-chars-forward "{ \t") - (member (buffer-substring-no-properties - (point) (progn (skip-chars-forward - "A-Za-z*") (point))) - LaTeX-verbatim-environments))) - ;; If inside a verbatim environment, just - ;; use the next line. In such environments - ;; `TeX-find-macro-end' could otherwise - ;; think brackets or braces belong to the - ;; \begin macro. - (setq end-point (line-beginning-position 2)) - ;; Jump to the macro end otherwise. - (goto-char (match-beginning 1)) - (goto-char (TeX-find-macro-end)) - ;; For an explanation of this distinction see - ;; `LaTeX-forward-paragraph'. - (if (looking-at (concat (regexp-quote TeX-esc) - "[@A-Za-z]+\\|[ \t]*\\($\\|" - TeX-comment-start-regexp "\\)")) - (progn - (when (looking-at (regexp-quote TeX-esc)) - (goto-char (TeX-find-macro-end))) - (forward-line 1) - (when (< (point) start) - (setq end-point (point)))) - (setq end-point macro-bol)))) - end-point))))))))) - -(defun LaTeX-search-forward-comment-start (&optional limit) - "Search forward for a comment start from current position till LIMIT. -If LIMIT is omitted, search till the end of the buffer. - -This function makes sure that any comment starters found inside -of verbatim constructs are not considered." - (setq limit (or limit (point-max))) - (save-excursion - (let (start) - (catch 'found - (while (progn - (when (and (TeX-re-search-forward-unescaped - TeX-comment-start-regexp limit 'move) - (not (LaTeX-verbatim-p))) - (setq start (match-beginning 0)) - (throw 'found t)) - (< (point) limit)))) - start))) - - -;;; Math Minor Mode - -(defvar LaTeX-math-mode-map) - -(defgroup LaTeX-math nil - "Mathematics in AUCTeX." - :group 'LaTeX-macro) - -(defvar LaTeX-math-keymap (make-sparse-keymap) - "Keymap used for `LaTeX-math-mode' commands.") - -(defcustom LaTeX-math-abbrev-prefix "`" - "Prefix key for use in `LaTeX-math-mode'. -This has to be a string representing a key sequence in a format -understood by the `kbd' macro. This corresponds to the syntax -usually used in the Emacs and Elisp manuals. - -Setting this variable directly does not take effect; -use \\[customize]." - :group 'LaTeX-math - :initialize #'custom-initialize-default - :set (lambda (symbol value) - (define-key LaTeX-math-mode-map (LaTeX-math-abbrev-prefix) t) - (set-default symbol value) - (define-key LaTeX-math-mode-map - (LaTeX-math-abbrev-prefix) LaTeX-math-keymap)) - :type '(string :tag "Key sequence")) - -(defun LaTeX-math-abbrev-prefix () - "Make a key definition from the variable `LaTeX-math-abbrev-prefix'." - (if (stringp LaTeX-math-abbrev-prefix) - (read-kbd-macro LaTeX-math-abbrev-prefix) - LaTeX-math-abbrev-prefix)) - -(defvar LaTeX-math-menu - '("Math" - ("Greek Uppercase") ("Greek Lowercase") ("Binary Op") ("Relational") - ("Arrows") ("Punctuation") ("Misc Symbol") ("Var Symbol") ("Log-like") - ("Delimiters") ("Constructs") ("Accents") ("AMS")) - "Menu containing LaTeX math commands. -The menu entries will be generated dynamically, but you can specify -the sequence by initializing this variable.") - -(defconst LaTeX-math-default - '((?a "alpha" "Greek Lowercase" 945) ;; #X03B1 - (?b "beta" "Greek Lowercase" 946) ;; #X03B2 - (?g "gamma" "Greek Lowercase" 947) ;; #X03B3 - (?d "delta" "Greek Lowercase" 948) ;; #X03B4 - (?e "epsilon" "Greek Lowercase" 1013) ;; #X03F5 - (?z "zeta" "Greek Lowercase" 950) ;; #X03B6 - (?h "eta" "Greek Lowercase" 951) ;; #X03B7 - (?j "theta" "Greek Lowercase" 952) ;; #X03B8 - (nil "iota" "Greek Lowercase" 953) ;; #X03B9 - (?k "kappa" "Greek Lowercase" 954) ;; #X03BA - (?l "lambda" "Greek Lowercase" 955) ;; #X03BB - (?m "mu" "Greek Lowercase" 956) ;; #X03BC - (?n "nu" "Greek Lowercase" 957) ;; #X03BD - (?x "xi" "Greek Lowercase" 958) ;; #X03BE - (?p "pi" "Greek Lowercase" 960) ;; #X03C0 - (?r "rho" "Greek Lowercase" 961) ;; #X03C1 - (?s "sigma" "Greek Lowercase" 963) ;; #X03C3 - (?t "tau" "Greek Lowercase" 964) ;; #X03C4 - (?u "upsilon" "Greek Lowercase" 965) ;; #X03C5 - (?f "phi" "Greek Lowercase" 981) ;; #X03D5 - (?q "chi" "Greek Lowercase" 967) ;; #X03C7 - (?y "psi" "Greek Lowercase" 968) ;; #X03C8 - (?w "omega" "Greek Lowercase" 969) ;; #X03C9 - ("v e" "varepsilon" "Greek Lowercase" 949) ;; #X03B5 - ("v j" "vartheta" "Greek Lowercase" 977) ;; #X03D1 - ("v p" "varpi" "Greek Lowercase" 982) ;; #X03D6 - ("v r" "varrho" "Greek Lowercase" 1009) ;; #X03F1 - ("v s" "varsigma" "Greek Lowercase" 962) ;; #X03C2 - ("v f" "varphi" "Greek Lowercase" 966) ;; #X03C6 - (?G "Gamma" "Greek Uppercase" 915) ;; #X0393 - (?D "Delta" "Greek Uppercase" 916) ;; #X0394 - (?J "Theta" "Greek Uppercase" 920) ;; #X0398 - (?L "Lambda" "Greek Uppercase" 923) ;; #X039B - (?X "Xi" "Greek Uppercase" 926) ;; #X039E - (?P "Pi" "Greek Uppercase" 928) ;; #X03A0 - (?S "Sigma" "Greek Uppercase" 931) ;; #X03A3 - (?U "Upsilon" "Greek Uppercase" 978) ;; #X03D2 - (?F "Phi" "Greek Uppercase" 934) ;; #X03A6 - (?Y "Psi" "Greek Uppercase" 936) ;; #X03A8 - (?W "Omega" "Greek Uppercase" 937) ;; #X03A9 - (?c LaTeX-math-cal "Cal-whatever") - (nil "pm" "Binary Op" 177) ;; #X00B1 - (nil "mp" "Binary Op" 8723) ;; #X2213 - (?* "times" "Binary Op" 215) ;; #X00D7 - (nil "div" "Binary Op" 247) ;; #X00F7 - (nil "ast" "Binary Op" 8727) ;; #X2217 - (nil "star" "Binary Op" 8902) ;; #X22C6 - (nil "circ" "Binary Op" 8728) ;; #X2218 - (nil "bullet" "Binary Op" 8729) ;; #X2219 - (?. "cdot" "Binary Op" 8901) ;; #X22C5 - (?- "cap" "Binary Op" 8745) ;; #X2229 - (?+ "cup" "Binary Op" 8746) ;; #X222A - (nil "uplus" "Binary Op" 8846) ;; #X228E - (nil "sqcap" "Binary Op" 8851) ;; #X2293 - (?| "vee" "Binary Op" 8744) ;; #X2228 - (?& "wedge" "Binary Op" 8743) ;; #X2227 - (?\\ "setminus" "Binary Op" 8726) ;; #X2216 - (nil "wr" "Binary Op" 8768) ;; #X2240 - (nil "diamond" "Binary Op" 8900) ;; #X22C4 - (nil "bigtriangleup" "Binary Op" 9651) ;; #X25B3 - (nil "bigtriangledown" "Binary Op" 9661) ;; #X25BD - (nil "triangleleft" "Binary Op" 9665) ;; #X25C1 - (nil "triangleright" "Binary Op" 9655) ;; #X25B7 - (nil "lhd" "Binary Op" 8882) ;; #X22B2 - (nil "rhd" "Binary Op" 8883) ;; #X22B3 - (nil "unlhd" "Binary Op" 8884) ;; #X22B4 - (nil "unrhd" "Binary Op" 8885) ;; #X22B5 - (nil "oplus" "Binary Op" 8853) ;; #X2295 - (nil "ominus" "Binary Op" 8854) ;; #X2296 - (nil "otimes" "Binary Op" 8855) ;; #X2297 - (nil "oslash" "Binary Op" 8709) ;; #X2205 - (nil "odot" "Binary Op" 8857) ;; #X2299 - (nil "bigcirc" "Binary Op" 9675) ;; #X25CB - (nil "dagger" "Binary Op" 8224) ;; #X2020 - (nil "ddagger" "Binary Op" 8225) ;; #X2021 - (nil "amalg" "Binary Op" 10815) ;; #X2A3F - (?< "leq" "Relational" 8804) ;; #X2264 - (?> "geq" "Relational" 8805) ;; #X2265 - (nil "qed" "Relational" 8718) ;; #X220E - (nil "equiv" "Relational" 8801) ;; #X2261 - (nil "models" "Relational" 8871) ;; #X22A7 - (nil "prec" "Relational" 8826) ;; #X227A - (nil "succ" "Relational" 8827) ;; #X227B - (nil "sim" "Relational" 8764) ;; #X223C - (nil "perp" "Relational" 10178) ;; #X27C2 - (nil "preceq" "Relational" 10927) ;; #X2AAF - (nil "succeq" "Relational" 10928) ;; #X2AB0 - (nil "simeq" "Relational" 8771) ;; #X2243 - (nil "mid" "Relational" 8739) ;; #X2223 - (nil "ll" "Relational" 8810) ;; #X226A - (nil "gg" "Relational" 8811) ;; #X226B - (nil "asymp" "Relational" 8781) ;; #X224D - (nil "parallel" "Relational" 8741) ;; #X2225 - (?\{ "subset" "Relational" 8834) ;; #X2282 - (?\} "supset" "Relational" 8835) ;; #X2283 - (nil "approx" "Relational" 8776) ;; #X2248 - (nil "bowtie" "Relational" 8904) ;; #X22C8 - (?\[ "subseteq" "Relational" 8838) ;; #X2286 - (?\] "supseteq" "Relational" 8839) ;; #X2287 - (nil "cong" "Relational" 8773) ;; #X2245 - (nil "Join" "Relational" 10781) ;; #X2A1D - (nil "sqsubset" "Relational" 8847) ;; #X228F - (nil "sqsupset" "Relational" 8848) ;; #X2290 - (nil "neq" "Relational" 8800) ;; #X2260 - (nil "smile" "Relational" 8995) ;; #X2323 - (nil "sqsubseteq" "Relational" 8849) ;; #X2291 - (nil "sqsupseteq" "Relational" 8850) ;; #X2292 - (nil "doteq" "Relational" 8784) ;; #X2250 - (nil "frown" "Relational" 8994) ;; #X2322 - (?i "in" "Relational" 8712) ;; #X2208 - (nil "ni" "Relational" 8715) ;; #X220B - (nil "propto" "Relational" 8733) ;; #X221D - (nil "vdash" "Relational" 8866) ;; #X22A2 - (nil "dashv" "Relational" 8867) ;; #X22A3 - (?\C-b "leftarrow" "Arrows" 8592) ;; #X2190 - (nil "Leftarrow" "Arrows" 8656) ;; #X21D0 - (?\C-f "rightarrow" "Arrows" 8594) ;; #X2192 - (nil "Rightarrow" "Arrows" 8658) ;; #X21D2 - (nil "leftrightarrow" "Arrows" 8596) ;; #X2194 - (nil "Leftrightarrow" "Arrows" 8660) ;; #X21D4 - (nil "mapsto" "Arrows" 8614) ;; #X21A6 - (nil "hookleftarrow" "Arrows" 8617) ;; #X21A9 - (nil "leftharpoonup" "Arrows" 8636) ;; #X21BC - (nil "leftharpoondown" "Arrows" 8637) ;; #X21BD - (nil "longleftarrow" "Arrows" 10229) ;; #X27F5 - (nil "Longleftarrow" "Arrows" 10232) ;; #X27F8 - (nil "longrightarrow" "Arrows" 10230) ;; #X27F6 - (nil "Longrightarrow" "Arrows" 10233) ;; #X27F9 - (nil "longleftrightarrow" "Arrows" 10231) ;; #X27F7 - (nil "Longleftrightarrow" "Arrows" 10234) ;; #X27FA - (nil "iff" "Arrows" 10234) ;; #X27FA - (nil "longmapsto" "Arrows" 10236) ;; #X27FC - (nil "hookrightarrow" "Arrows" 8618) ;; #X21AA - (nil "rightharpoonup" "Arrows" 8640) ;; #X21C0 - (nil "rightharpoondown" "Arrows" 8641) ;; #X21C1 - (?\C-p "uparrow" "Arrows" 8593) ;; #X2191 - (nil "Uparrow" "Arrows" 8657) ;; #X21D1 - (?\C-n "downarrow" "Arrows" 8595) ;; #X2193 - (nil "Downarrow" "Arrows" 8659) ;; #X21D3 - (nil "updownarrow" "Arrows" 8597) ;; #X2195 - (nil "Updownarrow" "Arrows" 8661) ;; #X21D5 - (nil "nearrow" "Arrows" 8599) ;; #X2197 - (nil "searrow" "Arrows" 8600) ;; #X2198 - (nil "swarrow" "Arrows" 8601) ;; #X2199 - (nil "nwarrow" "Arrows" 8598) ;; #X2196 - (nil "ldots" "Punctuation" 8230) ;; #X2026 - (nil "cdots" "Punctuation" 8943) ;; #X22EF - (nil "vdots" "Punctuation" 8942) ;; #X22EE - (nil "ddots" "Punctuation" 8945) ;; #X22F1 - (?: "colon" "Punctuation" 58) ;; #X003A - (?N "nabla" "Misc Symbol" 8711) ;; #X2207 - (nil "aleph" "Misc Symbol" 8501) ;; #X2135 - (nil "prime" "Misc Symbol" 8242) ;; #X2032 - (?A "forall" "Misc Symbol" 8704) ;; #X2200 - (?I "infty" "Misc Symbol" 8734) ;; #X221E - (nil "hbar" "Misc Symbol" 8463) ;; #X210F - (?0 "emptyset" "Misc Symbol" 8709) ;; #X2205 - (?E "exists" "Misc Symbol" 8707) ;; #X2203 - (nil "surd" "Misc Symbol" 8730) ;; #X221A - (nil "Box" "Misc Symbol" 9633) ;; #X25A1 - (nil "triangle" "Misc Symbol" 9651) ;; #X25B3 - (nil "Diamond" "Misc Symbol" 9671) ;; #X25C7 - (nil "imath" "Misc Symbol" 120484) ;; #X1D6A4 - (nil "jmath" "Misc Symbol" 120485) ;; #X1D6A5 - (nil "ell" "Misc Symbol" 8467) ;; #X2113 - (nil "neg" "Misc Symbol" 172) ;; #X00AC - (?/ "not" "Misc Symbol" 824) ;; #X0338 - (nil "top" "Misc Symbol" 8868) ;; #X22A4 - (nil "flat" "Misc Symbol" 9837) ;; #X266D - (nil "natural" "Misc Symbol" 9838) ;; #X266E - (nil "sharp" "Misc Symbol" 9839) ;; #X266F - (nil "wp" "Misc Symbol" 8472) ;; #X2118 - (nil "bot" "Misc Symbol" 8869) ;; #X22A5 - (nil "clubsuit" "Misc Symbol" 9827) ;; #X2663 - (nil "diamondsuit" "Misc Symbol" 9826) ;; #X2662 - (nil "heartsuit" "Misc Symbol" 9825) ;; #X2661 - (nil "spadesuit" "Misc Symbol" 9824) ;; #X2660 - (nil "mho" "Misc Symbol" 8487) ;; #X2127 - (nil "Re" "Misc Symbol" 8476) ;; #X211C - (nil "Im" "Misc Symbol" 8465) ;; #X2111 - (nil "angle" "Misc Symbol" 8736) ;; #X2220 - (nil "partial" "Misc Symbol" 8706) ;; #X2202 - (nil "sum" "Var Symbol" 8721) ;; #X2211 - (nil "prod" "Var Symbol" 8719) ;; #X220F - (nil "coprod" "Var Symbol" 8720) ;; #X2210 - (nil "int" "Var Symbol" 8747) ;; #X222B - (nil "oint" "Var Symbol" 8750) ;; #X222E - (nil "bigcap" "Var Symbol" 8898) ;; #X22C2 - (nil "bigcup" "Var Symbol" 8899) ;; #X22C3 - (nil "bigsqcup" "Var Symbol" 10758) ;; #X2A06 - (nil "bigvee" "Var Symbol" 8897) ;; #X22C1 - (nil "bigwedge" "Var Symbol" 8896) ;; #X22C0 - (nil "bigodot" "Var Symbol" 10752) ;; #X2A00 - (nil "bigotimes" "Var Symbol" 10754) ;; #X2A02 - (nil "bigoplus" "Var Symbol" 10753) ;; #X2A01 - (nil "biguplus" "Var Symbol" 10756) ;; #X2A04 - (nil "arccos" "Log-like") - (nil "arcsin" "Log-like") - (nil "arctan" "Log-like") - (nil "arg" "Log-like") - (?\C-c "cos" "Log-like") - (nil "cosh" "Log-like") - (nil "cot" "Log-like") - (nil "coth" "Log-like") - (nil "csc" "Log-like") - (nil "deg" "Log-like") - (?\C-d "det" "Log-like") - (nil "dim" "Log-like") - (?\C-e "exp" "Log-like") - (nil "gcd" "Log-like") - (nil "hom" "Log-like") - (?\C-_ "inf" "Log-like") - (nil "ker" "Log-like") - (nil "lg" "Log-like") - (?\C-l "lim" "Log-like") - (nil "liminf" "Log-like") - (nil "limsup" "Log-like") - (nil "ln" "Log-like") - (nil "log" "Log-like") - (nil "max" "Log-like") - (nil "min" "Log-like") - (nil "Pr" "Log-like") - (nil "sec" "Log-like") - (?\C-s "sin" "Log-like") - (nil "sinh" "Log-like") - (?\C-^ "sup" "Log-like") - (?\C-t "tan" "Log-like") - (nil "tanh" "Log-like") - (nil "{" "Delimiters" ?{) - (nil "}" "Delimiters" ?}) - (nil "lfloor" "Delimiters" 8970) ;; #X230A - (nil "rfloor" "Delimiters" 8971) ;; #X230B - (nil "lceil" "Delimiters" 8968) ;; #X2308 - (nil "rceil" "Delimiters" 8969) ;; #X2309 - (?\( "langle" "Delimiters" 10216) ;; #X27E8 - (?\) "rangle" "Delimiters" 10217) ;; #X27E9 - (nil "rmoustache" "Delimiters" 9137) ;; #X23B1 - (nil "lmoustache" "Delimiters" 9136) ;; #X23B0 - (nil "rgroup" "Delimiters" 9133) ;; #X23AD - (nil "lgroup" "Delimiters" 9129) ;; #X23A9 - (nil "backslash" "Delimiters" 92) ;; #X005C - (nil "|" "Delimiters" 8214) ;; #X2016) - (nil "arrowvert" "Delimiters") - (nil "Arrowvert" "Delimiters") - (nil "bracevert" "Delimiters") - (nil "widetilde" "Constructs" 771) ;; #X0303 - (nil "widehat" "Constructs" 770) ;; #X0302 - (nil "overleftarrow" "Constructs" 8406) ;; #X20D6 - (nil "overrightarrow" "Constructs") - (nil "overline" "Constructs" 773) ;; #X0305 - (nil "underline" "Constructs" 818) ;; #X0332 - (nil "overbrace" "Constructs" 65079) ;; #XFE37 - (nil "underbrace" "Constructs" 65080) ;; #XFE38 - (nil "sqrt" "Constructs" 8730) ;; #X221A - (nil "frac" "Constructs") - (?^ "hat" "Accents" 770) ;; #X0302 - (nil "acute" "Accents" 769) ;; #X0301 - (nil "bar" "Accents" 772) ;; #X0304 - (nil "dot" "Accents" 775) ;; #X0307 - (nil "breve" "Accents" 774) ;; #X0306 - (nil "check" "Accents" 780) ;; #X030C - (nil "grave" "Accents" 768) ;; #X0300 - (nil "vec" "Accents" 8407) ;; #X20D7 - (nil "ddot" "Accents" 776) ;; #X0308 - (?~ "tilde" "Accents" 771) ;; #X0303 - (nil "mathring" "Accents" 778) ;; #X030A - (nil "beth" ("AMS" "Hebrew") 8502) ;; #X2136 - (nil "daleth" ("AMS" "Hebrew") 8504) ;; #X2138 - (nil "gimel" ("AMS" "Hebrew") 8503) ;; #X2137 - (nil "digamma" ("AMS" "Greek Lowercase") 989) ;; #X03DD - ("v k" "varkappa" ("AMS" "Greek Lowercase") 1008) ;; #X03F0 - ("v G" "varGamma" ("AMS" "Greek Uppercase") 120548) ;; #X1D6E4 - ("v D" "varDelta" ("AMS" "Greek Uppercase") 120549) ;; #X1D6E5 - ("v J" "varTheta" ("AMS" "Greek Uppercase") 120553) ;; #X1D6E9 - ("v L" "varLambda" ("AMS" "Greek Uppercase") 120556) ;; #X1D6EC - ("v X" "varXi" ("AMS" "Greek Uppercase") 120559) ;; #X1D6EF - ("v P" "varPi" ("AMS" "Greek Uppercase") 120561) ;; #X1D6F1 - ("v S" "varSigma" ("AMS" "Greek Uppercase") 120564) ;; #X1D6F4 - ("v U" "varUpsilon" ("AMS" "Greek Uppercase") 120566) ;; #X1D6F6 - ("v F" "varPhi" ("AMS" "Greek Uppercase") 120567) ;; #X1D6F7 - ("v Y" "varPsi" ("AMS" "Greek Uppercase") 120569) ;; #X1D6F9 - ("v W" "varOmega" ("AMS" "Greek Uppercase") 120570) ;; #X1D6FA - (nil "dashrightarrow" ("AMS" "Arrows")) - (nil "dashleftarrow" ("AMS" "Arrows")) - (nil "impliedby" ("AMS" "Arrows") 10232) ;; #X27F8 - (nil "implies" ("AMS" "Arrows") 10233) ;; #X27F9 - (nil "leftleftarrows" ("AMS" "Arrows") 8647) ;; #X21C7 - (nil "leftrightarrows" ("AMS" "Arrows") 8646) ;; #X21C6 - (nil "Lleftarrow" ("AMS" "Arrows") 8666) ;; #X21DA - (nil "twoheadleftarrow" ("AMS" "Arrows") 8606) ;; #X219E - (nil "leftarrowtail" ("AMS" "Arrows") 8610) ;; #X21A2 - (nil "looparrowleft" ("AMS" "Arrows") 8619) ;; #X21AB - (nil "leftrightharpoons" ("AMS" "Arrows") 8651) ;; #X21CB - (nil "curvearrowleft" ("AMS" "Arrows") 8630) ;; #X21B6 - (nil "circlearrowleft" ("AMS" "Arrows") 8634) ;; #X21BA - (nil "Lsh" ("AMS" "Arrows") 8624) ;; #X21B0 - (nil "upuparrows" ("AMS" "Arrows") 8648) ;; #X21C8 - (nil "upharpoonleft" ("AMS" "Arrows") 8639) ;; #X21BF - (nil "downharpoonleft" ("AMS" "Arrows") 8643) ;; #X21C3 - (nil "multimap" ("AMS" "Arrows") 8888) ;; #X22B8 - (nil "leftrightsquigarrow" ("AMS" "Arrows") 8621) ;; #X21AD - (nil "looparrowright" ("AMS" "Arrows") 8620) ;; #X21AC - (nil "rightleftharpoons" ("AMS" "Arrows") 8652) ;; #X21CC - (nil "curvearrowright" ("AMS" "Arrows") 8631) ;; #X21B7 - (nil "circlearrowright" ("AMS" "Arrows")) - (nil "Rsh" ("AMS" "Arrows") 8625) ;; #X21B1 - (nil "downdownarrows" ("AMS" "Arrows") 8650) ;; #X21CA - (nil "upharpoonright" ("AMS" "Arrows") 8638) ;; #X21BE - (nil "downharpoonright" ("AMS" "Arrows") 8642) ;; #X21C2 - (nil "rightsquigarrow" ("AMS" "Arrows") 8605) ;; #X219D - (nil "nleftarrow" ("AMS" "Neg Arrows") 8602) ;; #X219A - (nil "nrightarrow" ("AMS" "Neg Arrows") 8603) ;; #X219B - (nil "nLeftarrow" ("AMS" "Neg Arrows") 8653) ;; #X21CD - (nil "nRightarrow" ("AMS" "Neg Arrows") 8655) ;; #X21CF - (nil "nleftrightarrow" ("AMS" "Neg Arrows") 8622) ;; #X21AE - (nil "nLeftrightarrow" ("AMS" "Neg Arrows") 8654) ;; #X21CE - (nil "leqq" ("AMS" "Relational I") 8806) ;; #X2266 - (nil "leqslant" ("AMS" "Relational I") 10877) ;; #X2A7D - (nil "eqslantless" ("AMS" "Relational I") 10901) ;; #X2A95 - (nil "lesssim" ("AMS" "Relational I") 8818) ;; #X2272 - (nil "lessapprox" ("AMS" "Relational I") 10885) ;; #X2A85 - (nil "approxeq" ("AMS" "Relational I") 8778) ;; #X224A - (nil "lessdot" ("AMS" "Relational I") 8918) ;; #X22D6 - (nil "lll" ("AMS" "Relational I") 8920) ;; #X22D8 - (nil "lessgtr" ("AMS" "Relational I") 8822) ;; #X2276 - (nil "lesseqgtr" ("AMS" "Relational I") 8922) ;; #X22DA - (nil "lesseqqgtr" ("AMS" "Relational I") 10891) ;; #X2A8B - (nil "doteqdot" ("AMS" "Relational I") 8785) ;; #X2251 - (nil "risingdotseq" ("AMS" "Relational I") 8787) ;; #X2253 - (nil "fallingdotseq" ("AMS" "Relational I") 8786) ;; #X2252 - (nil "backsim" ("AMS" "Relational I") 8765) ;; #X223D - (nil "backsimeq" ("AMS" "Relational I") 8909) ;; #X22CD - (nil "subseteqq" ("AMS" "Relational I") 10949) ;; #X2AC5 - (nil "Subset" ("AMS" "Relational I") 8912) ;; #X22D0 - (nil "sqsubset" ("AMS" "Relational I") 8847) ;; #X228F - (nil "preccurlyeq" ("AMS" "Relational I") 8828) ;; #X227C - (nil "curlyeqprec" ("AMS" "Relational I") 8926) ;; #X22DE - (nil "precsim" ("AMS" "Relational I") 8830) ;; #X227E - (nil "precapprox" ("AMS" "Relational I") 10935) ;; #X2AB7 - (nil "vartriangleleft" ("AMS" "Relational I") 8882) ;; #X22B2 - (nil "trianglelefteq" ("AMS" "Relational I") 8884) ;; #X22B4 - (nil "vDash" ("AMS" "Relational I") 8872) ;; #X22A8 - (nil "Vvdash" ("AMS" "Relational I") 8874) ;; #X22AA - (nil "smallsmile" ("AMS" "Relational I") 8995) ;; #X2323 - (nil "smallfrown" ("AMS" "Relational I") 8994) ;; #X2322 - (nil "bumpeq" ("AMS" "Relational I") 8783) ;; #X224F - (nil "Bumpeq" ("AMS" "Relational I") 8782) ;; #X224E - (nil "geqq" ("AMS" "Relational II") 8807) ;; #X2267 - (nil "geqslant" ("AMS" "Relational II") 10878) ;; #X2A7E - (nil "eqslantgtr" ("AMS" "Relational II") 10902) ;; #X2A96 - (nil "gtrsim" ("AMS" "Relational II") 8819) ;; #X2273 - (nil "gtrapprox" ("AMS" "Relational II") 10886) ;; #X2A86 - (nil "gtrdot" ("AMS" "Relational II") 8919) ;; #X22D7 - (nil "ggg" ("AMS" "Relational II") 8921) ;; #X22D9 - (nil "gtrless" ("AMS" "Relational II") 8823) ;; #X2277 - (nil "gtreqless" ("AMS" "Relational II") 8923) ;; #X22DB - (nil "gtreqqless" ("AMS" "Relational II") 10892) ;; #X2A8C - (nil "eqcirc" ("AMS" "Relational II") 8790) ;; #X2256 - (nil "circeq" ("AMS" "Relational II") 8791) ;; #X2257 - (nil "triangleq" ("AMS" "Relational II") 8796) ;; #X225C - (nil "thicksim" ("AMS" "Relational II") 8764) ;; #X223C - (nil "thickapprox" ("AMS" "Relational II") 8776) ;; #X2248 - (nil "supseteqq" ("AMS" "Relational II") 10950) ;; #X2AC6 - (nil "Supset" ("AMS" "Relational II") 8913) ;; #X22D1 - (nil "sqsupset" ("AMS" "Relational II") 8848) ;; #X2290 - (nil "succcurlyeq" ("AMS" "Relational II") 8829) ;; #X227D - (nil "curlyeqsucc" ("AMS" "Relational II") 8927) ;; #X22DF - (nil "succsim" ("AMS" "Relational II") 8831) ;; #X227F - (nil "succapprox" ("AMS" "Relational II") 10936) ;; #X2AB8 - (nil "vartriangleright" ("AMS" "Relational II") 8883) ;; #X22B3 - (nil "trianglerighteq" ("AMS" "Relational II") 8885) ;; #X22B5 - (nil "Vdash" ("AMS" "Relational II") 8873) ;; #X22A9 - (nil "shortmid" ("AMS" "Relational II") 8739) ;; #X2223 - (nil "shortparallel" ("AMS" "Relational II") 8741) ;; #X2225 - (nil "between" ("AMS" "Relational II") 8812) ;; #X226C - (nil "pitchfork" ("AMS" "Relational II") 8916) ;; #X22D4 - (nil "varpropto" ("AMS" "Relational II") 8733) ;; #X221D - (nil "blacktriangleleft" ("AMS" "Relational II") 9664) ;; #X25C0 - (nil "therefore" ("AMS" "Relational II") 8756) ;; #X2234 - (nil "backepsilon" ("AMS" "Relational II") 1014) ;; #X03F6 - (nil "blacktriangleright" ("AMS" "Relational II") 9654) ;; #X25B6 - (nil "because" ("AMS" "Relational II") 8757) ;; #X2235 - (nil "nless" ("AMS" "Neg Rel I") 8814) ;; #X226E - (nil "nleq" ("AMS" "Neg Rel I") 8816) ;; #X2270 - (nil "nleqslant" ("AMS" "Neg Rel I")) - (nil "nleqq" ("AMS" "Neg Rel I")) - (nil "lneq" ("AMS" "Neg Rel I") 10887) ;; #X2A87 - (nil "lneqq" ("AMS" "Neg Rel I") 8808) ;; #X2268 - (nil "lvertneqq" ("AMS" "Neg Rel I")) - (nil "lnsim" ("AMS" "Neg Rel I") 8934) ;; #X22E6 - (nil "lnapprox" ("AMS" "Neg Rel I") 10889) ;; #X2A89 - (nil "nprec" ("AMS" "Neg Rel I") 8832) ;; #X2280 - (nil "npreceq" ("AMS" "Neg Rel I")) - (nil "precnsim" ("AMS" "Neg Rel I") 8936) ;; #X22E8 - (nil "precnapprox" ("AMS" "Neg Rel I") 10937) ;; #X2AB9 - (nil "nsim" ("AMS" "Neg Rel I") 8769) ;; #X2241 - (nil "nshortmid" ("AMS" "Neg Rel I") 8740) ;; #X2224 - (nil "nmid" ("AMS" "Neg Rel I") 8740) ;; #X2224 - (nil "nvdash" ("AMS" "Neg Rel I") 8876) ;; #X22AC - (nil "nvDash" ("AMS" "Neg Rel I") 8877) ;; #X22AD - (nil "ntriangleleft" ("AMS" "Neg Rel I") 8938) ;; #X22EA - (nil "ntrianglelefteq" ("AMS" "Neg Rel I") 8940) ;; #X22EC - (nil "nsubseteq" ("AMS" "Neg Rel I") 8840) ;; #X2288 - (nil "subsetneq" ("AMS" "Neg Rel I") 8842) ;; #X228A - (nil "varsubsetneq" ("AMS" "Neg Rel I")) - (nil "subsetneqq" ("AMS" "Neg Rel I") 10955) ;; #X2ACB - (nil "varsubsetneqq" ("AMS" "Neg Rel I")) - (nil "ngtr" ("AMS" "Neg Rel II") 8815) ;; #X226F - (nil "ngeq" ("AMS" "Neg Rel II") 8817) ;; #X2271 - (nil "ngeqslant" ("AMS" "Neg Rel II")) - (nil "ngeqq" ("AMS" "Neg Rel II")) - (nil "gneq" ("AMS" "Neg Rel II") 10888) ;; #X2A88 - (nil "gneqq" ("AMS" "Neg Rel II") 8809) ;; #X2269 - (nil "gvertneqq" ("AMS" "Neg Rel II")) - (nil "gnsim" ("AMS" "Neg Rel II") 8935) ;; #X22E7 - (nil "gnapprox" ("AMS" "Neg Rel II") 10890) ;; #X2A8A - (nil "nsucc" ("AMS" "Neg Rel II") 8833) ;; #X2281 - (nil "nsucceq" ("AMS" "Neg Rel II")) - (nil "succnsim" ("AMS" "Neg Rel II") 8937) ;; #X22E9 - (nil "succnapprox" ("AMS" "Neg Rel II") 10938) ;; #X2ABA - (nil "ncong" ("AMS" "Neg Rel II") 8775) ;; #X2247 - (nil "nshortparallel" ("AMS" "Neg Rel II") 8742) ;; #X2226 - (nil "nparallel" ("AMS" "Neg Rel II") 8742) ;; #X2226 - (nil "nvDash" ("AMS" "Neg Rel II") 8877) ;; #X22AD - (nil "nVDash" ("AMS" "Neg Rel II") 8879) ;; #X22AF - (nil "ntriangleright" ("AMS" "Neg Rel II") 8939) ;; #X22EB - (nil "ntrianglerighteq" ("AMS" "Neg Rel II") 8941) ;; #X22ED - (nil "nsupseteq" ("AMS" "Neg Rel II") 8841) ;; #X2289 - (nil "nsupseteqq" ("AMS" "Neg Rel II")) - (nil "supsetneq" ("AMS" "Neg Rel II") 8843) ;; #X228B - (nil "varsupsetneq" ("AMS" "Neg Rel II")) - (nil "supsetneqq" ("AMS" "Neg Rel II") 10956) ;; #X2ACC - (nil "varsupsetneqq" ("AMS" "Neg Rel II")) - (nil "dotplus" ("AMS" "Binary Op") 8724) ;; #X2214 - (nil "smallsetminus" ("AMS" "Binary Op") 8726) ;; #X2216 - (nil "Cap" ("AMS" "Binary Op") 8914) ;; #X22D2 - (nil "Cup" ("AMS" "Binary Op") 8915) ;; #X22D3 - (nil "barwedge" ("AMS" "Binary Op") 8892) ;; #X22BC - (nil "veebar" ("AMS" "Binary Op") 8891) ;; #X22BB - (nil "doublebarwedge" ("AMS" "Binary Op") 8966) ;; #X2306 - (nil "boxminus" ("AMS" "Binary Op") 8863) ;; #X229F - (nil "boxtimes" ("AMS" "Binary Op") 8864) ;; #X22A0 - (nil "boxdot" ("AMS" "Binary Op") 8865) ;; #X22A1 - (nil "boxplus" ("AMS" "Binary Op") 8862) ;; #X229E - (nil "divideontimes" ("AMS" "Binary Op") 8903) ;; #X22C7 - (nil "ltimes" ("AMS" "Binary Op") 8905) ;; #X22C9 - (nil "rtimes" ("AMS" "Binary Op") 8906) ;; #X22CA - (nil "leftthreetimes" ("AMS" "Binary Op") 8907) ;; #X22CB - (nil "rightthreetimes" ("AMS" "Binary Op") 8908) ;; #X22CC - (nil "curlywedge" ("AMS" "Binary Op") 8911) ;; #X22CF - (nil "curlyvee" ("AMS" "Binary Op") 8910) ;; #X22CE - (nil "circleddash" ("AMS" "Binary Op") 8861) ;; #X229D - (nil "circledast" ("AMS" "Binary Op") 8859) ;; #X229B - (nil "circledcirc" ("AMS" "Binary Op") 8858) ;; #X229A - (nil "centerdot" ("AMS" "Binary Op")) - (nil "intercal" ("AMS" "Binary Op") 8890) ;; #X22BA - (nil "hbar" ("AMS" "Misc") 8463) ;; #X210F - (nil "hslash" ("AMS" "Misc") 8463) ;; #X210F - (nil "vartriangle" ("AMS" "Misc") 9653) ;; #X25B5 - (nil "triangledown" ("AMS" "Misc") 9663) ;; #X25BF - (nil "square" ("AMS" "Misc") 9633) ;; #X25A1 - (nil "lozenge" ("AMS" "Misc") 9674) ;; #X25CA - (nil "circledS" ("AMS" "Misc") 9416) ;; #X24C8 - (nil "angle" ("AMS" "Misc") 8736) ;; #X2220 - (nil "measuredangle" ("AMS" "Misc") 8737) ;; #X2221 - (nil "nexists" ("AMS" "Misc") 8708) ;; #X2204 - (nil "mho" ("AMS" "Misc") 8487) ;; #X2127 - (nil "Finv" ("AMS" "Misc") 8498) ;; #X2132 - (nil "Game" ("AMS" "Misc") 8513) ;; #X2141 - (nil "Bbbk" ("AMS" "Misc") 120156) ;; #X1D55C - (nil "backprime" ("AMS" "Misc") 8245) ;; #X2035 - (nil "varnothing" ("AMS" "Misc") 8709) ;; #X2205 - (nil "blacktriangle" ("AMS" "Misc") 9652) ;; #X25B4 - (nil "blacktriangledown" ("AMS" "Misc") 9662) ;; #X25BE - (nil "blacksquare" ("AMS" "Misc") 9632) ;; #X25A0 - (nil "blacklozenge" ("AMS" "Misc") 10731) ;; #X29EB - (nil "bigstar" ("AMS" "Misc") 9733) ;; #X2605 - (nil "sphericalangle" ("AMS" "Misc") 8738) ;; #X2222 - (nil "complement" ("AMS" "Misc") 8705) ;; #X2201 - (nil "eth" ("AMS" "Misc") 240) ;; #X00F0 - (nil "diagup" ("AMS" "Misc") 9585) ;; #X2571 - (nil "diagdown" ("AMS" "Misc") 9586) ;; #X2572 - (nil "dddot" ("AMS" "Accents") 8411) ;; #X20DB - (nil "ddddot" ("AMS" "Accents") 8412) ;; #X20DC - (nil "bigl" ("AMS" "Delimiters")) - (nil "bigr" ("AMS" "Delimiters")) - (nil "Bigl" ("AMS" "Delimiters")) - (nil "Bigr" ("AMS" "Delimiters")) - (nil "biggl" ("AMS" "Delimiters")) - (nil "biggr" ("AMS" "Delimiters")) - (nil "Biggl" ("AMS" "Delimiters")) - (nil "Biggr" ("AMS" "Delimiters")) - (nil "lvert" ("AMS" "Delimiters")) - (nil "rvert" ("AMS" "Delimiters")) - (nil "lVert" ("AMS" "Delimiters")) - (nil "rVert" ("AMS" "Delimiters")) - (nil "ulcorner" ("AMS" "Delimiters") 8988) ;; #X231C - (nil "urcorner" ("AMS" "Delimiters") 8989) ;; #X231D - (nil "llcorner" ("AMS" "Delimiters") 8990) ;; #X231E - (nil "lrcorner" ("AMS" "Delimiters") 8991) ;; #X231F - (nil "nobreakdash" ("AMS" "Special")) - (nil "leftroot" ("AMS" "Special")) - (nil "uproot" ("AMS" "Special")) - (nil "accentedsymbol" ("AMS" "Special")) - (nil "xleftarrow" ("AMS" "Special")) - (nil "xrightarrow" ("AMS" "Special")) - (nil "overset" ("AMS" "Special")) - (nil "underset" ("AMS" "Special")) - (nil "dfrac" ("AMS" "Special")) - (nil "genfrac" ("AMS" "Special")) - (nil "tfrac" ("AMS" "Special")) - (nil "binom" ("AMS" "Special")) - (nil "dbinom" ("AMS" "Special")) - (nil "tbinom" ("AMS" "Special")) - (nil "smash" ("AMS" "Special")) - (nil "eucal" ("AMS" "Special")) - (nil "boldsymbol" ("AMS" "Special")) - (nil "text" ("AMS" "Special")) - (nil "intertext" ("AMS" "Special")) - (nil "substack" ("AMS" "Special")) - (nil "subarray" ("AMS" "Special")) - (nil "sideset" ("AMS" "Special"))) - "Alist of LaTeX math symbols. - -Each entry should be a list with upto four elements, KEY, VALUE, -MENU and CHARACTER, see `LaTeX-math-list' for details.") - -(defcustom LaTeX-math-menu-unicode - (or (string-match "\\<GTK\\>" (emacs-version)) - (eq window-system 'w32)) - "Whether the LaTeX menu should try using Unicode for effect." - :type 'boolean - :group 'LaTeX-math) - -(defvar LaTeX-math-list) ;; Defined further below. - -(defun LaTeX-math-initialize () - (let ((math (reverse (append LaTeX-math-list LaTeX-math-default))) - (map LaTeX-math-keymap) - (unicode LaTeX-math-menu-unicode)) - (while math - (let* ((entry (car math)) - (key (nth 0 entry)) - (prefix - (and unicode - (nth 3 entry))) - value menu name) - (setq math (cdr math)) - (if (and prefix - (setq prefix (nth 3 entry))) - (setq prefix (concat (string prefix) " \\")) - (setq prefix "\\")) - (if (listp (cdr entry)) - (setq value (nth 1 entry) - menu (nth 2 entry)) - (setq value (cdr entry) - menu nil)) - (if (stringp value) - (progn - (setq name (intern (concat "LaTeX-math-" value))) - (fset name (lambda (arg) (interactive "*P") - (LaTeX-math-insert value arg)))) - (setq name value)) - (if key - (progn - (setq key (cond ((numberp key) (char-to-string key)) - ((stringp key) (read-kbd-macro key)) - (t (vector key)))) - (define-key map key name))) - (if menu - (let ((parent LaTeX-math-menu)) - (if (listp menu) - (progn - (while (cdr menu) - (let ((sub (assoc (car menu) LaTeX-math-menu))) - (if sub - (setq parent sub) - (setcdr parent (cons (list (car menu)) (cdr parent)))) - (setq menu (cdr menu)))) - (setq menu (car menu)))) - (let ((sub (assoc menu parent))) - (if sub - (if (stringp value) - (setcdr sub (cons (vector (concat prefix value) - name t) - (cdr sub))) - (error "Cannot have multiple special math menu items")) - (setcdr parent - (cons (if (stringp value) - (list menu (vector (concat prefix value) - name t)) - (vector menu name t)) - (cdr parent))))))))) - ;; Make the math prefix char available if it has not been used as a prefix. - (unless (lookup-key map (LaTeX-math-abbrev-prefix)) - (define-key map (LaTeX-math-abbrev-prefix) #'self-insert-command)))) - -(defcustom LaTeX-math-list nil - "Alist of your personal LaTeX math symbols. - -Each entry should be a list with up to four elements, KEY, VALUE, -MENU and CHARACTER. - -KEY is the key (after `LaTeX-math-abbrev-prefix') to be redefined -in math minor mode. KEY can be a character (for example ?o) for a -single stroke or a string (for example \"o a\") for a multi-stroke -binding. If KEY is nil, the symbol has no associated -keystroke (it is available in the menu, though). Note that -predefined keys in `LaTeX-math-default' cannot be overridden in -this variable. Currently, only the lowercase letter 'o' is free -for user customization, more options are available in uppercase -area. - -VALUE can be a string with the name of the macro to be inserted, -or a function to be called. The macro must be given without the -leading backslash. - -The third element MENU is the name of the submenu where the -command should be added. MENU can be either a string (for -example \"greek\"), a list (for example (\"AMS\" \"Delimiters\")) -or nil. If MENU is nil, no menu item will be created. - -The fourth element CHARACTER is a Unicode character position for -menu display. When nil, no character is shown. - -See also `LaTeX-math-menu'." - :group 'LaTeX-math - :set (lambda (symbol value) - (set-default symbol value) - (LaTeX-math-initialize)) - :type '(repeat (group (choice :tag "Key" - (const :tag "none" nil) - (choice (character) - (string :tag "Key sequence"))) - (choice :tag "Value" - (string :tag "Macro") - (function)) - (choice :tag "Menu" - (string :tag "Top level menu" ) - (repeat :tag "Submenu" - (string :tag "Menu"))) - (choice :tag "Unicode character" - (const :tag "none" nil) - (integer :tag "Number"))))) - -(defun LaTeX--completion-annotation-from-math-menu (sym) - "Return a completion annotation for a SYM. -The annotation is usually a unicode representation of the macro -SYM's compiled representation, e.g., if SYM is alpha, α is -returned." - (catch 'found - (dolist (var (list LaTeX-math-list LaTeX-math-default)) - (dolist (e var) - (let ((val (cadr e))) - (when (and (stringp val) - (string= val sym)) - (let ((char (nth 3 e))) - (when char - (throw 'found - (concat " " (char-to-string char))))))))))) - -(defvar LaTeX-math-mode-menu) -(define-minor-mode LaTeX-math-mode - "A minor mode with easy access to TeX math macros. - -Easy insertion of LaTeX math symbols. If you give a prefix argument, -the symbols will be surrounded by dollar signs. The following -commands are defined: - -\\{LaTeX-math-mode-map}" - :init-value nil - :lighter nil - :keymap (list (cons (LaTeX-math-abbrev-prefix) LaTeX-math-keymap)) - (TeX-set-mode-name)) -(defalias 'latex-math-mode #'LaTeX-math-mode) - -(easy-menu-define LaTeX-math-mode-menu - LaTeX-math-mode-map - "Menu used in math minor mode." - LaTeX-math-menu) - -(defcustom LaTeX-math-insert-function #'TeX-insert-macro - "Function called with argument STRING to insert \\STRING." - :group 'LaTeX-math - :type 'function) - -(defun LaTeX-math-insert (string dollar) - "Insert \\STRING{}. If DOLLAR is non-nil, put $'s around it. -If `TeX-electric-math' is non-nil wrap that symbols around the -string." - (let ((active (TeX-active-mark)) - m closer) - (if (and active (> (point) (mark))) - (exchange-point-and-mark)) - (when dollar - (insert (or (car TeX-electric-math) "$")) - (save-excursion - (if active (goto-char (mark))) - ;; Store closer string for later reference. - (setq closer (or (cdr TeX-electric-math) "$")) - (insert closer) - ;; Set temporal marker to decide whether to put the point - ;; after the math mode closer or not. - (setq m (point-marker)))) - (funcall LaTeX-math-insert-function string) - (when dollar - ;; If the above `LaTeX-math-insert-function' resulted in - ;; inserting, e.g., a pair of "\langle" and "\rangle" by - ;; typing "`(", keep the point between them. Otherwise - ;; move the point after the math mode closer. - (if (= m (+ (point) (length closer))) - (goto-char m)) - ;; Make temporal marker point nowhere not to slow down the - ;; subsequent editing in the buffer. - (set-marker m nil)))) - -(defun LaTeX-math-cal (char dollar) - "Insert a {\\cal CHAR}. If DOLLAR is non-nil, put $'s around it. -If `TeX-electric-math' is non-nil wrap that symbols around the -char." - (interactive "*c\nP") - (if dollar (insert (or (car TeX-electric-math) "$"))) - (if (member "latex2e" (TeX-style-list)) - (insert "\\mathcal{" (char-to-string char) "}") - (insert "{\\cal " (char-to-string char) "}")) - (if dollar (insert (or (cdr TeX-electric-math) "$")))) - - -;;; Folding - -(defcustom LaTeX-fold-macro-spec-list nil - "List of display strings and macros to fold in LaTeX mode." - :type '(repeat (group (choice (string :tag "Display String") - (integer :tag "Number of argument" :value 1)) - (repeat :tag "Macros" (string)))) - :group 'TeX-fold) - -(defcustom LaTeX-fold-env-spec-list nil - "List of display strings and environments to fold in LaTeX mode." - :type '(repeat (group (choice (string :tag "Display String") - (integer :tag "Number of argument" :value 1)) - (repeat :tag "Environments" (string)))) - :group 'TeX-fold) - -(defcustom LaTeX-fold-math-spec-list - (delete nil - (mapcar (lambda (elt) - (let ((tex-token (nth 1 elt)) - (submenu (nth 2 elt)) - (unicode (nth 3 elt)) - uchar noargp) - (when (integerp unicode) - (setq uchar unicode)) - (when (listp submenu) (setq submenu (nth 1 submenu))) - (setq noargp - (not (string-match - (concat "^" (regexp-opt '("Constructs" - "Accents"))) - submenu))) - (when (and (stringp tex-token) (integerp uchar) noargp) - `(,(char-to-string uchar) (,tex-token))))) - `((nil "to" "" 8594) - (nil "gets" "" 8592) - ,@LaTeX-math-default))) - "List of display strings and math macros to fold in LaTeX mode." - :type '(repeat (group (choice (string :tag "Display String") - (integer :tag "Number of argument" :value 1)) - (repeat :tag "Math Macros" (string)))) - :group 'TeX-fold) - -;;; Narrowing - -(defun LaTeX-narrow-to-environment (&optional count) - "Make text outside current environment invisible. -With optional COUNT keep visible that number of enclosing -environments." - (interactive "p") - (setq count (if count (abs count) 1)) - (save-excursion - (widen) - (let ((opoint (point)) - beg end) - (dotimes (_ count) (LaTeX-find-matching-end)) - (setq end (point)) - (goto-char opoint) - (dotimes (_ count) (LaTeX-find-matching-begin)) - (setq beg (point)) - (narrow-to-region beg end)))) -(put 'LaTeX-narrow-to-environment 'disabled t) - -;;; Keymap - -(defvar LaTeX-mode-map - (let ((map (make-sparse-keymap))) - (set-keymap-parent map TeX-mode-map) - - ;; Standard - (define-key map "\n" #'reindent-then-newline-and-indent) - - ;; From latex.el - ;; We now set `fill-paragraph-function' instead. - ;; (define-key map "\eq" 'LaTeX-fill-paragraph) ;*** Alias - ;; This key is now used by Emacs for face settings. - ;; (define-key map "\eg" 'LaTeX-fill-region) ;*** Alias - ;; We now set `beginning-of-defun-function' and - ;; `end-of-defun-function' instead. - ;; (define-key map "\e\C-e" #'LaTeX-find-matching-end) - ;; (define-key map "\e\C-a" #'LaTeX-find-matching-begin) - - (define-key map "\C-c\C-q\C-p" #'LaTeX-fill-paragraph) - (define-key map "\C-c\C-q\C-r" #'LaTeX-fill-region) - (define-key map "\C-c\C-q\C-s" #'LaTeX-fill-section) - (define-key map "\C-c\C-q\C-e" #'LaTeX-fill-environment) - - (define-key map "\C-c\C-z" #'LaTeX-command-section) - (define-key map "\C-c\M-z" #'LaTeX-command-section-change-level) - - (define-key map "\C-c." #'LaTeX-mark-environment) ;*** Dubious - (define-key map "\C-c*" #'LaTeX-mark-section) ;*** Dubious - - (define-key map "\C-c\C-e" #'LaTeX-environment) - (define-key map "\C-c\n" #'LaTeX-insert-item) - (or (key-binding "\e\r") - (define-key map "\e\r" #'LaTeX-insert-item)) ;*** Alias - (define-key map "\C-c]" #'LaTeX-close-environment) - (define-key map "\C-c\C-s" #'LaTeX-section) - - (define-key map "\C-c~" #'LaTeX-math-mode) ;*** Dubious - - (define-key map "-" #'LaTeX-babel-insert-hyphen) - (define-key map "(" #'LaTeX-insert-left-brace) - (define-key map "{" #'LaTeX-insert-left-brace) - (define-key map "[" #'LaTeX-insert-left-brace) - - (define-key map "\C-xne" #'LaTeX-narrow-to-environment) - map) - "Keymap used in `LaTeX-mode'.") - -(defvar LaTeX-environment-menu-name "Insert Environment (C-c C-e)") - -(defun LaTeX-environment-menu-entry (entry) - "Create an ENTRY for the environment menu." - (vector (car entry) (list #'LaTeX-environment-menu (car entry)) t)) - -(defvar LaTeX-environment-modify-menu-name "Change Environment (C-u C-c C-e)") - -(defun LaTeX-environment-modify-menu-entry (entry) - "Create an ENTRY for the change environment menu." - (vector (car entry) (list #'LaTeX-modify-environment (car entry)) t)) - -(defun LaTeX-section-enable-symbol (level) - "Symbol used to enable section LEVEL in the menu bar." - (intern (concat "LaTeX-section-" (int-to-string level) "-enable"))) - -(defun LaTeX-section-enable (entry) - "Enable or disable section ENTRY from `LaTeX-section-list'." - (let* ((level (nth 1 entry)) - (symbol (LaTeX-section-enable-symbol level))) - (set symbol (or (= level 0) (>= level LaTeX-largest-level))) - (make-variable-buffer-local symbol))) - -(defun LaTeX-section-menu (level) - "Insert section from menu." - (let ((LaTeX-section-hook (delq 'LaTeX-section-heading - (copy-sequence LaTeX-section-hook)))) - (LaTeX-section level))) - -(defun LaTeX-section-menu-entry (entry) - "Create an ENTRY for the section menu." - (let ((enable (LaTeX-section-enable-symbol (nth 1 entry)))) - (vector (car entry) (list #'LaTeX-section-menu (nth 1 entry)) enable))) - -(defcustom LaTeX-menu-max-items 25 - "Maximum number of items in the menu for LaTeX environments. -If number of entries in a menu is larger than this value, split menu -into submenus of nearly equal length. If nil, never split menu into -submenus." - :group 'LaTeX-environment - :type '(choice (const :tag "no submenus" nil) - (integer))) - -(defcustom LaTeX-submenu-name-format "%-12.12s ... %.12s" - "Format specification of the submenu name. -Used by `LaTeX-split-long-menu' if the number of entries in a menu is -larger than `LaTeX-menu-max-items'. -This string should contain one %s for the name of the first entry and -one %s for the name of the last entry in the submenu. -If the value is a function, it should return the submenu name. The -function is called with two arguments, the names of the first and -the last entry in the menu." - :group 'LaTeX-environment - :type '(choice (string :tag "Format string") - (function))) - -(defun LaTeX-split-long-menu (menu) - "Split MENU according to `LaTeX-menu-max-items'." - (let ((len (length menu))) - (if (or (null LaTeX-menu-max-items) - (null (featurep 'lisp-float-type)) - (<= len LaTeX-menu-max-items)) - menu - ;; Submenu is max 2 entries longer than menu, never shorter, number of - ;; entries in submenus differ by at most one (with longer submenus first) - (let* ((outer (floor (sqrt len))) - (inner (/ len outer)) - (rest (% len outer)) - (result nil)) - (setq menu (reverse menu)) - (while menu - (let ((in inner) - (sub nil) - (to (car menu))) - (while (> in 0) - (setq in (1- in) - sub (cons (car menu) sub) - menu (cdr menu))) - (setq result - (cons (cons (if (stringp LaTeX-submenu-name-format) - (format LaTeX-submenu-name-format - (aref (car sub) 0) (aref to 0)) - (funcall LaTeX-submenu-name-format - (aref (car sub) 0) (aref to 0))) - sub) - result) - rest (1+ rest)) - (if (= rest outer) (setq inner (1+ inner))))) - result)))) - -(defun LaTeX-section-menu-filter (_ignored) - "Filter function for the section submenu in the mode menu. -The argument IGNORED is not used in any way." - (TeX-update-style) - (or LaTeX-section-menu - (progn - (setq LaTeX-section-list-changed nil) - (mapc #'LaTeX-section-enable LaTeX-section-list) - (setq LaTeX-section-menu - (mapcar #'LaTeX-section-menu-entry LaTeX-section-list))))) - -(defvar LaTeX-environment-menu nil) -(make-variable-buffer-local 'LaTeX-environment-menu) -(defvar LaTeX-environment-modify-menu nil) -(make-variable-buffer-local 'LaTeX-environment-modify-menu) -(defun LaTeX-environment-menu-filter (menu) - "Filter function for the environment submenus in the mode menu. -The argument MENU is the name of the submenu in concern and -corresponds to the variables `LaTeX-environment-menu-name' and -`LaTeX-environment-modify-menu-name'." - (TeX-update-style) - (cond - ((string= menu LaTeX-environment-menu-name) - (or LaTeX-environment-menu - (setq LaTeX-environment-menu - (LaTeX-split-long-menu - (mapcar #'LaTeX-environment-menu-entry - (LaTeX-environment-list)))))) - ((string= menu LaTeX-environment-modify-menu-name) - (or LaTeX-environment-modify-menu - (setq LaTeX-environment-modify-menu - (LaTeX-split-long-menu - (mapcar #'LaTeX-environment-modify-menu-entry - (LaTeX-environment-list)))))))) - -(advice-add 'LaTeX-add-environments :after #'LaTeX--invalidate-menus) -(defun LaTeX--invalidate-menus (&rest _) - "Mark the environment menus as being in need of a refresh." - (setq LaTeX-environment-menu nil) - (setq LaTeX-environment-modify-menu nil)) - -(easy-menu-define LaTeX-mode-command-menu - LaTeX-mode-map - "Command menu used in LaTeX mode." - (TeX-mode-specific-command-menu 'latex-mode)) - -(easy-menu-define LaTeX-mode-menu - LaTeX-mode-map - "Menu used in LaTeX mode." - `("LaTeX" - ("Section (C-c C-s)" :filter LaTeX-section-menu-filter) - ["Macro..." TeX-insert-macro - :help "Insert a macro and possibly arguments"] - ["Complete Macro" TeX-complete-symbol - :help "Complete the current macro or environment name"] - ,(list LaTeX-environment-menu-name - :filter (lambda (_ignored) - (LaTeX-environment-menu-filter - LaTeX-environment-menu-name))) - ,(list LaTeX-environment-modify-menu-name - :filter (lambda (_ignored) - (LaTeX-environment-menu-filter - LaTeX-environment-modify-menu-name))) - ["Close Environment" LaTeX-close-environment - :help "Insert the \\end part of the current environment"] - ["Item" LaTeX-insert-item - :help "Insert a new \\item into current environment"] - "-" - ("Insert Font" - ["Emphasize" (TeX-font nil ?\C-e) :keys "C-c C-f C-e"] - "-" - ["Roman" (TeX-font nil ?\C-r) :keys "C-c C-f C-r"] - ["Sans Serif" (TeX-font nil ?\C-f) :keys "C-c C-f C-f"] - ["Typewriter" (TeX-font nil ?\C-t) :keys "C-c C-f C-t"] - "-" - ["Medium" (TeX-font nil ?\C-m) :keys "C-c C-f C-m"] - ["Bold" (TeX-font nil ?\C-b) :keys "C-c C-f C-b"] - "-" - ["Italic" (TeX-font nil ?\C-i) :keys "C-c C-f C-i"] - ["Slanted" (TeX-font nil ?\C-s) :keys "C-c C-f C-s"] - ["Small Caps" (TeX-font nil ?\C-c) :keys "C-c C-f C-c"] - ["Swash" (TeX-font nil ?\C-w) :keys "C-c C-f C-w"] - ["Upper Lower" (TeX-font nil ?\C-l) :keys "C-c C-f C-l"] - "-" - ["Calligraphic" (TeX-font nil ?\C-a) :keys "C-c C-f C-a"] - ["Normal" (TeX-font nil ?\C-n) :keys "C-c C-f C-n"]) - ("Replace Font" - ["Emphasize" (TeX-font t ?\C-e) :keys "C-u C-c C-f C-e"] - "-" - ["Roman" (TeX-font t ?\C-r) :keys "C-u C-c C-f C-r"] - ["Sans Serif" (TeX-font t ?\C-f) :keys "C-u C-c C-f C-f"] - ["Typewriter" (TeX-font t ?\C-t) :keys "C-u C-c C-f C-t"] - "-" - ["Medium" (TeX-font t ?\C-m) :keys "C-u C-c C-f C-m"] - ["Bold" (TeX-font t ?\C-b) :keys "C-u C-c C-f C-b"] - "-" - ["Italic" (TeX-font t ?\C-i) :keys "C-u C-c C-f C-i"] - ["Slanted" (TeX-font t ?\C-s) :keys "C-u C-c C-f C-s"] - ["Small Caps" (TeX-font t ?\C-c) :keys "C-u C-c C-f C-c"] - ["Swash" (TeX-font t ?\C-w) :keys "C-u C-c C-f C-w"] - ["Upper Lower" (TeX-font t ?\C-l) :keys "C-u C-c C-f C-l"] - "-" - ["Calligraphic" (TeX-font t ?\C-a) :keys "C-u C-c C-f C-a"] - ["Normal" (TeX-font t ?\C-n) :keys "C-u C-c C-f C-n"]) - ["Delete Font" (TeX-font t ?\C-d) :keys "C-c C-f C-d"] - "-" - ["Comment or Uncomment Region" - comment-or-uncomment-region - :help "Make the selected region outcommented or active again"] - ["Comment or Uncomment Paragraph" - TeX-comment-or-uncomment-paragraph - :help "Make the current paragraph outcommented or active again"] - ("Formatting and Marking" - ["Format Environment" LaTeX-fill-environment - :help "Fill and indent the current environment"] - ["Format Paragraph" LaTeX-fill-paragraph - :help "Fill and ident the current paragraph"] - ["Format Region" LaTeX-fill-region - :help "Fill and indent the currently selected region"] - ["Format Section" LaTeX-fill-section - :help "Fill and indent the current section"] - "-" - ["Mark Environment" LaTeX-mark-environment - :help "Mark the current environment"] - ["Mark Section" LaTeX-mark-section - :help "Mark the current section"] - "-" - ["Beginning of Environment" LaTeX-find-matching-begin - :help "Move point to the beginning of the current environment"] - ["End of Environment" LaTeX-find-matching-end - :help "Move point to the end of the current environment"]) - ,TeX-fold-menu - ["Math Mode" LaTeX-math-mode - :style toggle :selected LaTeX-math-mode - :help "Toggle math mode"] - "-" - [ "Convert 209 to 2e" LaTeX-209-to-2e - :visible (member "latex2" (TeX-style-list)) ] - . ,TeX-common-menu-entries)) - -(defcustom LaTeX-font-list - '((?\C-a "" "" "\\mathcal{" "}") - (?\C-b "\\textbf{" "}" "\\mathbf{" "}") - (?\C-c "\\textsc{" "}") - (?\C-e "\\emph{" "}") - (?\C-f "\\textsf{" "}" "\\mathsf{" "}") - (?\C-i "\\textit{" "}" "\\mathit{" "}") - (?\C-l "\\textulc{" "}") - (?\C-m "\\textmd{" "}") - (?\C-n "\\textnormal{" "}" "\\mathnormal{" "}") - (?\C-r "\\textrm{" "}" "\\mathrm{" "}") - (?\C-s "\\textsl{" "}" "\\mathbb{" "}") - (?\C-t "\\texttt{" "}" "\\mathtt{" "}") - (?\C-u "\\textup{" "}") - (?\C-w "\\textsw{" "}") - (?\C-d "" "" t)) - "Font commands used with LaTeX2e. See `TeX-font-list'." - :group 'LaTeX-macro - :type '(repeat - (group - :value (?\C-a "" "") - (character :tag "Key") - (string :tag "Prefix") - (string :tag "Suffix") - (option (group - :inline t - (string :tag "Math Prefix") - (string :tag "Math Suffix"))) - (option (sexp :format "Replace\n" :value t))))) - - -;;; Simple Commands - -(defcustom LaTeX-babel-hyphen "\"=" - "String to be used when typing `-'. -This usually is a hyphen alternative or hyphenation aid, like -\"=, \"~ or \"-, provided by babel and the related language style -files. - -Set it to an empty string or nil in order to disable this -feature. Alter `LaTeX-babel-hyphen-language-alist' in case you -want to change the behavior for a specific language only." - :group 'LaTeX-macro - :type 'string) - -(defcustom LaTeX-babel-hyphen-after-hyphen t - "Control insertion of hyphen strings. -If non-nil insert normal hyphen on first key press and swap it -with the language-specific hyphen string specified in the -variable `LaTeX-babel-hyphen' on second key press. If nil do it -the other way round." - :group 'LaTeX-macro - :type 'boolean) - -(defcustom LaTeX-babel-hyphen-language-alist nil - "Alist controlling hyphen insertion for specific languages. -It may be used to override the defaults given by `LaTeX-babel-hyphen' -and `LaTeX-babel-hyphen-after-hyphen' respectively. The first item -in each element is a string specifying the language as set by the -language-specific style file. The second item is the string to be -used instead of `LaTeX-babel-hyphen'. The third element is the -value overriding `LaTeX-babel-hyphen-after-hyphen'." - :group 'LaTeX-macro - :type '(alist :key-type (string :tag "Language") - :value-type (group (string :tag "Hyphen string") - (boolean :tag "Insert plain hyphen first" - :value t)))) - -(defvar LaTeX-babel-hyphen-language nil - "String determining language-specific behavior of hyphen insertion. -It serves as an indicator that the babel hyphenation string -should be used and as a means to find a potential customization -in `LaTeX-babel-hyphen-language-alist' related to the active -language. It is usually set by language-related style files.") -(make-variable-buffer-local 'LaTeX-babel-hyphen-language) - -(defun LaTeX-babel-insert-hyphen (force) - "Insert a hyphen string. -The string can be either a normal hyphen or the string specified -in `LaTeX-babel-hyphen'. Wether one or the other is chosen -depends on the value of `LaTeX-babel-hyphen-after-hyphen' and -the buffer context. -If prefix argument FORCE is non-nil, always insert a regular hyphen." - (interactive "*P") - (if (or force - (zerop (length LaTeX-babel-hyphen)) - (not LaTeX-babel-hyphen-language) - ;; FIXME: It would be nice to check for verbatim constructs in the - ;; non-font-locking case, but things like `LaTeX-current-environment' - ;; are rather expensive in large buffers. - (and (fboundp 'font-latex-faces-present-p) - (font-latex-faces-present-p '(font-latex-verbatim-face - font-latex-math-face - font-lock-comment-face))) - (texmathp) - (TeX-in-comment)) - (call-interactively #'self-insert-command) - (let* ((lang (assoc LaTeX-babel-hyphen-language - LaTeX-babel-hyphen-language-alist)) - (hyphen (if lang (nth 1 lang) LaTeX-babel-hyphen)) - (h-after-h (if lang (nth 2 lang) LaTeX-babel-hyphen-after-hyphen)) - (hyphen-length (length hyphen))) - (cond - ;; "= --> -- / - - ((string= (buffer-substring (max (- (point) hyphen-length) (point-min)) - (point)) - hyphen) - (if h-after-h - (progn (delete-char (- hyphen-length)) - (insert "--")) - (delete-char (- hyphen-length)) - (call-interactively #'self-insert-command))) - ;; -- --> [+]- - ((string= (buffer-substring (max (- (point) 2) (point-min)) - (point)) - "--") - (call-interactively #'self-insert-command)) - ;; - --> "= / [+]- - ((eq (char-before) ?-) - (if h-after-h - (progn (delete-char -1) - (insert hyphen)) - (call-interactively #'self-insert-command))) - (h-after-h - (call-interactively #'self-insert-command)) - (t (insert hyphen)))))) -;; Cater for Delete Selection mode -(put 'LaTeX-babel-insert-hyphen 'delete-selection t) - -(defcustom LaTeX-enable-toolbar t - "Enable LaTeX tool bar." - :group 'TeX-tool-bar - :type 'boolean) - -(defun LaTeX-maybe-install-toolbar () - "Conditionally install tool bar buttons for LaTeX mode. -Install tool bar if `LaTeX-enable-toolbar' and `tool-bar-mode' -are non-nil." - (when (and LaTeX-enable-toolbar tool-bar-mode) - ;; Defined in `tex-bar.el': - (LaTeX-install-toolbar))) - -;;; Error Messages - -(defconst LaTeX-error-description-list - '(("\\(?:Package Preview Error\\|Preview\\):.*" . - "The `auctex' option to `preview' should not be applied manually. -If you see this error message outside of a preview run, either -you did something too clever, or AUCTeX something too stupid.") - - ("Bad \\\\line or \\\\vector argument.*" . - "The first argument of a \\line or \\vector command, which specifies the -slope, is illegal\.") - - ("Bad math environment delimiter.*" . - "TeX has found either a math-mode-starting command such as \\[ or \\( -when it is already in math mode, or else a math-mode-ending command -such as \\) or \\] while in LR or paragraph mode. The problem is caused -by either unmatched math mode delimiters or unbalanced braces\.") - - ("Bad use of \\\\\\\\.*" . - "A \\\\ command appears between paragraphs, where it makes no sense. This -error message occurs when the \\\\ is used in a centering or flushing -environment or else in the scope of a centering or flushing -declaration.") - - ("\\\\begin{[^ ]*} ended by \\\\end{[^ ]*}." . - "LaTeX has found an \\end command that doesn't match the corresponding -\\begin command. You probably misspelled the environment name in the -\\end command, have an extra \\begin, or else forgot an \\end.") - - ("Can be used only in preamble." . - "LaTeX has encountered, after the \\begin{document}, one of the -following commands that should appear only in the preamble: -\\documentclass, \\nofiles, \\includeonly, \\makeindex, or -\\makeglossary. The error is also caused by an extra \\begin{document} -command.") - - ("Command name [^ ]* already used.*" . - "You are using \\newcommand, \\newenvironment, \\newlength, \\newsavebox, -or \\newtheorem to define a command or environment name that is -already defined, or \\newcounter to define a counter that already -exists. (Defining an environment named gnu automatically defines the -command \\gnu.) You'll have to choose a new name or, in the case of -\\newcommand or \\newenvironment, switch to the \\renew ... command.") - - ("Counter too large." . - "1. Some object that is numbered with letters, probably an item in a -enumerated list, has received a number greater than 26. Either you're -making a very long list or you've been resetting counter values. - -2. Footnotes are being ``numbered'' with letters or footnote symbols -and LaTeX has run out of letters or symbols. This is probably caused -by too many \\thanks commands.") - - ("Environment [^ ]* undefined." . - "LaTeX has encountered a \\begin command for a nonexistent environment. -You probably misspelled the environment name. ") - - ("Float(s) lost." . - "You put a figure or table environment or a \\marginpar command inside a -parbox---either one made with a minipage environment or \\parbox -command, or one constructed by LaTeX in making a footnote, figure, -etc. This is an outputting error, and the offending environment or -command may be quite a way back from the point where LaTeX discovered -the problem. One or more figures, tables, and/or marginal notes have -been lost, but not necessarily the one that caused the error.") - - ("Illegal character in array arg." . - "There is an illegal character in the argument of an array or tabular -environment, or in the second argument of a \\multicolumn command.") - - ("Missing \\\\begin{document}." . - "LaTeX produced printed output before encountering a \\begin{document} -command. Either you forgot the \\begin{document} command or there is -something wrong in the preamble. The problem may be a stray character -or an error in a declaration---for example, omitting the braces around -an argument or forgetting the \\ in a command name.") - - ("Missing p-arg in array arg.*" . - "There is a p that is not followed by an expression in braces in the -argument of an array or tabular environment, or in the second argument -of a \\multicolumn command.") - - ("Missing @-exp in array arg." . - "There is an @ character not followed by an @-expression in the -argument of an array or tabular environment, or in the second argument -of a \\multicolumn command.") - - ("No such counter." . - "You have specified a nonexistent counter in a \\setcounter or -\\addtocounter command. This is probably caused by a simple typing -error. However, if the error occurred while a file with the extension -aux is being read, then you probably used a \\newcounter command -outside the preamble.") - - ("Not in outer par mode." . - "You had a figure or table environment or a \\marginpar command in math -mode or inside a parbox.") - - ("\\\\pushtabs and \\\\poptabs don't match." . - "LaTeX found a \\poptabs with no matching \\pushtabs, or has come to the -\\end{tabbing} command with one or more unmatched \\pushtabs commands.") - - ("Something's wrong--perhaps a missing \\\\item." . - "The most probable cause is an omitted \\item command in a list-making -environment. It is also caused by forgetting the argument of a -thebibliography environment.") - - ("Tab overflow." . - "A \\= command has exceeded the maximum number of tab stops that LaTeX -permits.") - - ("There's no line here to end." . - "A \\newline or \\\\ command appears between paragraphs, where it makes no -sense. If you're trying to ``leave a blank line'', use a \\vspace -command.") - - ("This may be a LaTeX bug." . - "LaTeX has become thoroughly confused. This is probably due to a -previously detected error, but it is possible that you have found an -error in LaTeX itself. If this is the first error message produced by -the input file and you can't find anything wrong, save the file and -contact the person listed in your Local Guide.") - - ("Too deeply nested." . - "There are too many list-making environments nested within one another. -How many levels of nesting are permitted may depend upon what computer -you are using, but at least four levels are provided, which should be -enough.") - - ("Too many unprocessed floats." . - "While this error can result from having too many \\marginpar commands -on a page, a more likely cause is forcing LaTeX to save more figures -and tables than it has room for. When typesetting its continuous -scroll, LaTeX saves figures and tables separately and inserts them as -it cuts off pages. This error occurs when LaTeX finds too many figure -and/or table environments before it is time to cut off a page, a -problem that is solved by moving some of the environments farther -towards the end of the input file. The error can also be caused by a -``logjam''---a figure or table that cannot be printed causing others -to pile up behind it, since LaTeX will not print figures or tables out -of order. The jam can be started by a figure or table that either is -too large to fit on a page or won't fit where its optional placement -argument says it must go. This is likely to happen if the argument -does not contain a p option.") - - ("Undefined tab position." . - "A \\>, \\+, \\-, or \\< command is trying to go to a nonexistent tab -position---one not defined by a \\= command.") - - ("\\\\< in mid line." . - "A \\< command appears in the middle of a line in a tabbing environment. -This command should come only at the beginning of a line.") - - ("Double subscript." . - "There are two subscripts in a row in a mathematical -formula---something like x_{2}_{3}, which makes no sense.") - - ("Double superscript." . - "There are two superscripts in a row in a mathematical -formula---something like x^{2}^{3}, which makes no sense.") - - ("Extra alignment tab has been changed to \\\\cr." . - "There are too many separate items (column entries) in a single row of -an array or tabular environment. In other words, there were too many & -'s before the end of the row. You probably forgot the \\\\ at the end of -the preceding row.") - - ("Extra \\}, or forgotten \\$." . - "The braces or math mode delimiters don't match properly. You probably -forgot a {, \\[, \\(, or $.") - - ("Font [^ ]* not loaded: Not enough room left." . - "The document uses more fonts than TeX has room for. If different parts -of the document use different fonts, then you can get around the -problem by processing it in parts.") - - ("I can't find file `.*'." . - "TeX can't find a file that it needs. If the name of the missing file -has the extension tex, then it is looking for an input file that you -specified---either your main file or another file inserted with an -\\input or \\include command. If the missing file has the extension sty -, then you have specified a nonexistent document style or style -option.") - - ("Illegal parameter number in definition of .*" . - "This is probably caused by a \\newcommand, \\renewcommand, -\\newenvironment, or \\renewenvironment command in which a # is used -incorrectly. A # character, except as part of the command name \\#, -can be used only to indicate an argument parameter, as in #2, which -denotes the second argument. This error is also caused by nesting one -of the above four commands inside another, or by putting a parameter -like #2 in the last argument of a \\newenvironment or \\renewenvironment -command.") - - ("Illegal unit of measure ([^ ]* inserted)." . - "If you just got a - - ! Missing number, treated as zero. - -error, then this is part of the same problem. If not, it means that -LaTeX was expecting a length as an argument and found a number -instead. The most common cause of this error is writing 0 instead of -something like 0in for a length of zero, in which case typing return -should result in correct output. However, the error can also be caused -by omitting a command argument.") - - ("Misplaced alignment tab character \\&." . - "The special character &, which should be used only to separate items -in an array or tabular environment, appeared in ordinary text. You -probably meant to type \\&.") - - ("Missing control sequence inserted." . - "This is probably caused by a \\newcommand, \\renewcommand, \\newlength, -or \\newsavebox command whose first argument is not a command name.") - - ("Missing number, treated as zero." . - "This is usually caused by a LaTeX command expecting but not finding -either a number or a length as an argument. You may have omitted an -argument, or a square bracket in the text may have been mistaken for -the beginning of an optional argument. This error is also caused by -putting \\protect in front of either a length command or a command such -as \\value that produces a number.") - - ("Missing [{}] inserted." . - "TeX has become confused. The position indicated by the error locator -is probably beyond the point where the incorrect input is.") - - ("Missing \\$ inserted." . - "TeX probably found a command that can be used only in math mode when -it wasn't in math mode. Remember that unless stated otherwise, all -all the commands of Section 3.3 in LaTeX Book (Lamport) can be used -only in math mode. TeX is not in math mode when it begins processing -the argument of a box-making command, even if that command is inside a -math environment. This error also occurs if TeX encounters a blank -line when it is in math mode.") - - ("Not a letter." . - "Something appears in the argument of a \\hyphenation command that -doesn't belong there.") - - ("Paragraph ended before [^ ]* was complete." . - "A blank line occurred in a command argument that shouldn't contain -one. You probably forgot the right brace at the end of an argument.") - - ("\\\\[^ ]*font [^ ]* is undefined .*" . - "These errors occur when an uncommon font is used in math mode---for -example, if you use a \\sc command in a formula inside a footnote, -calling for a footnote-sized small caps font. This problem is solved -by using a \\load command.") - - ("Font .* not found." . - "You requested a family/series/shape/size combination that is totally -unknown. There are two cases in which this error can occur: - 1) You used the \\size macro to select a size that is not available. - 2) If you did not do that, go to your local `wizard' and - complain fiercely that the font selection tables are corrupted!") - - ("TeX capacity exceeded, sorry .*" . - "TeX has just run out of space and aborted its execution. Before you -panic, remember that the least likely cause of this error is TeX not -having the capacity to process your document. It was probably an -error in your input file that caused TeX to run out of room. The -following discussion explains how to decide whether you've really -exceeded TeX's capacity and, if so, what to do. If the problem is an -error in the input, you may have to use the divide and conquer method -described previously to locate it. LaTeX seldom runs out of space on a -short input file, so if running it on the last few pages before the -error indicator's position still produces the error, then there's -almost certainly something wrong in the input file. - -The end of the error indicator tells what kind of space TeX ran out -of. The more common ones are listed below, with an explanation of -their probable causes. - -buffer size -=========== -Can be caused by too long a piece of text as the argument -of a sectioning, \\caption, \\addcontentsline, or \\addtocontents -command. This error will probably occur when the \\end{document} is -being processed, but it could happen when a \\tableofcontents, -\\listoffigures, or \\listoftables command is executed. To solve this -problem, use a shorter optional argument. Even if you're producing a -table of contents or a list of figures or tables, such a long entry -won't help the reader. - -exception dictionary -==================== -You have used \\hyphenation commands to give TeX -more hyphenation information than it has room for. Remove some of the -less frequently used words from the \\hyphenation commands and insert -\\- commands instead. - -hash size -========= -Your input file defines too many command names and/or uses -too many cross-ref- erencing labels. - -input stack size -================ -This is probably caused by an error in a command -definition. For example, the following command makes a circular -definition, defining \\gnu in terms of itself: - - \\newcommand{\\gnu}{a \\gnu} % This is wrong! - -When TeX encounters this \\gnu command, it will keep chasing its tail -trying to figure out what \\gnu should produce, and eventually run out -of ``input stack''. - -main memory size -================ -This is one kind of space that TeX can run out of when processing a -short file. There are three ways you can run TeX out of main memory -space: (1) defining a lot of very long, complicated commands, (2) -making an index or glossary and having too many \\index or \\glossary -commands on a single page, and (3) creating so complicated a page of -output that TeX can't hold all the information needed to generate it. -The solution to the first two problems is obvious: define fewer -commands or use fewer \\index and \\glossary commands. The third problem -is nastier. It can be caused by large tabbing, tabular, array, and -picture environments. TeX's space may also be filled up with figures -and tables waiting for a place to go. To find out if you've really -exceeded TeX's capacity in this way, put a \\clearpage command in your -input file right before the place where TeX ran out of room and try -running it again. If it doesn't run out of room with the \\clearpage -command there, then you did exceed TeX's capacity. If it still runs -out of room, then there's probably an error in your file. If TeX is -really out of room, you must give it some help. Remember that TeX -processes a complete paragraph before deciding whether to cut the -page. Inserting a \\newpage command in the middle of the paragraph, -where TeX should break the page, may save the day by letting TeX write -the current page before processing the rest of the paragraph. (A -\\pagebreak command won't help.) If the problem is caused by -accumulated figures and tables, you can try to prevent them from -accumulating---either by moving them further towards the end of the -document or by trying to get them to come out sooner. If you are -still writing the document, simply add a \\clearpage command and forget -about the problem until you're ready to produce the final version. -Changes to the input file are likely to make the problem go away. - -pool size -========= -You probably used too many cross-ref-erencing \\labels and/or defined -too many new command names. More precisely, the labels and command -names that you define have too many characters, so this problem can be -solved by using shorter names. However, the error can also be caused -by omitting the right brace that ends the argument of either a counter -command such as \\setcounter, or a \\newenvironment or \\newtheorem -command. - -save size -========= -This occurs when commands, environments, and the scopes of -declarations are nested too deeply---for example, by having the -argument of a \\multiput command contain a picture environment that in -turn has a \\footnotesize declaration whose scope contains a \\multiput -command containing a ....") - - ("Text line contains an invalid character." . - "The input contains some strange character that it shouldn't. A mistake -when creating the file probably caused your text editor to insert this -character. Exactly what could have happened depends upon what text -editor you used. If examining the input file doesn't reveal the -offending character, consult the Local Guide for suggestions.") - - ("Undefined control sequence." . - "TeX encountered an unknown command name. You probably misspelled the -name. If this message occurs when a LaTeX command is being processed, -the command is probably in the wrong place---for example, the error -can be produced by an \\item command that's not inside a list-making -environment. The error can also be caused by a missing \\documentclass -command.") - - ("Use of [^ ]* doesn't match its definition." . - "It's probably one of the picture-drawing commands, and you have used -the wrong syntax for specifying an argument. If it's \\@array that -doesn't match its definition, then there is something wrong in an -@-expression in the argument of an array or tabular -environment---perhaps a fragile command that is not \\protect'ed.") - - ("You can't use `macro parameter character \\#' in [^ ]* mode." . - "The special character # has appeared in ordinary text. You probably -meant to type \\#.") - - ("Overfull \\\\hbox .*" . - "Because it couldn't find a good place for a line break, TeX put more -on this line than it should.") - - ("Overfull \\\\vbox .*" . - "Because it couldn't find a good place for a page break, TeX put more -on the page than it should. ") - - ("Underfull \\\\hbox .*" . - "Check your output for extra vertical space. If you find some, it was -probably caused by a problem with a \\\\ or \\newline command---for -example, two \\\\ commands in succession. This warning can also be -caused by using the sloppypar environment or \\sloppy declaration, or -by inserting a \\linebreak command.") - - ("Underfull \\\\vbox .*" . - "TeX could not find a good place to break the page, so it produced a -page without enough text on it. ") - - ;; New list items should be placed here - ;; - ;; ("err-regexp" . "context") - ;; - ;; the err-regexp item should match anything - - (".*" . "No help available")) ; end definition - "Help messages for errors in LaTeX mode. -Used as buffer local value of `TeX-error-description-list-local'. -See its doc string for detail.") - -;;; Mode - -(defgroup LaTeX-macro nil - "Special support for LaTeX macros in AUCTeX." - :prefix "TeX-" - :group 'LaTeX - :group 'TeX-macro) - -(defcustom TeX-arg-cite-note-p nil - "If non-nil, ask for optional note in citations." - :type 'boolean - :group 'LaTeX-macro) - -(defcustom TeX-arg-footnote-number-p nil - "If non-nil, ask for optional number in footnotes." - :type 'boolean - :group 'LaTeX-macro) - -(defcustom TeX-arg-item-label-p nil - "If non-nil, always ask for optional label in items. -Otherwise, only ask in description environments." - :type 'boolean - :group 'LaTeX-macro) - -(defcustom TeX-arg-right-insert-p t - "If non-nil, always insert automatically the corresponding \\right. -This happens when \\left is inserted." - :type 'boolean - :group 'LaTeX-macro) - -(defcustom LaTeX-mode-hook nil - "A hook run in LaTeX mode buffers." - :type 'hook - :group 'LaTeX) - -(TeX-abbrev-mode-setup latex-mode) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.drv\\'" . latex-mode) t) ;; append to the end of `auto-mode-alist' to give higher priority to Guix/Nix's derivation modes - -;; HeVeA files (LaTeX -> HTML converter: http://hevea.inria.fr/) -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.hva\\'" . latex-mode)) - -(declare-function LaTeX-preview-setup "preview") - -;;;###autoload -(defun TeX-latex-mode () - ;; FIXME: Use `define-derived-mode'. - "Major mode in AUCTeX for editing LaTeX files. -See info under AUCTeX for full documentation. - -Special commands: -\\{LaTeX-mode-map} - -Entering LaTeX mode calls the value of `text-mode-hook', -then the value of `TeX-mode-hook', and then the value -of `LaTeX-mode-hook'." - (interactive) - (LaTeX-common-initialization) - (setq TeX-base-mode-name "LaTeX") - (setq major-mode 'latex-mode) - (setq TeX-command-default "LaTeX") - (setq TeX-sentinel-default-function #'TeX-LaTeX-sentinel) - (add-hook 'tool-bar-mode-hook #'LaTeX-maybe-install-toolbar nil t) - (LaTeX-maybe-install-toolbar) - ;; Set the value of `LaTeX-using-Biber' based on the local value of - ;; `LaTeX-biblatex-use-Biber'. This should be run within - ;; `TeX-update-style-hook' before toolbarx-refresh, otherwise the bibliography - ;; button could be wrongly set. - (add-hook 'TeX-update-style-hook - (lambda () - (if (local-variable-p 'LaTeX-biblatex-use-Biber (current-buffer)) - (setq LaTeX-using-Biber LaTeX-biblatex-use-Biber))) - nil t) - - ;; Run style hooks associated with class options. - (add-hook 'TeX-update-style-hook - (lambda () - (let ((TeX-style-hook-dialect :classopt) - ;; Don't record class option names in - ;; `TeX-active-styles'. - (TeX-active-styles nil)) - (apply #'TeX-run-style-hooks - (apply #'append - (mapcar #'cdr LaTeX-provided-class-options))))) - nil t) - (run-mode-hooks 'text-mode-hook 'TeX-mode-hook 'LaTeX-mode-hook) - (when (fboundp 'LaTeX-preview-setup) - (LaTeX-preview-setup)) - (TeX-set-mode-name) - ;; Defeat filladapt - (if (and (boundp 'filladapt-mode) - filladapt-mode) - (turn-off-filladapt-mode)) - (when (< 25 emacs-major-version) - ;; Set up flymake backend, see latex-flymake.el - (add-hook 'flymake-diagnostic-functions #'LaTeX-flymake nil t))) - -(TeX-abbrev-mode-setup doctex-mode) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.dtx\\'" . doctex-mode)) - -;;;###autoload -(define-derived-mode docTeX-mode TeX-latex-mode "docTeX" - "Major mode in AUCTeX for editing .dtx files derived from `LaTeX-mode'. -Runs `LaTeX-mode', sets a few variables and -runs the hooks in `docTeX-mode-hook'." - :abbrev-table doctex-mode-abbrev-table - (setq major-mode 'doctex-mode) - (set (make-local-variable 'LaTeX-insert-into-comments) t) - (set (make-local-variable 'LaTeX-syntactic-comments) t) - (setq TeX-default-extension docTeX-default-extension) - ;; Make filling and indentation aware of DocStrip guards. - (setq paragraph-start (concat paragraph-start "\\|%<") - paragraph-separate (concat paragraph-separate "\\|%<") - TeX-comment-start-regexp "\\(?:%\\(?:<[^>]+>\\)?\\)") - (setq TeX-base-mode-name "docTeX") - (TeX-set-mode-name) - (funcall TeX-install-font-lock)) - -;;This is actually a mess: to fit the scheme properly, our derived -;;mode definition would have had to be made for TeX-doctex-mode in the -;;first place, but then we could not have used define-derived-mode, or -;;all mode-specific variables would have gotten non-AUCTeX names. -;;This solution has the advantage that documentation strings are -;;provided in the autoloads, and has the disadvantage that docTeX-mode -;;is not aliased to doctex-mode (not even when the AUCTeX version is -;;disabled) as would be normal for our scheme. - -;;;###autoload -(defalias 'TeX-doctex-mode #'docTeX-mode) - -(defcustom docTeX-clean-intermediate-suffixes - TeX-clean-default-intermediate-suffixes - "List of regexps matching suffixes of files to be deleted. -The regexps will be anchored at the end of the file name to be matched, -that is, you do _not_ have to cater for this yourself by adding \\\\\\=' or $." - :type '(repeat regexp) - :group 'TeX-command) - -(defcustom docTeX-clean-output-suffixes TeX-clean-default-output-suffixes - "List of regexps matching suffixes of files to be deleted. -The regexps will be anchored at the end of the file name to be matched, -that is, you do _not_ have to cater for this yourself by adding \\\\\\=' or $." - :type '(repeat regexp) - :group 'TeX-command) - -(defcustom LaTeX-clean-intermediate-suffixes - (append TeX-clean-default-intermediate-suffixes - ;; These are extensions of files created by makeglossaries. - '("\\.acn" "\\.acr" "\\.alg" "\\.glg" "\\.ist")) - "List of regexps matching suffixes of files to be deleted. -The regexps will be anchored at the end of the file name to be matched, -that is, you do _not_ have to cater for this yourself by adding \\\\\\=' or $." - :type '(repeat regexp) - :group 'TeX-command) - -(defcustom LaTeX-clean-output-suffixes TeX-clean-default-output-suffixes - "List of regexps matching suffixes of files to be deleted. -The regexps will be anchored at the end of the file name to be matched, -that is, you do _not_ have to cater for this yourself by adding \\\\\\=' or $." - :type '(repeat regexp) - :group 'TeX-command) - -(defun LaTeX--after-math-macro-prefix-p () - "Return non-nil if point is after a macro prefix in math mode. -Also sets `match-data' so that group 1 is the already typed -prefix. - -For example, in $a + \\a| - 17$ with | denoting point, the -function would return non-nil and `(match-string 1)' would return -\"a\" afterwards." - (and (texmathp) - (TeX-looking-at-backward "\\\\\\([a-zA-Z]*\\)"))) - -(defun LaTeX-common-initialization () - "Common initialization for LaTeX derived modes." - (VirTeX-common-initialization) - (set-syntax-table LaTeX-mode-syntax-table) - (set (make-local-variable 'indent-line-function) #'LaTeX-indent-line) - - (setq local-abbrev-table latex-mode-abbrev-table) - - ;; Filling - (set (make-local-variable 'paragraph-ignore-fill-prefix) t) - (set (make-local-variable 'fill-paragraph-function) #'LaTeX-fill-paragraph) - (set (make-local-variable 'adaptive-fill-mode) nil) - - (or LaTeX-largest-level - (setq LaTeX-largest-level (LaTeX-section-level "section"))) - - (setq TeX-header-end LaTeX-header-end - TeX-trailer-start LaTeX-trailer-start) - (set (make-local-variable 'TeX-style-hook-dialect) TeX-dialect) - - (require 'outline) - (set (make-local-variable 'outline-level) #'LaTeX-outline-level) - (set (make-local-variable 'outline-regexp) (LaTeX-outline-regexp t)) - (when (boundp 'outline-heading-alist) - (setq outline-heading-alist - (mapcar (lambda (x) - (cons (concat "\\" (nth 0 x)) (nth 1 x))) - LaTeX-section-list))) - - (setq-local TeX-auto-full-regexp-list - (delete-dups (append LaTeX-auto-regexp-list - ;; Prevent inadvertent destruction - ;; of `plain-TeX-auto-regexp-list'. - (copy-sequence - plain-TeX-auto-regexp-list)))) - - (LaTeX-set-paragraph-start) - (setq paragraph-separate - (concat - "[ \t]*%*[ \t]*\\(" - "\\$\\$" ; Plain TeX display math - "\\|$\\)")) - - (setq TeX-verbatim-p-function #'LaTeX-verbatim-p) - (setq TeX-search-forward-comment-start-function - #'LaTeX-search-forward-comment-start) - (set (make-local-variable 'TeX-search-files-type-alist) - LaTeX-search-files-type-alist) - - (setq-local beginning-of-defun-function #'LaTeX-find-matching-begin) - (setq-local end-of-defun-function #'LaTeX-find-matching-end) - - (LaTeX-indent-commands-regexp-make) - - (set (make-local-variable 'LaTeX-item-list) '(("description" . LaTeX-item-argument) - ("thebibliography" . LaTeX-item-bib) - ("array" . LaTeX-item-array) - ("tabular" . LaTeX-item-array) - ("tabular*" . LaTeX-item-tabular*))) - - (setq TeX-complete-list - (append '(("\\\\cite\\[[^]\n\r\\%]*\\]{\\([^{}\n\r\\%,]*\\)" - 1 LaTeX-bibitem-list "}") - ("\\\\cite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}") - ("\\\\cite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)" - 2 LaTeX-bibitem-list) - ("\\\\nocite{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-bibitem-list "}") - ("\\\\nocite{\\([^{}\n\r\\%]*,\\)\\([^{}\n\r\\%,]*\\)" - 2 LaTeX-bibitem-list) - ("\\\\[Rr]ef{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}") - ("\\\\eqref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}") - ("\\\\pageref{\\([^{}\n\r\\%,]*\\)" 1 LaTeX-label-list "}") - ("\\\\\\(index\\|glossary\\){\\([^{}\n\r\\%]*\\)" - 2 LaTeX-index-entry-list "}") - ("\\\\begin{\\([A-Za-z]*\\)" 1 LaTeX-environment-list-filtered "}") - ("\\\\end{\\([A-Za-z]*\\)" 1 LaTeX-environment-list-filtered "}") - ("\\\\renewcommand\\*?{\\\\\\([A-Za-z]*\\)" - 1 TeX-symbol-list-filtered "}") - ("\\\\renewenvironment\\*?{\\([A-Za-z]*\\)" - 1 LaTeX-environment-list-filtered "}") - ("\\\\\\(this\\)?pagestyle{\\([A-Za-z]*\\)" - 2 LaTeX-pagestyle-list "}") - (LaTeX--after-math-macro-prefix-p - 1 (lambda () - (append (mapcar #'cadr LaTeX-math-list) - (mapcar #'cadr LaTeX-math-default))) - (if TeX-insert-braces "{}"))) - TeX-complete-list)) - - (LaTeX-add-environments - '("document" LaTeX-env-document) - '("enumerate" LaTeX-env-item) - '("itemize" LaTeX-env-item) - '("list" LaTeX-env-list) - '("trivlist" LaTeX-env-item) - '("picture" LaTeX-env-picture) - '("tabular" LaTeX-env-array) - '("tabular*" LaTeX-env-tabular*) - '("array" LaTeX-env-array) - '("eqnarray" LaTeX-env-label) - '("equation" LaTeX-env-label) - '("minipage" LaTeX-env-minipage) - - ;; The following have no special support, but are included in - ;; case the auto files are missing. - - "sloppypar" "tabbing" "verbatim" "verbatim*" - "flushright" "flushleft" "displaymath" "math" "quote" "quotation" - "center" "titlepage" "verse" "eqnarray*" - - ;; The following are not defined in latex.el, but in a number of - ;; other style files. I'm to lazy to copy them to all the - ;; corresponding .el files right now. - - ;; This means that AUCTeX will complete e.g. - ;; ``thebibliography'' in a letter, but I guess we can live with - ;; that. - - '("description" LaTeX-env-item) - '("figure" LaTeX-env-figure) - '("figure*" LaTeX-env-figure) - '("table" LaTeX-env-figure) - '("table*" LaTeX-env-figure) - '("thebibliography" LaTeX-env-bib) - '("theindex" LaTeX-env-item)) - - ;; `latex.ltx' defines `plain' and `empty' pagestyles - (LaTeX-add-pagestyles "plain" "empty") - - ;; `latex.ltx' defines the following counters - (LaTeX-add-counters "page" "equation" "enumi" "enumii" "enumiii" - "enumiv" "footnote" "mpfootnote") - - (LaTeX-add-lengths "arraycolsep" "arrayrulewidth" "baselineskip" "baselinestretch" - "bibindent" "columnsep" "columnseprule" "columnwidth" "doublerulesep" - "evensidemargin" "linewidth" "oddsidemargin" "paperwidth" - "paperheight" "parindent" "parskip" "tabcolsep" - "textheight" "textwidth" "topmargin" "unitlength") - - (TeX-add-symbols - '("addtocounter" TeX-arg-counter "Value") - '("alph" TeX-arg-counter) - '("arabic" TeX-arg-counter) - '("fnsymbol" TeX-arg-counter) - '("newcounter" TeX-arg-define-counter - [ TeX-arg-counter "Within counter" ]) - '("roman" TeX-arg-counter) - '("setcounter" TeX-arg-counter "Value") - '("usecounter" TeX-arg-counter) - '("value" TeX-arg-counter) - '("stepcounter" TeX-arg-counter) - '("refstepcounter" TeX-arg-counter) - '("label" TeX-arg-define-label) - '("pageref" TeX-arg-ref) - '("ref" TeX-arg-ref) - ;; \Ref and \labelformat are part of kernel with LaTeX 2019-10-01: - '("Ref" TeX-arg-ref) - '("labelformat" TeX-arg-counter t) - ;; \footref is part of kernel with LaTeX 2021-06-01: - '("footref" TeX-arg-ref) - '("newcommand" TeX-arg-define-macro [ TeX-arg-define-macro-arguments ] t) - '("renewcommand" TeX-arg-macro [ TeX-arg-define-macro-arguments ] t) - '("newenvironment" TeX-arg-define-environment - [ "Number of arguments"] t t) - '("renewenvironment" TeX-arg-environment - [ "Number of arguments"] t t) - '("providecommand" TeX-arg-define-macro [ TeX-arg-define-macro-arguments ] t) - '("providecommand*" TeX-arg-define-macro [ TeX-arg-define-macro-arguments ] t) - '("newcommand*" TeX-arg-define-macro [ TeX-arg-define-macro-arguments ] t) - '("renewcommand*" TeX-arg-macro [ TeX-arg-define-macro-arguments ] t) - '("newenvironment*" TeX-arg-define-environment - [ "Number of arguments"] t t) - '("renewenvironment*" TeX-arg-environment - [ "Number of arguments"] t t) - '("newtheorem" TeX-arg-define-environment - [ TeX-arg-environment "Numbered like" ] - t [ (TeX-arg-eval progn (if (eq (save-excursion - (backward-char 2) - (preceding-char)) ?\]) - () - (TeX-arg-counter t "Within counter")) - "") ]) - '("newfont" TeX-arg-define-macro t) - '("circle" "Diameter") - '("circle*" "Diameter") - '("dashbox" "Dash Length" TeX-arg-size - [ TeX-arg-corner ] t) - '("frame" t) - '("framebox" (TeX-arg-conditional - (string-equal (LaTeX-current-environment) "picture") - (TeX-arg-size [ TeX-arg-corner ] t) - ([ "Length" ] [ TeX-arg-lr ] t))) - '("line" (TeX-arg-pair "X slope" "Y slope") "Length") - '("linethickness" "Dimension") - '("makebox" (TeX-arg-conditional - (string-equal (LaTeX-current-environment) "picture") - (TeX-arg-size [ TeX-arg-corner ] t) - ([ "Length" ] [ TeX-arg-lr ] t))) - '("multiput" - TeX-arg-coordinate - (TeX-arg-pair "X delta" "Y delta") - "Number of copies" - t) - '("oval" TeX-arg-size [ TeX-arg-corner "Portion" ]) - '("put" TeX-arg-coordinate t) - '("savebox" TeX-arg-savebox - (TeX-arg-conditional - (string-equal (LaTeX-current-environment) "picture") - (TeX-arg-size [ TeX-arg-corner ] t) - ([ "Length" ] [ TeX-arg-lr ] t))) - '("shortstack" [ TeX-arg-lr ] t) - '("vector" (TeX-arg-pair "X slope" "Y slope") "Length") - '("cline" "Span `i-j'") - '("multicolumn" "Columns" "Format" t) - '("item" - (TeX-arg-conditional (or TeX-arg-item-label-p - (string-equal (LaTeX-current-environment) - "description")) - ([ "Item label" ]) - ()) - (TeX-arg-literal " ")) - '("bibitem" [ "Bibitem label" ] TeX-arg-define-cite) - '("cite" - (TeX-arg-conditional TeX-arg-cite-note-p ([ "Note" ]) ()) - TeX-arg-cite) - '("nocite" TeX-arg-cite) - '("bibliographystyle" TeX-arg-bibstyle) - '("bibliography" TeX-arg-bibliography) - '("newblock" (TeX-arg-literal " ")) - '("footnote" - (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil) - t) - '("footnotetext" - (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil) - t) - '("footnotemark" - (TeX-arg-conditional TeX-arg-footnote-number-p ([ "Number" ]) nil)) - '("newlength" (TeX-arg-define-length "Length macro")) - '("setlength" (TeX-arg-length "Length macro" nil "\\") - (TeX-arg-length "Length value")) - '("addtolength" (TeX-arg-length "Length macro" nil "\\") - (TeX-arg-length "Length to add")) - '("settowidth" (TeX-arg-length "Length macro" nil "\\") "Text") - '("settoheight" (TeX-arg-length "Length macro" nil "\\") "Text") - '("settodepth" (TeX-arg-length "Length macro" nil "\\") "Text") - '("\\" [ "Space" ]) - '("\\*" [ "Space" ]) - '("hyphenation" t) - '("linebreak" [ "How much [0 - 4]" ]) - '("nolinebreak" [ "How much [0 - 4]" ]) - '("nopagebreak" [ "How much [0 - 4]" ]) - '("pagebreak" [ "How much [0 - 4]" ]) - '("stackrel" t nil) - '("frac" t nil) - '("lefteqn" t) - '("overbrace" t) - '("overline" t) - '("overleftarrow" t) - '("overrightarrow" t) - '("sqrt" [ "Root" ] t) - '("underbrace" t) - '("underline" t) - '("acute" t) '("grave" t) '("ddot" t) '("tilde" t) '("bar" t) - '("breve" t) '("check" t) '("hat" t) '("vec" t) '("dot" t) - '("widetilde" t) '("widehat" t) - '("author" LaTeX-arg-author) - '("date" TeX-arg-date) - '("thanks" t) - '("title" t) - '("pagenumbering" (TeX-arg-eval - completing-read "Numbering style: " - '(("arabic") ("roman") ("Roman") ("alph") ("Alph")))) - '("pagestyle" TeX-arg-pagestyle) - '("markboth" t nil) - '("markright" t) - '("thispagestyle" TeX-arg-pagestyle) - '("addvspace" TeX-arg-length) - '("fbox" t) - '("hspace*" TeX-arg-length) - '("hspace" TeX-arg-length) - '("mbox" t) - '("newsavebox" TeX-arg-define-savebox) - '("parbox" - [TeX-arg-tb nil center] - [TeX-arg-length "Height"] - [TeX-arg-tb "Inner position" stretch] - (TeX-arg-length "Width") - t) - '("raisebox" "Raise" [ "Height above" ] [ "Depth below" ] t) - '("rule" [ "Raise" ] "Width" "Thickness") - '("sbox" TeX-arg-savebox t) - '("usebox" TeX-arg-savebox) - '("vspace*" TeX-arg-length) - '("vspace" TeX-arg-length) - '("documentstyle" TeX-arg-document) - '("include" (TeX-arg-input-file "File" t)) - '("includeonly" t) - '("input" TeX-arg-input-file) - '("addcontentsline" - (TeX-arg-eval completing-read "File: " '(("toc") ("lof") ("lot"))) - (TeX-arg-eval completing-read "Numbering style: " LaTeX-section-list) t) - '("addtocontents" - (TeX-arg-eval completing-read "File: " '(("toc") ("lof") ("lot"))) t) - '("typeout" t) - '("typein" [ TeX-arg-define-macro ] t) - '("verb" TeX-arg-verb) - '("verb*" TeX-arg-verb) - '("extracolsep" t) - '("index" TeX-arg-index) - '("glossary" TeX-arg-index) - '("numberline" "Section number" "Heading") - '("caption" t) - '("marginpar" [ "Left margin text" ] "Text") - '("left" TeX-arg-insert-braces) - ;; The following 4 macros are not specific to amsmath. - '("bigl" TeX-arg-insert-braces) - '("Bigl" TeX-arg-insert-braces) - '("biggl" TeX-arg-insert-braces) - '("Biggl" TeX-arg-insert-braces) - - '("langle" TeX-arg-insert-right-brace-maybe) - '("lceil" TeX-arg-insert-right-brace-maybe) - '("lfloor" TeX-arg-insert-right-brace-maybe) - - ;; These have no special support, but are included in case the - ;; auto files are missing. - - "TeX" "LaTeX" - "samepage" "newline" - "smallskip" "medskip" "bigskip" "fill" "stretch" - "thinspace" "negthinspace" "enspace" "enskip" "quad" "qquad" - "nonumber" "centering" "raggedright" - "raggedleft" "kill" "pushtabs" "poptabs" "protect" "arraystretch" - "hline" "vline" "cline" "thinlines" "thicklines" "and" "makeindex" - "makeglossary" "reversemarginpar" "normalmarginpar" - "raggedbottom" "flushbottom" "sloppy" "fussy" "newpage" - "clearpage" "cleardoublepage" "twocolumn" "onecolumn" - - "maketitle" "tableofcontents" "listoffigures" "listoftables" - '("tiny" -1) '("scriptsize" -1) '("footnotesize" -1) '("small" -1) - '("normalsize" -1) '("large" -1) '("Large" -1) '("LARGE" -1) '("huge" -1) - '("Huge" -1) - '("oldstylenums" "Numbers") - ;; The next macro is provided by LaTeX2e 2020-02-02 release: - '("legacyoldstylenums" "Numbers") - "pounds" "copyright" - "hfil" "hfill" "vfil" "vfill" "hrulefill" "dotfill" - "indent" "noindent" "today" - "appendix" - "dots" - "makeatletter" "makeatother" "jobname") - - (when (string-equal LaTeX-version "2e") - (LaTeX-add-environments - '("filecontents" LaTeX-env-contents) - '("filecontents*" LaTeX-env-contents)) - - (TeX-add-symbols - '("enlargethispage" (TeX-arg-length nil "1.0\\baselineskip")) - '("enlargethispage*" (TeX-arg-length nil "1.0\\baselineskip")) - '("tabularnewline" [ TeX-arg-length ]) - '("suppressfloats" [ TeX-arg-tb "Suppress floats position" ]) - '("ensuremath" "Math commands") - '("textsuperscript" "Text") - '("textsubscript" "Text") - '("textcircled" "Text") - '("mathring" t) - '("MakeUppercase" t) - '("MakeLowercase" t) - '("chaptermark" "Text") - '("sectionmark" "Text") - '("subsectionmark" "Text") - '("subsubsectionmark" "Text") - '("paragraphmark" "Text") - '("subparagraphmark" "Text") - - "LaTeXe" - "listfiles" "frontmatter" "mainmatter" "backmatter" - "leftmark" "rightmark" - "textcompwordmark" "textvisiblespace" "textemdash" "textendash" - "textexclamdown" "textquestiondown" "textquotedblleft" - "textquotedblright" "textquoteleft" "textquoteright" - "textbackslash" "textbar" "textless" "textgreater" - "textasciicircum" "textasciitilde" - - ;; With the advent of LaTeX2e release 2020-02-02, all symbols - ;; provided by textcomp.sty are available out of the box by the - ;; kernel. The next block is moved here from textcomp.el: - "capitalgrave" ; Type: Accent -- Slot: 0 - "capitalacute" ; Type: Accent -- Slot: 1 - "capitalcircumflex" ; Type: Accent -- Slot: 2 - "capitaltilde" ; Type: Accent -- Slot: 3 - "capitaldieresis" ; Type: Accent -- Slot: 4 - "capitalhungarumlaut" ; Type: Accent -- Slot: 5 - "capitalring" ; Type: Accent -- Slot: 6 - "capitalcaron" ; Type: Accent -- Slot: 7 - "capitalbreve" ; Type: Accent -- Slot: 8 - "capitalmacron" ; Type: Accent -- Slot: 9 - "capitaldotaccent" ; Type: Accent -- Slot: 10 - "textquotestraightbase" ; Type: Symbol -- Slot: 13 - "textquotestraightdblbase" ; Type: Symbol -- Slot: 18 - "texttwelveudash" ; Type: Symbol -- Slot: 21 - "textthreequartersemdash" ; Type: Symbol -- Slot: 22 - "textcapitalcompwordmark" ; Type: Symbol -- Slot: 23 - "textleftarrow" ; Type: Symbol -- Slot: 24 - "textrightarrow" ; Type: Symbol -- Slot: 25 - "t" ; Type: Accent -- Slot: 26 - "capitaltie" ; Type: Accent -- Slot: 27 - "newtie" ; Type: Accent -- Slot: 28 - "capitalnewtie" ; Type: Accent -- Slot: 29 - "textascendercompwordmark" ; Type: Symbol -- Slot: 31 - "textblank" ; Type: Symbol -- Slot: 32 - "textdollar" ; Type: Symbol -- Slot: 36 - "textquotesingle" ; Type: Symbol -- Slot: 39 - "textasteriskcentered" ; Type: Symbol -- Slot: 42 - "textdblhyphen" ; Type: Symbol -- Slot: 45 - "textfractionsolidus" ; Type: Symbol -- Slot: 47 - "textzerooldstyle" ; Type: Symbol -- Slot: 48 - "textoneoldstyle" ; Type: Symbol -- Slot: 49 - "texttwooldstyle" ; Type: Symbol -- Slot: 50 - "textthreeoldstyle" ; Type: Symbol -- Slot: 51 - "textfouroldstyle" ; Type: Symbol -- Slot: 52 - "textfiveoldstyle" ; Type: Symbol -- Slot: 53 - "textsixoldstyle" ; Type: Symbol -- Slot: 54 - "textsevenoldstyle" ; Type: Symbol -- Slot: 55 - "texteightoldstyle" ; Type: Symbol -- Slot: 56 - "textnineoldstyle" ; Type: Symbol -- Slot: 57 - "textlangle" ; Type: Symbol -- Slot: 60 - "textminus" ; Type: Symbol -- Slot: 61 - "textrangle" ; Type: Symbol -- Slot: 62 - "textmho" ; Type: Symbol -- Slot: 77 - "textbigcircle" ; Type: Symbol -- Slot: 79 - "textohm" ; Type: Symbol -- Slot: 87 - "textlbrackdbl" ; Type: Symbol -- Slot: 91 - "textrbrackdbl" ; Type: Symbol -- Slot: 93 - "textuparrow" ; Type: Symbol -- Slot: 94 - "textdownarrow" ; Type: Symbol -- Slot: 95 - "textasciigrave" ; Type: Symbol -- Slot: 96 - "textborn" ; Type: Symbol -- Slot: 98 - "textdivorced" ; Type: Symbol -- Slot: 99 - "textdied" ; Type: Symbol -- Slot: 100 - "textleaf" ; Type: Symbol -- Slot: 108 - "textmarried" ; Type: Symbol -- Slot: 109 - "textmusicalnote" ; Type: Symbol -- Slot: 110 - "texttildelow" ; Type: Symbol -- Slot: 126 - "textdblhyphenchar" ; Type: Symbol -- Slot: 127 - "textasciibreve" ; Type: Symbol -- Slot: 128 - "textasciicaron" ; Type: Symbol -- Slot: 129 - "textacutedbl" ; Type: Symbol -- Slot: 130 - "textgravedbl" ; Type: Symbol -- Slot: 131 - "textdagger" ; Type: Symbol -- Slot: 132 - "textdaggerdbl" ; Type: Symbol -- Slot: 133 - "textbardbl" ; Type: Symbol -- Slot: 134 - "textperthousand" ; Type: Symbol -- Slot: 135 - "textbullet" ; Type: Symbol -- Slot: 136 - "textcelsius" ; Type: Symbol -- Slot: 137 - "textdollaroldstyle" ; Type: Symbol -- Slot: 138 - "textcentoldstyle" ; Type: Symbol -- Slot: 139 - "textflorin" ; Type: Symbol -- Slot: 140 - "textcolonmonetary" ; Type: Symbol -- Slot: 141 - "textwon" ; Type: Symbol -- Slot: 142 - "textnaira" ; Type: Symbol -- Slot: 143 - "textguarani" ; Type: Symbol -- Slot: 144 - "textpeso" ; Type: Symbol -- Slot: 145 - "textlira" ; Type: Symbol -- Slot: 146 - "textrecipe" ; Type: Symbol -- Slot: 147 - "textinterrobang" ; Type: Symbol -- Slot: 148 - "textinterrobangdown" ; Type: Symbol -- Slot: 149 - "textdong" ; Type: Symbol -- Slot: 150 - "texttrademark" ; Type: Symbol -- Slot: 151 - "textpertenthousand" ; Type: Symbol -- Slot: 152 - "textpilcrow" ; Type: Symbol -- Slot: 153 - "textbaht" ; Type: Symbol -- Slot: 154 - "textnumero" ; Type: Symbol -- Slot: 155 - "textdiscount" ; Type: Symbol -- Slot: 156 - "textestimated" ; Type: Symbol -- Slot: 157 - "textopenbullet" ; Type: Symbol -- Slot: 158 - "textservicemark" ; Type: Symbol -- Slot: 159 - "textlquill" ; Type: Symbol -- Slot: 160 - "textrquill" ; Type: Symbol -- Slot: 161 - "textcent" ; Type: Symbol -- Slot: 162 - "textsterling" ; Type: Symbol -- Slot: 163 - "textcurrency" ; Type: Symbol -- Slot: 164 - "textyen" ; Type: Symbol -- Slot: 165 - "textbrokenbar" ; Type: Symbol -- Slot: 166 - "textsection" ; Type: Symbol -- Slot: 167 - "textasciidieresis" ; Type: Symbol -- Slot: 168 - "textcopyright" ; Type: Symbol -- Slot: 169 - "textordfeminine" ; Type: Symbol -- Slot: 170 - "textcopyleft" ; Type: Symbol -- Slot: 171 - "textlnot" ; Type: Symbol -- Slot: 172 - "textcircledP" ; Type: Symbol -- Slot: 173 - "textregistered" ; Type: Symbol -- Slot: 174 - "textasciimacron" ; Type: Symbol -- Slot: 175 - "textdegree" ; Type: Symbol -- Slot: 176 - "textpm" ; Type: Symbol -- Slot: 177 - "texttwosuperior" ; Type: Symbol -- Slot: 178 - "textthreesuperior" ; Type: Symbol -- Slot: 179 - "textasciiacute" ; Type: Symbol -- Slot: 180 - "textmu" ; Type: Symbol -- Slot: 181 - "textparagraph" ; Type: Symbol -- Slot: 182 - "textperiodcentered" ; Type: Symbol -- Slot: 183 - "textreferencemark" ; Type: Symbol -- Slot: 184 - "textonesuperior" ; Type: Symbol -- Slot: 185 - "textordmasculine" ; Type: Symbol -- Slot: 186 - "textsurd" ; Type: Symbol -- Slot: 187 - "textonequarter" ; Type: Symbol -- Slot: 188 - "textonehalf" ; Type: Symbol -- Slot: 189 - "textthreequarters" ; Type: Symbol -- Slot: 190 - "texteuro" ; Type: Symbol -- Slot: 191 - "texttimes" ; Type: Symbol -- Slot: 214 - "textdiv" ; Type: Symbol -- Slot: 246 - '("textcircled" 1) ; Type: Command -- Slot: N/A - '("capitalcedilla" 1) ; Type: Command -- Slot: N/A - '("capitalogonek" 1) ; Type: Command -- Slot: N/A - - "rmfamily" "sffamily" "ttfamily" - '("mdseries" -1) '("bfseries" -1) - '("itshape" -1) '("slshape" -1) - '("upshape" -1) '("scshape" -1) - '("eminnershape" -1) - ;; The next 3 were added to LaTeX kernel with 2020-02-02 release: - '("sscshape" -1) '("swshape" -1) '("ulcshape" -1) - ;; These are for the default settings: - "sscdefault" "swdefault" "ulcdefault" - ;; This macro is for `spaced small caps'. Currently, only some - ;; commercial fonts offer this. It should be moved into - ;; `LaTeX-font-list' once it is needed more frequently. - '("textssc" t) - ;; User level reset macros: - '("normalfont" -1) '("normalshape" -1) - - ;; LaTeX hook macros: - '("AddToHook" TeX-arg-hook [ "Label" ] t) - '("RemoveFromHook" TeX-arg-hook [ "Label" ]) - '("AddToHookNext" TeX-arg-hook t) - - ;; Added in LaTeX 2021-11-15 - '("counterwithin" - [TeX-arg-eval completing-read - (TeX-argument-prompt t nil "Format") - '("\\arabic" "\\roman" "\\Roman" "\\alph" "\\Alph")] - (TeX-arg-counter) - (TeX-arg-counter "Within counter")) - '("counterwithin*" - [TeX-arg-eval completing-read - (TeX-argument-prompt t nil "Format") - '("\\arabic" "\\roman" "\\Roman" "\\alph" "\\Alph")] - (TeX-arg-counter) - (TeX-arg-counter "Within counter")) - - '("counterwithout" - [TeX-arg-eval completing-read - (TeX-argument-prompt t nil "Format") - '("\\arabic" "\\roman" "\\Roman" "\\alph" "\\Alph")] - (TeX-arg-counter) - (TeX-arg-counter "Within counter")) - '("counterwithout*" - [TeX-arg-eval completing-read - (TeX-argument-prompt t nil "Format") - '("\\arabic" "\\roman" "\\Roman" "\\alph" "\\Alph")] - (TeX-arg-counter) - (TeX-arg-counter "Within counter")))) - - (TeX-run-style-hooks "LATEX") - - (make-local-variable 'TeX-font-list) - (make-local-variable 'TeX-font-replace-function) - (if (string-equal LaTeX-version "2") - () - (setq TeX-font-list LaTeX-font-list) - (setq TeX-font-replace-function #'TeX-font-replace-macro) - (TeX-add-symbols - '("newcommand" TeX-arg-define-macro - [ TeX-arg-define-macro-arguments ] t) - '("renewcommand" TeX-arg-macro - [ TeX-arg-define-macro-arguments ] t) - '("providecommand" TeX-arg-define-macro - [ TeX-arg-define-macro-arguments ] t) - '("providecommand*" TeX-arg-define-macro - [ TeX-arg-define-macro-arguments ] t) - '("newcommand*" TeX-arg-define-macro - [ TeX-arg-define-macro-arguments ] t) - '("renewcommand*" TeX-arg-macro - [ TeX-arg-define-macro-arguments ] t) - '("newenvironment" TeX-arg-define-environment - [ TeX-arg-define-macro-arguments ] t t) - '("renewenvironment" TeX-arg-environment - [ TeX-arg-define-macro-arguments ] t t) - '("usepackage" LaTeX-arg-usepackage) - '("RequirePackage" LaTeX-arg-usepackage) - '("ProvidesPackage" (TeX-arg-file-name-sans-extension "Package name") - [ TeX-arg-conditional (y-or-n-p "Insert version? ") - ([ TeX-arg-version ]) nil]) - '("ProvidesClass" (TeX-arg-file-name-sans-extension "Class name") - [ TeX-arg-conditional (y-or-n-p "Insert version? ") - ([ TeX-arg-version ]) nil]) - '("ProvidesFile" (TeX-arg-file-name "File name") - [ TeX-arg-conditional (y-or-n-p "Insert version? ") - ([ TeX-arg-version ]) nil ]) - '("documentclass" TeX-arg-document))) - - (TeX-add-style-hook "latex2e" - ;; Use new fonts for `\documentclass' documents. - (lambda () - (setq TeX-font-list LaTeX-font-list) - (setq TeX-font-replace-function #'TeX-font-replace-macro) - (run-hooks 'LaTeX2e-hook)) - TeX-dialect) - - (TeX-add-style-hook "latex2" - ;; Use old fonts for `\documentstyle' documents. - (lambda () - (setq TeX-font-list (default-value 'TeX-font-list)) - (setq TeX-font-replace-function - (default-value 'TeX-font-replace-function)) - (run-hooks 'LaTeX2-hook)) - TeX-dialect) - - ;; There must be something better-suited, but I don't understand the - ;; parsing properly. -- dak - (TeX-add-style-hook "pdftex" #'TeX-PDF-mode-on :classopt) - (TeX-add-style-hook "pdftricks" #'TeX-PDF-mode-on :classopt) - (TeX-add-style-hook "pst-pdf" #'TeX-PDF-mode-on :classopt) - (TeX-add-style-hook "dvips" - (lambda () - ;; Leave at user's choice whether to disable - ;; `TeX-PDF-mode' or not. - (setq TeX-PDF-from-DVI "Dvips")) - :classopt) - ;; This is now done in style/pstricks.el because it prevents other - ;; pstricks style files from being loaded. - ;; (TeX-add-style-hook "pstricks" 'TeX-PDF-mode-off) - (TeX-add-style-hook "psfrag" #'TeX-PDF-mode-off :classopt) - (TeX-add-style-hook "dvipdf" #'TeX-PDF-mode-off :classopt) - (TeX-add-style-hook "dvipdfm" #'TeX-PDF-mode-off :classopt) - (TeX-add-style-hook "dvipdfmx" - (lambda () - (TeX-PDF-mode-on) - ;; XeLaTeX normally don't use dvipdfmx - ;; explicitly. - (unless (eq TeX-engine 'xetex) - (setq TeX-PDF-from-DVI "Dvipdfmx"))) - :classopt) - ;; (TeX-add-style-hook "DVIoutput" 'TeX-PDF-mode-off) - ;; - ;; Well, DVIoutput indicates that we want to run PDFTeX and expect to - ;; get DVI output. Ugh. - (TeX-add-style-hook "ifpdf" (lambda () - (TeX-PDF-mode-on) - (TeX-PDF-mode-off)) - :classopt) - ;; ifpdf indicates that we cater for either. So calling both - ;; functions will make sure that the default will get used unless the - ;; user overrode it. - - (set (make-local-variable 'imenu-create-index-function) - #'LaTeX-imenu-create-index-function) - - (use-local-map LaTeX-mode-map) - - ;; Initialization of `add-log-current-defun-function': - (set (make-local-variable 'add-log-current-defun-function) - #'TeX-current-defun-name) - - ;; Set LaTeX-specific help messages for error so that it's available - ;; in `TeX-help-error'. - (setq-local TeX-error-description-list-local - LaTeX-error-description-list)) - -(defun LaTeX-imenu-create-index-function () - "Imenu support function for LaTeX." - (TeX-update-style) - (let (entries - (regexp (LaTeX-outline-regexp))) - (goto-char (point-max)) - (while (re-search-backward regexp nil t) - (let* ((name (LaTeX-outline-name)) - (level (make-string (1- (LaTeX-outline-level)) ?\ )) - (label (concat level level name)) - (mark (make-marker))) - (set-marker mark (point)) - (set-text-properties 0 (length label) nil label) - (setq entries (cons (cons label mark) entries)))) - entries)) - -(defvar LaTeX-builtin-opts - '("12pt" "11pt" "10pt" "twocolumn" "twoside" "draft") - "Built in options for LaTeX standard styles.") - -(defun LaTeX-209-to-2e () - "Make a stab at changing 2.09 doc header to 2e style." - (interactive) - (TeX-home-buffer) - (let (optstr optlist 2eoptlist 2epackages docline docstyle) - (goto-char (point-min)) - (if - (search-forward-regexp - "\\\\documentstyle\\[\\([^]]*\\)\\]{\\([^}]*\\)}" - (point-max) t) - (setq optstr (TeX-match-buffer 1) - docstyle (TeX-match-buffer 2) - optlist (split-string optstr ",")) - (if (search-forward-regexp - "\\\\documentstyle{\\([^}]*\\)}" - (point-max) t) - (setq docstyle (TeX-match-buffer 1)) - (error "No documentstyle defined"))) - (beginning-of-line 1) - (setq docline (point)) - (insert "%%%") - (while optlist - (if (member (car optlist) LaTeX-builtin-opts) - (setq 2eoptlist (cons (car optlist) 2eoptlist)) - (setq 2epackages (cons (car optlist) 2epackages))) - (setq optlist (cdr optlist))) - ;;(message (format "%S %S" 2eoptlist 2epackages)) - (goto-char docline) - (forward-line 1) - (insert "\\documentclass") - (if 2eoptlist - (insert "[" - (mapconcat (lambda (x) x) - (nreverse 2eoptlist) ",") "]")) - (insert "{" docstyle "}\n") - (if 2epackages - (insert "\\usepackage{" - (mapconcat (lambda (x) x) - (nreverse 2epackages) "}\n\\usepackage{") "}\n")) - (if (equal docstyle "slides") - (progn - (goto-char (point-min)) - (while (re-search-forward "\\\\blackandwhite{" nil t) - (replace-match "\\\\input{" nil nil))))) - (TeX-normal-mode nil)) - -(defun LaTeX-env-beginning-pos-col () - "Return a cons: (POINT . COLUMN) for current environment's beginning." - (save-excursion - (LaTeX-find-matching-begin) - (cons (point) (current-column)))) - -(defun LaTeX-hanging-ampersand-position (&optional pos col) - "Return indent column for a hanging ampersand (that is, ^\\s-*&). -When you know the position and column of the beginning of the -current environment, supply them as optional arguments POS and -COL for efficiency." - (cl-destructuring-bind - (beg-pos . beg-col) - (if pos - (cons pos col) - (LaTeX-env-beginning-pos-col)) - (let ((cur-pos (point))) - (save-excursion - (if (and (search-backward "\\\\" beg-pos t) - ;; Give up if the found "\\" belongs to an inner env. - (= beg-pos - (save-excursion - (LaTeX-find-matching-begin) - (point)))) - ;; FIXME: This `how-many' fails to count correctly if - ;; there is an inner env with "&" but without "\\", e.g. - ;; \begin{pmatrix} - ;; a & b - ;; \end{pmatrix} - (let ((cur-idx (how-many "[^\\]&" (point) cur-pos))) - (goto-char beg-pos) - ;; FIXME: This regex search fails if there is an inner - ;; env with "&" in it. - (if (re-search-forward "[^\\]&" cur-pos t (+ 1 cur-idx)) - (- (current-column) 1) - ;; If the above searchs fails, i.e. no "&" found, - ;; (- (current-column) 1) returns -1, which is wrong. - ;; So we use a fallback (+ 2 beg-col) whenever this - ;; happens: - (+ 2 beg-col))) - (+ 2 beg-col)))))) - -(defun LaTeX-indent-tabular () - "Return indent column for the current tabular-like line." - (cl-destructuring-bind - (beg-pos . beg-col) - (LaTeX-env-beginning-pos-col) - (let ((tabular-like-end-regex - (format "\\\\end{%s}" - (regexp-opt - (let (out) - (mapc (lambda (x) - (when (eq (cadr x) #'LaTeX-indent-tabular) - (push (car x) out))) - LaTeX-indent-environment-list) - out))))) - (cond ((looking-at tabular-like-end-regex) - beg-col) - - ((looking-at "\\\\\\\\") - (+ 2 beg-col)) - - ((looking-at "&") - (LaTeX-hanging-ampersand-position beg-pos beg-col)) - - (t - (+ 2 - (let ((any-col - (save-excursion - (when - (catch 'found - ;; Search "\\" or "&" which belongs to - ;; the current env, not an inner env. - (while (re-search-backward - "\\\\\\\\\\|[^\\]&" beg-pos t) - (let ((p (point))) - (when (= beg-pos - (progn - (LaTeX-find-matching-begin) - (point))) - ;; It belongs to the current env. - ;; Go to target position and exit - ;; the loop. - (goto-char (1+ p)) - (throw 'found t) - ;; Otherwise it belongs to an - ;; inner env, so continue the - ;; loop. - )))) - ;; If we found "&", then use its column as - ;; `any-col'. Else, `any-col' will be nil. - (if (= ?& (char-after)) - (current-column)))))) - (or any-col - beg-col)))))))) - -;; Utilities: - -(defmacro LaTeX-check-insert-macro-default-style (&rest body) - "Check for values of `TeX-insert-macro-default-style' and `current-prefix-arg'. -This is a utility macro with code taken from -`TeX-parse-arguments'. It should be used inside more complex -function within AUCTeX style files where optional and mandatory -arguments are queried and inserted. For examples, check the -functions `TeX-arg-color' (style/color.el) or -`LaTeX-arg-bicaption-bicaption' (style/bicaption.el)." - `(unless (if (eq TeX-insert-macro-default-style 'show-all-optional-args) - (equal current-prefix-arg '(4)) - (or - (and (eq TeX-insert-macro-default-style 'show-optional-args) - (equal current-prefix-arg '(4))) - (and (eq TeX-insert-macro-default-style 'mandatory-args-only) - (null (equal current-prefix-arg '(4)))) - TeX-last-optional-rejected)) - ,@body)) - -(defun LaTeX-extract-key-value-label (&optional key num) - "Return a regexp string to match a label in an optional argument. -The optional KEY is a string which is the name of the key in the -key=value, default is \"label\". NUM is an integer for an -explicitly numbered group construct, useful when adding items to -`reftex-label-regexps'. - -As an extra feature, the key can be the symbol `none' where the -entire matching for the key=value is skipped. The regexp then is -useful for skipping complex optional arguments. It should be -wrapped in \\(?:...\\)? then." - ;; The regexp produced here is ideally in sync with the complex one - ;; in `reftex-label-regexps'. - (concat - ;; Match the opening [ and the following chars - "\\[[^][]*" - ;; Allow nested levels of chars enclosed in braces - "\\(?:{[^}{]*" - "\\(?:{[^}{]*" - "\\(?:{[^}{]*}[^}{]*\\)*" - "}[^}{]*\\)*" - "}[^][]*\\)*" - ;; If KEY is the symbol none, don't look for any key=val: - (unless (eq key 'none) - (concat "\\<" - ;; Match the key, default is label - (or key "label") - ;; Optional spaces - "[[:space:]]*=[[:space:]]*" - ;; Match the value; braces around the value are optional - "{?\\(" - ;; Cater for NUM which sets the regexp group - (when (and num (integerp num)) - (concat "?" (number-to-string num) ":")) - ;; One of these chars terminates the value - "[^] ,}\r\n\t%]+" - ;; Close the group - "\\)}?")) - ;; We are done. Just search until the next closing bracket - "[^]]*\\]")) - -(provide 'latex) - -;;; latex.el ends here |