;;; natbib.el --- Style hook for the NatBib package
;;;
;;; AUTHOR: Carsten Dominik <dominik@strw.leidenuniv.nl>
;;;         building on older code from Berwin Turlach

;;; Code:

(TeX-add-style-hook "natbib"
 (function
  (lambda ()
    ;; The number in the cdr of the following list indicates how many
    ;; optional note arguments we consider useful.  Prompting for those
    ;; arguments will still depend upon `TeX-arg-cite-note-p'.
    (let  ((citecmds 
	    '(("cite" . 0)
	      ("citet" . 1) ("citet*" . 1) ("citealt" . 1) ("citealt*" . 1)
	      ("citep" . 2) ("citep*" . 2) ("citealp" . 2) ("citealp*" . 2)
	      ("citeauthor" . 0) ("citeauthor*" . 0) ("citefullauthor" . 0)
	      ("citeyear" . 0) ("citeyearpar" . 0)
	      ("shortcites" . 0))))

      ;; Add these symbols
      (apply 
       'TeX-add-symbols
       (mapcar
	(lambda (cmd)
	  (cond 
	   ((= (cdr cmd) 0)
	    ;; No optional arguments
	    (list (car cmd) 'TeX-arg-cite))
	   ((= (cdr cmd) 1)
	    ;; Just one optional argument, the post note
	    (list
	     (car cmd)
	     '(TeX-arg-conditional TeX-arg-cite-note-p (["Post-note"]) nil)
	     'TeX-arg-cite))
	   ((= (cdr cmd) 2)
	    ;; Pre and post notes
	    (list
	     (car cmd)
	     '(TeX-arg-conditional TeX-arg-cite-note-p (natbib-note-args) nil)
	     'TeX-arg-cite))))
      citecmds))

      ;; Add the other symbols
      (TeX-add-symbols
       '("citetext" "Text")
       '("bibpunct" ["Post note separator"] 
		 "Opening bracket"
		 "Closing bracket"
		 "Punctuation between multiple citations"
		 "style [n]umeric [s]uperscript [a]uthor-year"
		 "Punctuation between author and year"
		 "Punctuation between years for common authors")
       '("citestyle" "Style")
       '("citeindextrue")
       '("citeindexfalse")
       '("citeindextype"))

      ;; Make an entry in TeX-complete-list
      (add-to-list
       'TeX-complete-list
       (list
	(concat "\\\\\\(" 
		(mapconcat (lambda (x) (regexp-quote (car x)))
			   citecmds "\\|")
		"\\)\\(\\[[^]\n\r\\%]*\\]\\)*{\\([^{}\n\r\\%,]*,\\)*\\([^{}\n\r\\%,]*\\)")
	4 'LaTeX-bibitem-list "}")))

    ;; Add fontification for references
    (when (and (featurep 'font-latex)
	       (eq TeX-install-font-lock 'font-latex-setup))
      (setq font-latex-match-reference-keywords-local
	    (append font-latex-match-reference-keywords-local
		    '("cite" "citet" "citet*" "citealt" "citealt*"
		      "citep" "citep*" "citealp" "citealp*" 
		      "citeauthor" "citeauthor*" "citefullauthor"
		      "citeyear" "citeyearpar""shortcites")))
      (font-latex-match-reference-make))

    ;; Tell RefTeX
    (if (fboundp 'reftex-set-cite-format)
	(reftex-set-cite-format 'natbib)))))

(defun natbib-note-args (optional &optional prompt definition)
  "Prompt for two note arguments a natbib citation command."
  (if TeX-arg-cite-note-p
      (let* ((pre (read-string 
		   (TeX-argument-prompt optional optional "Pre-note")))
	     (post (read-string
		    (TeX-argument-prompt optional optional "Post-note"))))
	(if (not (string= pre "")) (insert "[" pre "]"))
	(if (not (string= post ""))
	    (insert "[" post "]")
	  ;; Make sure that we have an empty post note if pre is not empty
	  (if (string= pre "") (insert "[]"))))))

;; natbib.el ends here
