RefTeX:打开当前文档的 .bib 文件的快捷方式

RefTeX:打开当前文档的 .bib 文件的快捷方式

我希望 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函数,定义这里

它能做什么:

  1. 它会查找\bibliography{...}当前缓冲区中的所有命令。请注意,它不会跳过 LaTeX 注释或任何语义上与 BibTeX 文件不对应的内容。

  2. 它创建了在此类命令中找到的参考书目文件列表。它正确地处理同一命令中的多个文件,例如 \bibliography{file1,file2}

  3. 它使用 查找列表中的所有文件kpsewhich

  4. 它打开所有文件,可能重用现有缓冲区。列表中的第一个文件获得焦点 ( 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))))

相关内容