在组织模式文件中加载bibtex文件


16

我试图用来org-mode做几乎所有事情。在我的科学写作活动中,我想在.org文件中草绘整个论文,然后在LaTeX中导出。我不想在中加载.bibbibtex文件,init.el因为我可能有多个文件。现在,我已经将其添加到.org文件的开头:

#+BEGIN_SRC elisp
(setq reftex-default-bibliography '("./references.bib"))
#+END_SRC

但是我必须每次手动执行它。有什么办法可以使其自动化?最好的做法是在每个.org文件的开头都有一条指令,上面写着emacs:“好,现在您应该加载 .bib文件”。有什么提示吗?谢谢。


文件局部变量不会奏效吗?EGM-x add-file-local-variable
奥拉夫b

谢谢您的回复。不幸的是,这不是我想要的。这样,每次加载文件时,都需要键入命令。小东西#+STARTUP: do this
petrux 2014年

哪个命令?您只需要设置一次文件局部变量。
olaf b 2014年

你是对的!使用add-file-local-variable-prop-lineI可以# -*- reftex-default-bibliography: ("./references.bib"); -*-在文件开头生成该行。
petrux 2014年

Answers:


19

添加类似下面的一行就足以告诉org-mode.bib咨询文件:

#+BIBLIOGRAPHY: refs plain

refs是BibTeX文件的名称(.bib省略扩展名),并且plainbibliographystyle

然后,您可以调用org-reftex-citationC-c C-x [默认绑定到)以插入引用。

从文档中:

(org-reftex-citation)

使用reftex-citation插入引用到缓冲区。这看起来像一条线

#+BIBLIOGRAPHY: foo plain option:-d

并从中得出与foo.bib本文档相关的书目文件。然后,它为RefTeX安装必要的环境以使其在此缓冲区中工作,并调用reftex-citation将引用插入到缓冲区中。

ox-bibtexTaru Karttunen 的贡献包将此类引文导出到LaTeX和HTML 。

正如最后一句话所建议的,您需要添加

(require 'org)
(require 'ox-bibtex)

到您的init文件,以确保引用正确导出到LaTeX。当我为自己进行设置时,我发现还需要进行自定义org-latex-pdf-process才能使PDF导出正常工作:

(setq org-latex-pdf-process '("texi2dvi -p -b -V %f"))

附录

如果您不想使用的默认绑定org-reftex-citation,则可以为其设置自定义键绑定。例如,以下绑定org-reftex-citation到的默认绑定reftex-citation

(define-key org-mode-map (kbd "C-c [") 'org-reftex-citation)

感谢您的回答。我没有将其标记为正确,只是因为我看到了# -*- reftex-default-bibliography: ("./references.bib"); -*-等效项的用法,优点是可以使用常规的RefTeX键绑定添加新的引用。我想念什么吗?我们是否可以编辑答案以使其对以后的读者更加完整?谢谢。
petrux 2014年

@petrux您可以绑定org-reftex-citationreftex-citation通常使用的相同键序列...请参阅我的答案的更新。
itsjeyd 2014年

我认为没有办法使用多个书目文件org-reftex-citation?如果我添加第二个#+BIBLIOGRAPHY,那么第一个似乎被忽略。
Brian Z

@BrianZ我认为开箱即用不支持您描述的用例。但是,也许有人在这里有手动解决方案?如果我是你,我会问一个新问题(指向该线程以供参考);当然,这听起来似乎也是其他人可能感兴趣的东西。
itsjeyd

1
评估(setq reftex-default-bibliography '("./a.bib" "./b.bib"))似乎可以解决问题。所以呢# -*- reftex-default-bibliography: ("./refs1.bib" "./refs2.bib"); -*-,虽然它抛出了这个变量不应该由当地确定的警告。
Brian Z

4

似乎ox-bibtex未包含在最新的组织软件包(8.2.10-34-gc41bbc-elpa)中。因此,我在网上进行了搜索,并在下载后将其放在目录/ org / lisp /中。但是,当尝试进行涉及某些bibtex的导出时,遇到了以下错误。

Symbol的函数定义无效:org-element-insert-before

然后我检查文件“ org-element.el”,当然没有预定义的功能。但是为什么不在那里?org-element的在线API文档曾经提到过它。

因此,我想目前不可能将RefTeX用作文档描述的方式,除非您愿意切换到Beta版本或较旧的版本。看到

在这里,我分享了使用Beta版的方式

  1. git clone git://orgmode.org/org-mode.git

  2. 将文件夹移到~/.emacs.d/并命名为org-beta

  3. 修改load-path,让Beta版本遮盖其他版本,并包括用户贡献目录

    (add-to-list 'load-path (expand-file-name "org-beta\\lisp" user-emacs-directory))

    (add-to-list 'load-path (expand-file-name "org-beta\\org-contrib\\lisp" user-emacs-directory))

(可选)您可以使用make命令来编译源文件并生成文档

  1. 现在可以了(require 'ox-bibtex)。我更喜欢这样写:(eval-after-load 'org (require 'ox-bibtex))

  2. 为了在正确的位置生成参考列表,请将类似#+BIBLIOGRAPHY: your_bib_lib_name plain option:-d的内容放在org文件的末尾。更多选项请参考帮助文档ox-bibtex.el

  3. 为了使HTML导出部分正常工作,您可能需要最新的bibtex2html,即1.98。要从源代码构建它,请从github下载它,然后按照“ README”帮助文档中的说明进行操作。

如果您像我一样使用Windows,请在所有devel软件包中使用Cygwin64。使用Cygwin64,cd到bibtex2html的目录,然后键入./configure,等待完成,然后键入make,等待完成。现在,在这个目录,你会得到bib2bib.exebibtex2html.exeaux2bib。将它们复制到您的环境var中的某个目录中PATH。通过键入bibtex2htmlcmd 对其进行测试。

我必须做上述工作,因为我使用texlive2014。如果您是miktek用户,则bibtex2html 1.95可能运行良好,可以使用Windows Installer轻松安装。

  1. 要使PDF导出部分正常工作,请使用以下代码初始化您的组织模式:

    (setq org-latex-pdf-process
          '("xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"
            "bibtex %b"
            "xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"
            "xelatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
    

正是“ bibtex”部分发挥了作用。我将shell escape命令用于铸造的乳胶包装。


在我看来,您的答案仅与该问题有关,因为它也是关于org-mode和ox-bibtex。由于您的问题有所不同,因此最好打开一个单独的问题,其他人可以提供有针对性的答案。
辣椒粉

1
我只是想对它的答案做一个补充。itsjeyd建议遵循org-reftex-citation的文档。我做到了,并且遇到了上述问题。万一其他人遇到同样的情况,我在这里分享了我的调查。
empenguin

IIRC的org-mode ELPA软件包不包括下的文件contrib/lisp,其中包括ox-bibtex。所以,你必须从源代码安装组织模式,包括 contrib/lisp或直接复制ox-bibtex.el到您的负载路径。
辣椒粉

1
是。我克隆了组织的beta版本。现在工作正常。
empenguin

6
@paprika无需org-mode从源代码安装即可获取contrib目录。正如解释在这里,组织有自己的ELPA存档。您需要做的就是将该存档添加到package-archives;然后,您可以org-plus-contrib使用包管理器进行安装(和更新)。当然,这并不是说您建议的方法行不通。我只想提及(对于本讨论中遇到的其他人),还有另一种方法不涉及必须org-mode通过单独更新的开销git
itsjeyd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.