Emacs Org-mode - 导出到另一个目录?

32

我知道这可能是小事情,但它一直在困扰着我。我正在使用Org-mode进行一个项目,并经常导出为PDF或HTML文件,这会在我的目录中留下大量的PDF、Tex和HTML文件。有没有办法让Org-mode导出到另一个位置,比如一个名为./exports的子目录中?


1
请参考 http://emacs.stackexchange.com/a/7989/8541,其中提供了一个干净的解决方案,可以将文件导出到子文件夹中。 - Mark
这个回答解决了你的问题吗?在org-mode中,如何指定导出文件的名称? - Brian Tompsett - 汤莱恩
7个回答

25

原问题涉及到导出org文件,而上面的大部分答案实际上与发布有关,这是一个不同的概念。

我认为解决OP提出的问题的最佳方法是将以下内容添加到您的emacs初始化文件(.emacs):

(defadvice org-export-output-file-name (before org-add-export-dir activate)
  "Modifies org-export to place exported files in a different directory"
  (when (not pub-dir)
      (setq pub-dir "exported-org-files")
      (when (not (file-directory-p pub-dir))
       (make-directory pub-dir))))

PS:

  1. 我意识到一个5年前的问题可能不再与原帖作者相关,但希望搜索类似问题的人能从这个回答中受益。

  2. 这是一个在http://rwx.io/posts/org-export-configurations/上找到的代码片段稍作修改后的结果。

  3. 上述博客中提供的原始解决方案允许为每种导出格式设置不同的目录。 但是,如果目标是避免将自己的目录“弄得满是PDF、Tex和HTML文件”,我认为最好只有一个包含所有格式导出文件的目录,这是我提供的修改的精髓。


编辑:emacs手册(https://www.gnu.org/software/emacs/manual/html_node/elisp/Porting-old-advice.html#Porting-old-advice)指出,新的advice-add机制使defadvice机制过时了。因此,这里提供了一个具有相同效果的代码片段,使用了建议使用的advice-add:

(defun org-export-output-file-name-modified (orig-fun extension &optional subtreep pub-dir)
  (unless pub-dir
    (setq pub-dir "exported-org-files")
    (unless (file-directory-p pub-dir)
      (make-directory pub-dir)))
  (apply orig-fun extension subtreep pub-dir nil))
(advice-add 'org-export-output-file-name :around #'org-export-output-file-name-modified)

和之前一样,这应该放在你的 .emacs 文件中。


1
在添加了这个advice之后,当文件被导出到pub-dir时,在导出子树时它不会使用属性抽屉中使用的文件名“EXPORT_FILENAME”。您有什么想法如何使其工作? - 3d-indiana-jones
虽然这似乎可以导出到orgmode、html和LaTeX,但导出到LaTeX,然后生成pdf并不起作用,因为pdflatex编译失败。 - AstroFloyd
那个建议-添加更新的片段对我非常有效,包括LaTeX/PDF文件。创建目录部分也非常有帮助。 - acjca2

25

除了像@user1248256建议的那样通过修改org-publish-project-alist变量来使用发布,你还可以在文件内直接指定org-export-publishing-directory变量:

#+bind: org-export-publishing-directory "./exports"

* This is a test headline
Some text here.  This should be exported to the "./exports" directory.

导出时,文件将被放置在“exports”目录中,但前提是该目录存在。如果不存在该目录,则您将在控制台中收到一个错误消息。


5
谢谢。我认为这更直接地回答了我的问题。然而,有一件奇怪的事情。如果我将文件导出为HTML或ASCII,那么文件会被放到./exports文件夹中,但是如果我将文件导出为TEX(或PDF),它就会留在当前目录下。也许这是我的配置文件中的某些问题? - tmilktoast
1
其实,我今天刚看到这个问题在org-mode邮件列表上 - 除非那是你发布的? - cm2
2
现在可以处理PDF文件吗?我阅读了邮件列表中的交流,但不清楚是否已经修复了PDF的导出问题。 - Jesse
3
有趣的是,这个设置对我没有用。仍然会将文件导出到与“.org”文件相同的路径下(默认行为)。 - Asaf

11

当这个问题首次被提出时,可能不太可能实现,但最简单的解决方案是将该目录添加到:EXPORT_FILE_NAME:属性中:

:PROPERTIES:
:EXPORT_FILE_NAME: exports/<filename>
:END:

就像接受的答案那样,这个目录必须存在才能使它起作用。


你试过这个吗?对我没用。我正在尝试将PDF导出到特定目录的上一级。我曾在其他地方读到,这仅适用于子树导出而不是整个文件。这还是现状吗? - Jesse
2
无法工作。正在运行Emacs 26.1和Orgmode 9.0.9。文件夹exports/存在。似乎:EXPORT_FILE_NAME:属性根本不起作用,无论是完整路径还是相对路径,带引号或不带引号。 - Guilherme Salomé
1
@Jesse,即使对于子树导出,它对我也没有起作用。 - 3d-indiana-jones
被接受的解决方案不起作用,但这个可以。Emacs 27.1,org 9.5.5。 - breathe_in_breathe_out

7

你需要在org文件开头添加以下行:

#+EXPORT_FILE_NAME: PATH/filename

PATH 是导出文件的文件夹路径(例如:~/exports),filename 是导出文件的文件名(例如:tutorial.html)。


3
我相信您可以通过org-publish来实现这一点。 在emacs配置文件中添加类似以下的内容:
(setq org-publish-project-alist
  '(("html"
     :base-directory "~/org/"
     :base-extension "org"
     :publishing-directory "~/org/exports"
     :publishing-function org-publish-org-to-html)
    ("pdf"
     :base-directory "~/org/"
     :base-extension "org"
     :publishing-directory "~/org/exports"
     :publishing-function org-publish-org-to-pdf)
    ("all" :components ("html" "pdf"))))

请在org-mode中评估此表达式(或重新启动emacs),然后从列表中选择一个项目,按下C-c C-e X。您可以在http://orgmode.org/worg/org-tutorials/org-publish-html-tutorial.htmlhttp://orgmode.org/manual/Publishing.html#Publishing上查看更多信息。

您还可以使用此类设置通过使用属性导出org-mode文件的部分:http://orgmode.org/worg/org-tutorials/org-latex-export.html#sec-9 - cm2
谢谢。我最终会尝试这个。我曾考虑过尝试使用org-publish,但不确定它是否适合我的需求。我还在学习中。 - tmilktoast
我必须将org-publish-org-to-html替换为org-html-publish-to-html才能使其正常工作。 - Searene

0

"导出设置"部分所述,我们可以在文件中使用EXPORT_FILE_NAME来设置输出目录。以下引用是文档的相关部分:

‘EXPORT_FILE_NAME’

要生成的输出文件的名称。否则,Org将根据缓冲区名称和基于后端格式的扩展名生成文件名。


-1
在我的设置中(Emacs 28.2,OrgMode 9.5.5),我遵循这个答案
#+export_file_name: path/filename

它运行良好。注意文件名不包含扩展名(.tex,.html)。

希望这对你有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接