Emacs、AUCTeX、RefTeX 和 biblatex 的多引用命令

Emacs、AUCTeX、RefTeX 和 biblatex 的多引用命令

我一直在尝试 Emacs(使用 AUCTeX 和 RefTeX),但我仍然有很多问题。我已经掌握了(并且很欣赏)使用 RefTeX 添加引文的方法(如中所述,例如如何使用 emacs+auctex+reftex 引用)。此外,我是 biblatex 用户,AUCTeX 的最新版本为其提供了良好的支持。但是,不知何故,我完全不知道如何使它适用于 biblatex 多引用命令(\cites\textcites等等)。\parencites

reftex-citation菜单中没有现成的 multicite 命令C-c [(尽管我认为可以毫不费力地添加它们)。相关的 multicite 命令确实通过 自动完成显示C-c C-m,但我无法在 bib 文件中得到良好的正则表达式搜索(据我所知。请参阅下文,它适用于常规 cite 命令,但不适用于 multicite)。

此外,语法高亮(字体化)仅识别多引用命令的第一个键。

此外,RefTeX 的reftex-view-crossref C-c &似乎不能与多引用命令一起使用,返回“不在 crossref 宏参数上”。

与此相关,如果我想向已经存在的多引用命令添加额外的 bibkey,我也无法访问 reftex 功能(使用常规的 cite 命令,将点放在引用命令的结束括号之前并调用C-c [将为我提供对 bib 文件的正则表达式搜索。这也可以用于通过插入命令来添加引用键C-c C-m)。

biblatex.el似乎确实包含“支持多引用命令”/“合格引用列表”,但我找不到它。

我是不是漏掉了什么?有没有合适的“RefTeX 方式”来处理 biblatex 的多引用命令?

尤其:

1-添加这样的命令的正常方法是什么(即考虑默认配置)?

2 - 如何使这些命令被 RefTeX 识别,以便reftex-view-crossref在插入引用命令后可以使用 RefTeX 功能添加作品和新键?

除此之外,但不太重要:

3 - 如何添加,例如\cites在调用时添加到 RefTeX 菜单C-c [

4 - 如何使字体化适用于多引用命令的所有键?

如果有人愿意使用相关设置,则可以使用 MWE(“biblatex-examples.bib”应与文档位于同一目录中,以便无需进一步配置即可正常工作):

\documentclass{article}

\usepackage[style=authoryear]{biblatex}

\addbibresource{biblatex-examples.bib}

\begin{document}

\cite{sigfridsson}

\parencites{sigfridsson}{knuth:ct}

\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

[如果相关的话,我使用的是 Emacs 24.5 和 AUCTeX 12.1.1]

答案1

您有很多问题,所以我尽量简短。我假设您的 init 文件中有以下几行:

(add-hook 'LaTeX-mode-hook #'turn-on-reftex)
(setq reftex-plug-into-AUCTeX t)

1 -添加这样的命令的正常方法是什么(即考虑默认配置)?

RefTeX 提供了变量reftex-cite-format。当你点击 时,你可以使用它进行自定义查询C-c [。使用 AUCTeX,你必须在设置 时设置LaTeX-reftex-cite-format-auto-activate为。对于你的情况,请尝试:nilreftex-cite-format

(setq LaTeX-reftex-cite-format-auto-activate nil)

(setq reftex-cite-format
      '((?\C-m . "\\cite[][]{%l}")
        (?s    . "\\cites[][]{%l}")
        (?p    . "\\parencites[][]{%l}")
        (?P    . "\\Parencites[][]{%l}")))

在您的 init 文件中。但我发现文档中的输入界面很麻烦:您必须执行C-c [s,通过正则表达式查询,标记每个条目并点击A。但这只是个人喜好问题。

2 -如何使这些命令被 RefTeX 识别,以便 reftex-view-crossref 能够工作,并且在插入引用命令后可以使用 RefTeX 工具添加新键?

这是比较棘手的部分。您必须修补函数reftex-figure-out-cite-formatreftex-view-crossref。将其放入您的 init 文件中并重新启动 Emacs;原始string-match行已注释以供参考:

(with-eval-after-load "reftex-cite"
(defun reftex-figure-out-cite-format (arg &optional no-insert format-key)
  "Check if there is already a cite command at point and change cite format
in order to only add another reference in the same cite command."
  (let ((macro (car (reftex-what-macro 1)))
        (cite-format-value (reftex-get-cite-format))
        key format)
    (cond
     (no-insert
      ;; Format does not really matter because nothing will be inserted.
      (setq format "%l"))

     ((and (stringp macro)
       ;; (string-match "\\`\\\\cite\\|cite\\'" macro))
           (string-match "\\`\\\\cite\\|cite\\(?:[s*]\\|texts?\\)?\\'" macro))
      ;; We are already inside a cite macro
      (if (or (not arg) (not (listp arg)))
          (setq format
                (concat
                 (if (member (preceding-char) '(?\{ ?,))
                     ""
                   reftex-cite-key-separator)
                 "%l"
                 (if (member (following-char) '(?\} ?,))
                     ""
                   reftex-cite-key-separator)))
        (setq format "%l")))
     (t
      ;; Figure out the correct format
      (setq format
            (if (and (symbolp cite-format-value)
                     (assq cite-format-value reftex-cite-format-builtin))
                (nth 2 (assq cite-format-value reftex-cite-format-builtin))
              cite-format-value))
      (when (listp format)
        (setq key
              (or format-key
                  (reftex-select-with-char
                   "" (concat "SELECT A CITATION FORMAT\n\n"
                              (mapconcat
                               (lambda (x)
                                 (format "[%c] %s  %s" (car x)
                                         (if (> (car x) 31) " " "")
                                         (cdr x)))
                               format "\n")))))
        (if (assq key format)
            (setq format (cdr (assq key format)))
          (error "No citation format associated with key `%c'" key)))))
    format)) )

(with-eval-after-load "reftex-dcr"
(defun reftex-view-crossref (&optional arg auto-how fail-quietly)
  "View cross reference of macro at point.  Point must be on the KEY
argument.  When at a `\\ref' macro, show corresponding `\\label'
definition, also in external documents (`xr').  When on a label, show
a locations where KEY is referenced.  Subsequent calls find additional
locations.  When on a `\\cite', show the associated `\\bibitem' macro or
the BibTeX database entry.  When on a `\\bibitem', show a `\\cite' macro
which uses this KEY. When on an `\\index', show other locations marked
by the same index entry.
To define additional cross referencing items, use the option
`reftex-view-crossref-extra'.  See also `reftex-view-crossref-from-bibtex'.
With one or two C-u prefixes, enforce rescanning of the document.
With argument 2, select the window showing the cross reference.
AUTO-HOW is only for the automatic crossref display and is handed through
to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'."

  (interactive "P")
  ;; See where we are.
  (let* ((macro (car (reftex-what-macro-safe 1)))
         (key (reftex-this-word "^{}%\n\r, \t"))
         dw)

    (if (or (null macro) (reftex-in-comment))
        (or fail-quietly
            (error "Not on a crossref macro argument"))

      (setq reftex-call-back-to-this-buffer (current-buffer))

      (cond
       ;; ((string-match "\\`\\\\cite\\|cite\\*?\\'\\|bibentry" macro)
       ((string-match "\\`\\\\cite\\|cite\\(?:[s*]\\|texts?\\)?\\'\\|bibentry" macro)
        ;; A citation macro: search for bibitems or BibTeX entries
        (setq dw (reftex-view-cr-cite arg key auto-how)))
       ((string-match "\\`\\\\ref\\|ref\\(range\\)?\\*?\\'" macro)
        ;; A reference macro: search for labels
        (setq dw (reftex-view-cr-ref arg key auto-how)))
       (auto-how nil)  ;; No further action for automatic display (speed)
       ((or (equal macro "\\label")
            (member macro reftex-macros-with-labels))
        ;; A label macro: search for reference macros
        (reftex-access-scan-info arg)
        (setq dw (reftex-view-regexp-match
                  (format reftex-find-reference-format (regexp-quote key))
                  4 nil nil)))
       ((equal macro "\\bibitem")
        ;; A bibitem macro: search for citations
        (reftex-access-scan-info arg)
        (setq dw (reftex-view-regexp-match
                  (format reftex-find-citation-regexp-format (regexp-quote key))
                  4 nil nil)))
       ((member macro reftex-macros-with-index)
        (reftex-access-scan-info arg)
        (setq dw (reftex-view-regexp-match
                  (format reftex-find-index-entry-regexp-format
                          (regexp-quote key))
                  3 nil nil)))
       (t
        (reftex-access-scan-info arg)
        (catch 'exit
          (let ((list reftex-view-crossref-extra)
                entry mre action group)
            (while (setq entry (pop list))
              (setq mre (car entry)
                    action (nth 1 entry)
                    group (nth 2 entry))
              (when (string-match mre macro)
                (setq dw (reftex-view-regexp-match
                          (format action key) group nil nil))
                (throw 'exit t))))
          (error "Not on a crossref macro argument"))))
      (if (and (eq arg 2) (windowp dw)) (select-window dw))))) )

我尝试使用此文件,您可以看到哪里有效,哪里无效:

\documentclass{article}

\begin{filecontents}{biblatex-bib.bib}
@book{lamp:94,
  author    = {Leslie Lamport},
  title     = {LaTeX - {A} Document Preparation System: User's Guide
               and Reference Manual, Second Edition},
  publisher = {Pearson / Prentice Hall},
  year      = {1994},
  isbn      = {978-0-201-52983-8},
  timestamp = {Fri, 08 Apr 2011 18:21:00 +0200},
}

@book{mitt:97,
  author    = {Michel Goossens and
               Sebastian Rahtz and
               Frank Mittelbach},
  title     = {The LaTeX Graphics Companion - Illustrating documents
               with TeX and PostScript},
  series    = {Addison-Wesley series on tools and techniques
               for computer typesetting},
  publisher = {Addison-Wesley},
  year      = {1997},
  isbn      = {978-0-201-85469-5},
}
\end{filecontents}

\usepackage[style=authoryear]{biblatex}

\addbibresource{biblatex-bib.bib}

\begin{document}

%% =============== RefTeX standard

\cite{mitt:97}
==> \verb|C-c &| Ok, \verb|C-c [| Ok

\cites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
==> \verb|C-c &| Ok, \verb|C-c [| Ok

\footcitetext[Pre][Post]{mitt:97}
==> \verb|C-c &| NOk, \verb|C-c [| NOk

\parencite*[Pre][Post]{mitt:97}
==> \verb|C-c &| Ok, \verb|C-c [| NOk

\parencites{mitt:97}
\parencites(GPre)()[Pre][]{mitt:97}[Pre][]{lamp:94}
\parencites(pre)()[pre][]{mitt:97}
\parencites(post)[post]{mitt:97}
==> \verb|C-c &| NOk, \verb|C-c [| NOk

%% ============== RefTeX patched

\parencites[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
==> \verb|C-c &| Ok, \verb|C-c [| Ok

\parencites(GPre)(GPost)[Pre][Post]{mitt:97}[Pre][Post]{lamp:94}
==> \verb|C-c &| NOk, \verb|C-c [| NOk

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

当存在全局可选参数时,补丁不起作用()。因此,您还必须修补该函数reftex-what-macro;但这超出了 tex.sx 的范围。请给 发一封邮件[email protected]。这些问题应该在 Emacs 27 中得到修复。

3 -如何添加,例如\cites在调用时添加到 RefTeX 菜单C-c [

检查点1。

4 -如何使字体化适用于多引用命令的所有键?

恐怕这是“无法修复”的问题。字体化由font-latex.elAUCTeX 附带完成,通常只能对固定数量的参数进行字体化。

相关内容