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)))))))))))