是否可以导出没有标题的子树的内容?


28

我以组织模式起草文档,并根据需要将其导出到LaTeX,HTML等。:no_export:每当我不希望某个子树出现在输出中时,我都会经常使用该标记。

我还想要的是导出完全忽略某些子树标题,而不要忽略该标题下子树的内容。换句话说,应将某些子树导出,就好像它们的内容只是父级的延续一样,而不是拥有自己的子树。

理想情况下,我想像的标签是:no_title:。我希望我的组织模式大纲看起来或多或少像我以前那样。但我会考虑其他具有类似结果的方法。

为了说明这一点,这是在组织模式下起草的文档的MWE。

* Chapter 1
** Section 1
*** Paragraph 1      :no_title:
First paragraph of text in the section.
*** Paragraph 2      :no_title:
Second paragraph of text in the section.
* Chapter 2
** Section 1
*** Subsection 1
**** Paragraph 1      :no_title:
First paragraph of text in the subsection.
**** Paragraph 2      :no_title:
Second paragraph of text in the subsection

当我当前导出该文件时,会得到如下信息:

1第1章

1.1第1节

1.1.1第1款:no_title:

本节中的第一段文字。

1.1.2第2款:no_title:

本节中的第二段。

2第2章

2.1第1节

2.1.1第1款

◊2.1.1.1第1款:no_title:

小节中的文本第一段。

但是我想要的更像是这样:

1第1章

1.1第1节

本节中的第一段文字。

本节中的第二段。

2第2章

2.1第1节

2.1.1第1款

小节中的文本第一段。

Answers:


27

这可能是实现目标的一种首选方法(由于它很简单),它似乎已经埋在另一个答案的注释中:

  1. 将以下内容添加到您的.emacs文件中:

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. ignore在您想忽略的标题上使用标签(而不忽略其内容)

注意:如果使用ELPA安装org-mode,则必须将org-mode存储库添加到ELPA存储库列表中。有关更多详细信息,请参见此处。完成此操作后,刷新软件包列表(M-x package-refresh-contents)并安装org-plus-contrib软件包(例如使用M-x package-install)。不要忘记摆脱任何旧的组织模式安装。


2
这是正确的答案。
拉斯姆斯,2015年

我接受了这个答案,尽管它对我不起作用。我尝试加载org-extra.el,但仍然缺少一些其他功能(我受Org 8.2.4的束缚)。
Brian Z

我找不到包ox-extra ...
Toothrot '16

1
@Toothrot位于contrib/lisp文件夹中-请参阅orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el-在您的emacs配置文件中,您可能需要添加一行(add-to-list 'load-path "/path/to/contrib/lisp")
2016年

请注意,这仅适用于org 8.3+。而且,您不能仅仅抓住ox-extra.el,它具有org 8.3+依赖关系。导出时会出现错误,提示您找不到所需的文件。
Dodgie

16

是的,这完全有可能。将以下代码添加到您的init文件中:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)

致谢

之前已经在StackOverflow 上过这个问题(重点和措词不同,这可能就是为什么在此处发布之前搜索互联网时找不到它的原因)。上面的代码是接受的答案中代码的简化版本;它适用于8.0中引入的新导出器org-mode并且与后端无关

更新资料

作为评价所讨论的,上面具有标记的条目的原因内容的代码:no_title:消失,如果它们是由被标记为从导出的文档中排除的条目之前。例如,导出以下文档将生成一个带有标题和目录但没有内容的文档:

#+EXCLUDE_TAGS: no_export

* No export                          :no_export:
  This is not meant for you to see.
* No title                           :no_title:
  You should see this.

这样做的原因是,org-mode删除标题标记:no_title:它消除了之前进入其标题被加上:no_export:。结果,当到处删除no_export条目时,它将条目的内容no_title视为属于先前no_export条目。这是非常合理的,因为没有结构元素(标题)可以将原始条目的内容分开。

为了解决这个问题,我们可以将删除no_export条目的责任转移到org-remove-headlines。这样,我们确保no_export在删除标题之前删除所有no_title条目:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (let ((beg (point)))
                                (outline-next-visible-heading 1)
                                (backward-char)
                                (delete-region beg (point))))
                   "no_export" tree)
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)

我已经使用了很多,谢谢!但是我注意到了一个问题...如果标有no_export标题的标题恰好在标有的标题之前no_title,那么第二个标题的内容也不会导出。
布赖恩·Z

@BrianZ不客气!是no_exportno_title标题的同级兄弟(即,他们拥有相同数量的领先明星)吗?如果不是,那么两个标题中哪个有更多的星星?
itsjeyd 2015年

他们是兄弟姐妹。这个玩具示例的导出对我而言根本没有任何内容(只是标题,目录等)pastebin.com/KaiK9qJm
Brian Z

1
@BrianZ本身org-remove-headlines只是一个函数;如果永远不会从任何地方调用它,它不会对您有太大帮助。因此,是的,您仍然需要评估该行(add-hook 'org-export-before-processing-hook #'org-remove-headlines)以启用正确的行为。我可能应该在原始答案的编辑中对此进行明确说明。至于您看到的警告:我没有使用香草Emacs 24.4和Org Mode的8.2.10版本的警告。要摆脱警告,您可以(require 'org-agenda)在评估add-hook生产线之前尝试尝试。
itsjeyd 2015年

2
此功能也作为org contrib实现。参考文献:orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/...
rudolfo.christ
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.