我希望 emacs 中有一个简单的键盘快捷键/命令,可以打开当前(可能是多文件)文档的 .bib 文件。使用 RefTeX 应该可以实现这一点,因为它可以找出 .bib 文件的名称(将其用于 C-[ 命令),但我找不到一个命令,它只在编辑器中打开文件,而没有任何花哨的选择功能。
这个命令很有用,因为通常发生的情况是,你在网上找到一个 bibtex 条目,你只需要将其粘贴到你的 .bib 文件中。
答案1
这需要 AUCTeX:
(defun mg-LaTeX-find-bibliography ()
"Visit bibliography file of the current document."
(interactive)
(let ((length (length (LaTeX-bibliography-list)))
bib)
(if (= length 1)
(progn
(setq bib (car (car (LaTeX-bibliography-list))))
(unless (file-name-extension bib)
(setq bib (concat bib ".bib")))
(mg-TeX-kpsewhich-find-file bib))
(if (< length 1)
;; If there is no element in `LaTeX-bibliography-list' use a `.bib'
;; file with the same base name of the TeX master as an educated
;; guess.
(mg-TeX-kpsewhich-find-file (TeX-master-file "bib"))
(setq bib (completing-read "Bibliography database: "
(LaTeX-bibliography-list)))
(unless (file-name-extension bib)
(setq bib (concat bib ".bib")))
(mg-TeX-kpsewhich-find-file bib)))))
mg-TeX-kpsewhich-find-file
被定义为这里。
答案2
由于您无论如何都在使用 reftex,因此您可以使用 reftex 函数reftex-get-bibfile-list
查找与您的文件关联的所有 .bib 文件,并将它们用作完成目标find-file
:
(defun open-current-bib-file ()
"Visit the bib file for the current document.
Only works when reftex is in use, otherwise returns nil."
(interactive)
(unless (not reftex-mode)
(find-file (completing-read ".bib file to open: "
(reftex-get-bibfile-list)))))
答案3
这应该可以在没有 AUCTeX 的情况下工作。它基于 @giordano 提供的代码和mg-TeX-kpsewhich-find-file
函数,定义这里。
它能做什么:
它会查找
\bibliography{...}
当前缓冲区中的所有命令。请注意,它不会跳过 LaTeX 注释或任何语义上与 BibTeX 文件不对应的内容。它创建了在此类命令中找到的参考书目文件列表。它正确地处理同一命令中的多个文件,例如
\bibliography{file1,file2}
。它使用 查找列表中的所有文件
kpsewhich
。它打开所有文件,可能重用现有缓冲区。列表中的第一个文件获得焦点 (
find-file
),其余文件则直接打开 (find-file-noselect
)。
如果希望得到其他的东西,那么修改这个行为应该很容易。
(defun kpsewhich-find-file (name)
"Find a file using kpsewhich."
(interactive "fFilename: ")
(if (executable-find "kpsewhich")
(let* ((file (replace-regexp-in-string
"[\n\r]*\\'" ""
(shell-command-to-string (concat "kpsewhich " name)))))
(if (and (not (zerop (length file))) (file-exists-p file))
file
(message (concat "File " name " not found."))))
(message "Executable kpsewhich not available.")))
(defun open-bibtex-file ()
"Open all bibliography files attached to this document."
(interactive)
(goto-char (point-min))
(let ((biblist nil))
(while (search-forward-regexp
"\\\\bibliography[ \t]*{\\([^}\n]+\\)}"
nil t)
(let* ((bibpar (buffer-substring-no-properties
(match-beginning 1)
(match-end 1)))
(bibs (split-string bibpar ",")))
(mapcar (lambda (bib)
(unless (file-name-extension bib)
(setq bib (concat bib ".bib")))
(setq bib (kpsewhich-find-file bib))
(setq biblist (append biblist (cons bib nil)))) bibs)))
(mapcar 'find-file-noselect (cdr biblist))
(find-file (car biblist))))