Emacs、RefTeX 和 Cleveref – 它们可以协同工作吗?

Emacs、RefTeX 和 Cleveref – 它们可以协同工作吗?

尝试在网上寻找答案,只找到了一个问题和一个答案,我既看不懂又用不上。在 tex.stackexchange 上,我只找到了这个问题已经回答了这个问题,但我的技术不够,无法将其翻译成我的情况。

我想在使用 时与 一起使用。换句话说cleveref,当按下并找到我想要引用的标签时,我想插入而不是。reftexAUCTeXemacsC-c )reftex\cref{label}\ref{label}

可能有办法做到,但我无法弄清楚。

答案1

以下(未经测试!)代码应该能提供您想要的行为。您需要将其放入 Emacs 初始化文件中(.emacs或类似文件,具体取决于您的平台)。

(defun reftex-format-cref (label def-fmt)
  (format "\\cref{%s}" label))
(setq reftex-format-ref-function 'reftex-format-cref)

(此简单代码是根据 Emacs 分发的文件defun修改而来的。)reftex-ref.el

答案2

自从你似乎已经在使用YASnippet通过 YASnippet 而不是 AUCTeX 来实现这一点可能更好。

以下是此类代码片段的示例:

# -*- mode: snippet -*-
# name: cleveref \cref
# key: rf
# --
\cref{${1:label$(unless yas/modified-p (reftex-reference nil 'dont-insert))}}$0

使用这个,你写“rf”,当你扩展它时(默认用扩展Tab)RefTeX 会询问你要引用什么标签,并将该标签作为的参数插入\cref

使用 YASnippets 的好处之一是,你可以有多个替代方案相同的键。例如,如果您使用上面的代码片段,您可能还想在交叉引用开始一个句子的情况下使用以下内容:

# -*- mode: snippet -*-
# name: cleveref \Cref
# key: crf
# --
\Cref{${1:label$(unless yas/modified-p (reftex-reference nil 'dont-insert))}}$0

现在,当您写入“rf”并将其扩展时,您可以选择是否将其扩展\cref\Cref

在 YASnippet 中选择 \cref 和 \Cref

更多交叉引用片段请参见https://github.com/Sleft/yasnippet-latex-mode/tree/master/cross-reference

答案3

现在(RefTex 版本 24.3),该函数使用三个参数调用:labeldef-fmtref-style。您可以放心地忽略新的参数,因此这应该可以工作:

(defun reftex-format-cref (label def-fmt ref-style)
  (format "\\cref{%s}" label))
(setq reftex-format-ref-function 'reftex-format-cref)

但是,这里提供了更好的答案(重复)问题

相关内容