我在使用 YASnippet 插入 RefTeX 引文时遇到了问题。和许多其他人一样,我尝试使用此代码片段来自 GitHub使用以下语法
\cite{${1:label$(unless yas/modified-p (reftex-citation nil 'dont-insert))}}$0
但是,代码片段会完整并包含引文,但是我在引文标签周围得到了多余的字符,所以引文最终看起来像
\cite{(pauling1936)}
而不是像
\cite{pauling1936}
并且该文件将无法成功编译,因为 .bib 文件中的条目标题没有括号。
另外,如果我尝试将多个条目包含在一个引用中,结果如下所示
\cite{(pauling1936 giauque1933)}
代替
\cite{pauling1936, giauque1933}
如果我只是使用 RefTeX 快捷方式,C-c [
而不是尝试使用 YASnippet,那么单个和多个条目的引用格式都会正确。此外,基本上相同的 GitHub 代码可以完美地用于调用reftex-reference
而不是引用。
也许我应该提到我正在使用 Windows 8、Emacs 24.3.1、YASnippets 0.8 和 AUCTeX 11.87.1,并且我的序言没有任何\usepackage{}
与 bibtex 相关的调用。
答案1
当您开始嵌入 lisp 代码时,Yasnippet 可能会出现一些小问题。我建议您报告此错误。
同时,您可以尝试以下方法进行修复。
\cite{${1:label`(unless yas/modified-p (reftex-citation nil 'dont-insert))`}}$0
反引号是将 lisp 嵌入 yasnippet 的另一种方法,而且它们可以更好地工作(当然,前提是您要嵌入的代码不使用反引号)。如果它有效,请告诉我。
答案2
问题是reftex-do-citation
,哪个函数负责执行reftex-citation
用于返回列表中的项目(即(car (car selected-entries))
)。
现在它返回一个列表(即(mapcar 'car selected-entries)
)。
通过修改代码片段中的代码可以获得所需的输出(对于单个条目和多个条目):
\cite{${1:label$(unless yas/modified-p (mapconcat 'identity (reftex-citation 'dont-insert) ","))}}$0