如何让 BibTeX 与 Org 模式 LaTeX 导出一起工作?

如何让 BibTeX 与 Org 模式 LaTeX 导出一起工作?

我正在尝试让 Emacs (24.3.1)、Org-mode (8.0.3,来自 ELPA) 和 BibTeX (来自 TeX Live 2012) 协同工作。我已按照参考书目http://orgmode.org/worg/org-tutorials/org-latex-export.html但是在将文档导出为 LaTeX、编译为 PDF 并打开结果(使用C-c C-e l o最新 Org 模式中的按键序列)后,我看到的是一个问号而不是引用(即,[?]),这意味着 LaTeX 无法解析该引用。事实上,检查缓冲区时Org PDF LaTeX Output,我看到以下警告:

LaTeX Warning: Citation `Tappert77' on page 3 undefined on input line 43.

No file org-bib-test.bbl.
[3] (.//org-bib-test.aux) 

LaTeX Warning: There were undefined references.

在我看来,Org-mode 可能正在寻找与该.bib文件具有相同基本名称的文件.org,但重命名该.bib文件并更新该\bibliography行并不能解决问题。

这里有两个最小的.org文件.bib,它们一起可以用来重现上面描述的行为:

org-bib-test.org

* Tests
** Test1 slide
   - This is test1 \cite{Tappert77}.

\bibliographystyle{plain}
\bibliography{org-bib-test-refs}

以下使用#+LATEX_HEADER可得出相同的结果:

org-bib-test.org

#+LATEX_HEADER: \bibliographystyle{plain}
#+LATEX_HEADER: \bibliography{org-bib-test-refs}

* Tests
** Test1 slide
   - This is test1 \cite{Tappert77}.

org-bib-test-refs.bib

@incollection {Tappert77,
AUTHOR = {Tappert, Fred D.},
TITLE = {The parabolic approximation method},
BOOKTITLE = {Wave propagation and underwater acoustics ({W}orkshop,
              {M}ystic, {C}onn., 1974)},
PAGES = {224--287. Lecture Notes in Phys., Vol. 70},
PUBLISHER = {Springer},
ADDRESS = {Berlin},
YEAR = {1977},
MRCLASS = {76.41 (86.41)},
}

目前我正在使用以下丑陋的破解以解决引用问题:我.bbl从文件生成文件.bib(使用最小.tex文件),然后将\include生成的.bbl文件直接放在我的.org文件中。这相当麻烦,当然要求我.bbl每次更改文件时都重新生成文件.bib。虽然可以通过编写一个 lisp 函数来封装这些操作,在 Emacs 中自动完成此过程,但我宁愿解决问题,而不是简化破解。

编辑 我已经检查过.texOrg 模式生成的文件。它其中导出了以下必要的行:

\bibliographystyle{plain}
\bibliography{org-bib-test-refs}

答案1

@G.JayKerns 在评论中给出了一个非常好的解决方案,但由于这个问题已经有一段时间没有答案了,所以我会补充一下。重要的 elisp 变量是org-latex-pdf-process,它可以与许多设置一起使用。我的设置如下:

(setq org-latex-pdf-process (list
   "latexmk -pdflatex='lualatex -shell-escape -interaction nonstopmode' -pdf -f  %f"))

这是一个简化,因为我根据一些其他 orgmode 宏行动态设置了实际变量,但基本思想应该可行。

latexmk您可以使用显式的多次迭代或类似的构建过程。使用您在命令行中需要的操作,如果出现错误,请检查缓冲区中的rubber日志。org-latex-pdf-process*Org PDF LaTeX Output*

Org-mode 文件看起来应该像这样: org-bib-test.org

* Tests
** Test1 slide
   - This is test1 \cite{Tappert77}.

\bibliographystyle{plain}
\bibliography{org-bib-test-refs}

将您的 bibtex 放入文件中org-bib-test-refs.bib并运行C-c C-e l o,就应该没问题。

答案2

这个答案来自

org-mode 中的 .bbl 问题

(setq org-latex-to-pdf-process (list "latexmk -pdf %f"))

为我工作

答案3

org-latex-pdf-process摘自org-mode 8.2.5h 版(2014 年 2 月 10 日)的文档:

默认情况下,Org 使用 3 次运行来pdflatex进行处理。如果您的系统上有 texi2dvi,并且不会导致臭名昭著的 egrep/locale 错误:

http://lists.gnu.org/archive/html/bug-texinfo/2010-03/msg00031.html

thentexi2dvi是更好的选择,因为它通过调用“正确”的辅助程序组合来自动化 LaTeX 构建过程。Org 确实提供了texi2dvi自定义选项之一。或者,rubberlatexmk提供类似的功能。后者开箱即用地支持“biber”。

自定义缓冲区提供了一个包含的值菜单texi2dvi,因此可以通过该界面轻松设置。如果您希望在 .emacs 中设置值,则可以使用以下命令:

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

答案4

因为 bibtex 通常使用,\cite{some_reference}所以在 org-mode 中存在涉及 reftex 的冲突,其中通常使用 bib{some_reference}。为了解决这个问题,我定义了一个 my-org2pdf-export,它对我使用 emacs-24 和 org 8.3 的工作很有效。然后我使用 reftex 调用引用来创建一个 org 文件,然后在我想要导出到 pdf 文件时使用 Mx my-org2pdf-export RET。

;;; Begin "my-org2pdf-export"
;;;
;;; Define bib2cite
(defun my-bib2cite ()
"change bib to cite"
(interactive)
(let ((case-fold-search t)) ; or nil
(goto-char (point-min))
(while (search-forward "bib:" nil t)
(replace-match "cite:" t t))))
;;;
;;; Define cite2bib
(defun my-cite2bib ()
"change cite to bib"
(interactive)
(let ((case-fold-search t)) ; or nil
(goto-char (point-min))
(while (search-forward "cite:" nil t)
(replace-match "bib:" t t))))
;;;
;;; Change bib: to cite: in .org file
;;; Then call org-export-dispatch and 
;;; then change cite: back to bib: 
;;; to leave original .org file unchanged.
(defun my-export-org ()
"export settings"
(interactive)
(my-bib2cite) ;; Change bib: to cite:
(org-export-dispatch) ;; Call the dispatcher
(my-cite2bib) ;; Change cite: back to bib:
(save-buffer);; Save file again
) ;; End bracket
;;; End "my-org2pdf-export".

相关内容