![如何让 BibTeX 与 Org 模式 LaTeX 导出一起工作?](https://linux22.com/image/268649/%E5%A6%82%E4%BD%95%E8%AE%A9%20BibTeX%20%E4%B8%8E%20Org%20%E6%A8%A1%E5%BC%8F%20LaTeX%20%E5%AF%BC%E5%87%BA%E4%B8%80%E8%B5%B7%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我正在尝试让 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 中自动完成此过程,但我宁愿解决问题,而不是简化破解。
编辑
我已经检查过.tex
Org 模式生成的文件。它做其中导出了以下必要的行:
\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
答案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
then
texi2dvi
是更好的选择,因为它通过调用“正确”的辅助程序组合来自动化 LaTeX 构建过程。Org 确实提供了texi2dvi
自定义选项之一。或者,rubber
也latexmk
提供类似的功能。后者开箱即用地支持“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".