Function: latex-imenu-create-index
latex-imenu-create-index is a byte-compiled function defined in
tex-mode.el.gz.
Signature
(latex-imenu-create-index)
Documentation
Generate an alist for imenu from a LaTeX buffer.
Source Code
;; Defined in /usr/src/emacs/lisp/textmodes/tex-mode.el.gz
(defun latex-imenu-create-index ()
"Generate an alist for imenu from a LaTeX buffer."
(let ((section-regexp
(concat "\\\\" (regexp-opt (mapcar #'car latex-section-alist) t)
"\\*?[ \t]*{"))
(metasection-regexp
(concat "\\\\" (regexp-opt latex-metasection-list t)))
i0 menu case-fold-search)
(save-excursion
;; Find the top-most level in this file but don't allow it to be
;; any deeper than "section" (which is top-level in an article).
(goto-char (point-min))
(if (search-forward-regexp "\\\\part\\*?[ \t]*{" nil t)
(setq i0 0)
(if (search-forward-regexp "\\\\chapter\\*?[ \t]*{" nil t)
(setq i0 1)
(setq i0 2)))
;; Look for chapters and sections.
(goto-char (point-min))
(while (search-forward-regexp section-regexp nil t)
(let ((start (match-beginning 0))
(here (point))
(i (cdr (assoc (buffer-substring-no-properties
(match-beginning 1)
(match-end 1))
latex-section-alist))))
(backward-char 1)
(condition-case nil
(progn
;; Using sexps allows some use of matching {...} inside
;; titles.
(forward-sexp 1)
(push (cons (concat (apply #'concat
(make-list
(max 0 (- i i0))
latex-imenu-indent-string))
(buffer-substring-no-properties
here (1- (point))))
start)
menu))
(error nil))))
;; Look for included material.
(goto-char (point-min))
(while (search-forward-regexp
"\\\\\\(include\\|input\\|verbatiminput\\|bibliography\\)\
[ \t]*{\\([^}\n]+\\)}"
nil t)
(push (cons (concat "<<" (buffer-substring-no-properties
(match-beginning 2)
(match-end 2))
(if (= (char-after (match-beginning 1)) ?b)
".bbl"
".tex"))
(match-beginning 0))
menu))
;; Look for \frontmatter, \mainmatter, \backmatter, and \appendix.
(goto-char (point-min))
(while (search-forward-regexp metasection-regexp nil t)
(push (cons "--" (match-beginning 0)) menu))
;; Sort in increasing buffer position order.
(sort menu (lambda (a b) (< (cdr a) (cdr b)))))))