Function: latex-find-indent
latex-find-indent is a byte-compiled function defined in
tex-mode.el.gz.
Signature
(latex-find-indent &optional VIRTUAL)
Documentation
Find the proper indentation of text after point.
VIRTUAL if non-nil indicates that we're only trying to find the indentation
in order to determine the indentation of something else.
There might be text before point.
Source Code
;; Defined in /usr/src/emacs/lisp/textmodes/tex-mode.el.gz
(defun latex-find-indent (&optional virtual)
"Find the proper indentation of text after point.
VIRTUAL if non-nil indicates that we're only trying to find the indentation
in order to determine the indentation of something else.
There might be text before point."
(let ((latex-handle-escaped-parens latex-indent-within-escaped-parens))
(save-excursion
(skip-chars-forward " \t")
(or
;; Stick the first line at column 0.
(and (= (point-min) (line-beginning-position)) 0)
;; Trust the current indentation, if such info is applicable.
(and virtual (save-excursion (skip-chars-backward " \t&") (bolp))
(current-column))
;; Stick verbatim environments to the left margin.
(and (looking-at "\\\\\\(begin\\|end\\) *{\\([^\n}]+\\)")
(member (match-string 2) tex-verbatim-environments)
0)
;; Put leading close-paren where the matching open paren would be.
(let (escaped)
(and (or (eq (latex-syntax-after) ?\))
;; Try to handle escaped close parens but keep
;; original position if it doesn't work out.
(and latex-handle-escaped-parens
(setq escaped (looking-at "\\\\\\([])}]\\)"))))
(ignore-errors
(save-excursion
(when escaped
(goto-char (match-beginning 1)))
(latex-skip-close-parens)
(latex-backward-sexp-1)
(latex-find-indent 'virtual)))))
;; Default (maybe an argument)
(let ((pos (point))
;; Outdent \item if necessary.
(indent (if (looking-at tex-indent-item-re) (- tex-indent-item) 0))
up-list-pos)
;; Find the previous point which determines our current indentation.
(condition-case err
(progn
(latex-backward-sexp-1)
(while (> (current-column) (current-indentation))
(latex-backward-sexp-1)))
(scan-error
(setq up-list-pos (nth 2 err))))
(cond
((= (point-min) pos) 0) ; We're really just indenting the first line.
((integerp up-list-pos)
;; Have to indent relative to the open-paren.
(goto-char up-list-pos)
(if (and (not tex-indent-allhanging)
(save-excursion
;; Make sure we're an argument to a macro and
;; that the macro is at the beginning of a line.
(condition-case nil
(progn
(while (eq (char-syntax (char-after)) ?\()
(forward-sexp -1))
(and (eq (char-syntax (char-after)) ?/)
(progn (skip-chars-backward " \t&")
(bolp))))
(scan-error nil)))
(> pos (progn (latex-down-list)
(forward-comment (point-max))
(point))))
;; Align with the first element after the open-paren.
(current-column)
;; We're the first element after a hanging brace.
(goto-char up-list-pos)
(+ (if (if (eq (char-after) ?\{)
(save-excursion
(skip-chars-backward " \t")
(let ((end (point)))
(skip-chars-backward "a-zA-Z")
(and (eq (char-before) ?\\)
(member (buffer-substring (point) end)
latex-noindent-commands))))
(and (looking-at "\\\\begin *{\\([^\n}]+\\)")
(member (match-string 1)
latex-noindent-environments)))
0 tex-indent-basic)
indent (latex-find-indent 'virtual))))
;; We're now at the "beginning" of a line.
((not (and (not virtual) (eq (char-after) ?\\)))
;; Nothing particular here: just keep the same indentation.
(+ indent (current-column)))
;; We're now looking at a macro call.
((looking-at tex-indent-item-re)
;; Indenting relative to an item, have to re-add the outdenting.
(+ indent (current-column) tex-indent-item))
(t
(let ((col (current-column)))
(if (or (not (eq (char-syntax (or (char-after pos) ?\s)) ?\())
;; Can't be an arg if there's an empty line in between.
(save-excursion (re-search-forward "^[ \t]*$" pos t)))
;; If the first char was not an open-paren, there's
;; a risk that this is really not an argument to the
;; macro at all.
(+ indent col)
(forward-sexp 1)
(if (< (line-end-position)
(save-excursion (forward-comment (point-max))
(point)))
;; we're indenting the first argument.
(min (current-column) (+ tex-indent-arg col))
(skip-syntax-forward " ")
(current-column)))))))))))