![Emacs、AUCTeX、RefTeX 和 biblatex 的多引用命令](https://linux22.com/image/373932/Emacs%E3%80%81AUCTeX%E3%80%81RefTeX%20%E5%92%8C%20biblatex%20%E7%9A%84%E5%A4%9A%E5%BC%95%E7%94%A8%E5%91%BD%E4%BB%A4.png)
我一直在尝试 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
为。对于你的情况,请尝试:nil
reftex-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-format
和reftex-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.el
AUCTeX 附带完成,通常只能对固定数量的参数进行字体化。