200 lines
7.8 KiB
EmacsLisp
200 lines
7.8 KiB
EmacsLisp
;;; natbib.el --- AUCTeX style for `natbib.sty' version 8.31b -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 1997, 1998, 2004, 2007, 2014--2023 Free Software Foundation, Inc.
|
|
|
|
;; Authors: Berwin Turlach <statba@nus.edu.sg>
|
|
;; Carsten Dominik <dominik@strw.leidenuniv.nl>
|
|
;; 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.
|
|
|
|
;;; Code:
|
|
|
|
(require 'tex)
|
|
(require 'latex)
|
|
|
|
;; Silence the compiler:
|
|
(declare-function font-latex-add-keywords
|
|
"font-latex"
|
|
(keywords class))
|
|
|
|
(TeX-add-style-hook
|
|
"natbib"
|
|
(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)
|
|
;; 2.4 Extended Citation Commands
|
|
("citenum" . 0)
|
|
;; 2.5 Forcing Upper Cased Name
|
|
("Citet" . 1) ("Citet*" . 1) ("Citealt" . 1) ("Citealt*" . 1)
|
|
("Citep" . 2) ("Citep*" . 2) ("Citealp" . 2) ("Citealp*" . 2)
|
|
;; 2.6 Citation Aliasing
|
|
("citetalias" . 1) ("citepalias" . 2))))
|
|
|
|
;; 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
|
|
(["Pre-note"] LaTeX-arg-natbib-notes)
|
|
nil)
|
|
#'TeX-arg-cite))))
|
|
citecmds))
|
|
|
|
;; 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 the other symbols
|
|
(TeX-add-symbols
|
|
;; 2.4 Extended Citation Commands
|
|
'("citetext" "Text")
|
|
|
|
;; 2.6 Citation Aliasing
|
|
'("defcitealias" TeX-arg-cite "Alias")
|
|
|
|
;; 2.9 Selecting Citation Punctuation
|
|
'("setcitestyle" (TeX-arg-key-val
|
|
(;; Citation mode (fourth argument of \bibpunct):
|
|
("authoryear") ("numbers") ("super")
|
|
;; Braces (first and second arguments of \bibpunct):
|
|
("round") ("square") ("open") ("close")
|
|
;; Between citations (third argument of \bibpunct):
|
|
("semicolon") ("comma") ("citesep")
|
|
;; Between author and year (fifth argument of \bibpunct):
|
|
("aysep")
|
|
;; Between years with common author (sixth argument of \bibpunct):
|
|
("yysep")
|
|
;; Text before post-note (optional argument of \bibpunct):
|
|
("notesep"))))
|
|
'("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" (TeX-arg-completing-read ("plain" "plainnat" "agu" "egu"
|
|
"agms" "dcu" "kluwer" "cospar"
|
|
"nature")
|
|
"Style"))
|
|
|
|
;; 2.12 Other Formatting Options
|
|
"bibsection"
|
|
"bibpreamble"
|
|
"bibfont"
|
|
"citenumfont"
|
|
"bibnumfmt"
|
|
|
|
;; 2.13 Automatic Indexing of Citations
|
|
'("citeindextrue")
|
|
'("citeindexfalse")
|
|
'("citeindextype"))
|
|
|
|
;; 2.12 Other Formatting Options
|
|
(LaTeX-add-lengths "bibhang" "bibsep")
|
|
|
|
;; Fontification
|
|
(when (and (fboundp 'font-latex-add-keywords)
|
|
(eq TeX-install-font-lock 'font-latex-setup))
|
|
(font-latex-add-keywords '(("cite" "*[[{")
|
|
("citet" "*[[{")
|
|
("citealt" "*[[{")
|
|
("citep" "*[[{")
|
|
("citealp" "*[[{")
|
|
("citeauthor" "*[[{")
|
|
("citefullauthor" "[[{")
|
|
("citetext" "{")
|
|
("citeyear" "[[{")
|
|
("citeyearpar" "[[{")
|
|
("shortcites" "{")
|
|
("citenum" "{")
|
|
("Citet" "*[[{")
|
|
("Citealt" "*[[{")
|
|
("Citep" "*[[{")
|
|
("Citealp" "*[[{")
|
|
("Citeauthor" "*[[{")
|
|
("citetalias" "*[[{")
|
|
("citepalias" "*[[{"))
|
|
'reference)
|
|
(font-latex-add-keywords '(("defcitealias" "{{")
|
|
("bibpunct" "[{{{{{{")
|
|
("setcitestyle" "{")
|
|
("citestyle" "{"))
|
|
'function))
|
|
|
|
;; Tell RefTeX
|
|
(when (and LaTeX-reftex-cite-format-auto-activate
|
|
(fboundp 'reftex-set-cite-format))
|
|
(reftex-set-cite-format 'natbib)))
|
|
TeX-dialect)
|
|
|
|
(defun LaTeX-arg-natbib-notes (_optional)
|
|
"Prompt for the post-note argument of a natbib citation command.
|
|
OPTIONAL is ignored."
|
|
(let ((post (TeX-read-string
|
|
(TeX-argument-prompt t nil "Post-note")))
|
|
(TeX-arg-opening-brace LaTeX-optop)
|
|
(TeX-arg-closing-brace LaTeX-optcl))
|
|
;; Pre-note is given, Post-note is empty: Make sure that we insert
|
|
;; an extra pair of `[]', otherwise pre becomes post
|
|
(if (and (string-empty-p post) (= (preceding-char) ?\]))
|
|
(insert LaTeX-optop LaTeX-optcl)
|
|
(TeX-argument-insert post t))))
|
|
|
|
(defvar LaTeX-natbib-package-options '("numbers" "super" "authoryear"
|
|
"round" "square" "angle" "curly"
|
|
"comma" "colon" "nobibstyle"
|
|
"bibstyle" "openbib" "sectionbib"
|
|
"sort" "sort&compress"
|
|
"longnamesfirst" "nonamebreak")
|
|
"Package options for the natbib package.")
|
|
|
|
;; natbib.el ends here
|