EMACS-DOCUMENT

=============>集思广益

用Org-mode写作:如何导出部分内容

1 Selective Export in Org-Mode

使用org-mode写作的一个优势在于能够随意决定导出哪部分的内容. 比如我可以在org文件中保留下论文的大纲但是却并不导出到最终的pdf文件中去. 也可以在准备综合测试时将长篇笔记中的总结给导出来.

本文,我将告诉你两种防止内容被导出的方法: tags 与 drawers. tags与drawers两者的根本区别在于标签是作用于标题的(对章节与子章节中的全部内容生效),而drawers并不像标签那样作用域于标题.

这里尤其需要提一下的是注释. 以 # 开头的行,或 #+BEGIN_COMMENT#+END_COMMENT 之间的内容都被认为是注释. 详情请参见Org-mode manual. 不过我这里只对那些能够导出的部分感兴趣-只有那些内容才能导出到pdf文件中,也只能对那些内容添加tag和drawer.

2 Tags

Org-mode允许你为标题分配标签. Org-mode的manual 详细地介绍了与标签相关的那些函数及其使用方法. 我们这里只需要知道如何如何设置tag,导出时隐藏指定标签的相关内容以及在导出时不导出标签本身,三件事情就行了.

2.1 Setting a Tag

插入标签最简单的方法就是按下 C-c C-q. 当然manual中也有其他更复杂的插入方式. Tags不仅应用于标题本身,还应用于标题所包含的那些内容. 举个例子,假设我正在复习考试笔记,我将某个章节打上标签 :summary: 后,该章节下的所有子章节都隐式地基础了该标签. 若我在导出时排除了带 :summary: 标签的内容的话,则该章节及其子章节都会被排除出去.

2.2 Hiding Tagged Content on Export

依然假设我正在复习考试笔记, 假设我的的考试笔记有两个不同的标签,分别为 :summary::fullnotes:, 其详细内容如下所示:

* Article X by Philosopher Z 
** Summary                                                          :summary:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse a
diam velit. Vestibulum pharetra mi eu nisl luctus, vitae condimentum
mauris volutpat.

** Full notes                                                     :fullnotes:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse a
diam velit. Vestibulum pharetra mi eu nisl luctus, vitae condimentum
mauris volutpat. Mauris aliquet eleifend erat, nec vestibulum neque
bibendum ac. In nec risus mauris. Nulla risus tortor, sodales vitae
ligula quis, dapibus aliquam magna. Fusce pharetra, tellus gravida
posuere tempor, orci enim ullamcorper metus, nec aliquam ipsum ex in
velit. Donec ante massa, consequat sed consequat at, porttitor quis
metus. Cras sit amet dui ac neque pulvinar rutrum id id tellus.

则,我只需要在org文件的头部加上 #+EXCLUDE_TAGS: summary 就能在导出时将带 :summary: 标签的内容排除出去,只留下 :fullnotes: 的内容.

2.3 Hiding Tag Labels on Exported Content

你为标题加上标签后,会发现通过 \(\rm\LaTeX{}\) 导出的pdf文件中会有一个标题显示在标题的右边. 大多数的时候你都会想把这个标签在导出时给隐藏起来. 方法也很简单,只需要在org的头部加上 #+OPTIONS: tags:nil 就行了.

2.4 Hiding Headers while Using Tags

假设你又这么一份文档:

* Lorem Ipsum
** Summary                                                          :summary:

Vivamus libero nisi, maximus scelerisque felis ac, dapibus posuere
metus. In hac habitasse platea dictumst.  

** Body text

Vivamus libero nisi, maximus scelerisque felis ac, dapibus posuere
metus. In hac habitasse platea dictumst.  Fusce aliquam nisi in lorem
pretium, vel congue lacus consectetur. Donec in ligula ligula. Etiam
rutrum tortor a euismod convallis. Nunc mattis laoreet mi, vitae
ullamcorper arcu. Quisque semper, velit in dictum viverra, augue mi
iaculis urna, non ultricies lacus mauris id neque.

那么你在将之导出成pdf文件时,可以通过 #+EXCLUDE_TAGS: summary 来将summary部分的内容排除掉. 不过随后你会发现导出内容中,在章节标题(“1. Lorem Ipsum”)后面紧接着一个子章节的标题(“1.1 Body text”). 这种样式一般都很难看:

selective-export-1.png

但是呢,你也不能直接删掉 ** Body text 这一行呀,因为这样你后面的内容会被当成summary而不被导出.

这时候就该 :ignoreheading: 标签大显神通了. 该标签允许你导出章节内容及其子章节,但却让章节本身隐藏起来. 在上面的例子中,你可以为 **Body text 子章节分配一个 :ignoreheading: 标签, 这样一来导出的pdf中, 本文 Vivamus libero nisi… 就紧跟在 Lorem Ipsum 标题之后了.

selective-export-2.png

用后面将的drawer也能达到相同的想过.(甚至我觉得用drawer会更方便一些)

3 Drawers

3.1 What Drawers Are

org-mode manual中关于drawers的内容 很值得一看. 里面说,drawer一般用于存放那些你平时不想看到的相关信息. 里面还举了一个例子:

** This is a headline Still outside the drawer
   :DRAWERNAME: 
   This is inside the drawer.
   :END:
   After the drawer.

3.2 When You Might Use Drawers in Writing

为什么我们不一直用tags呢? 这是因为tags是作用于整个章节上的(包括该章节下面的内容以及子章节),但是有时候我们不想隐藏整个章节的内容,这时drawers就很有用了.

* Main Section
** Outline                                                        :outline:
1. Sed eget arcu nec ligula tristique pretium sit amet eget justo.
   1. Cras lacinia at odio at tincidunt.
   2. Maecenas vitae risus nec arcu pulvinar hendrerit.
      1. Class aptent taciti sociosqu ad litora torquent per conubia
         nostra, per inceptos himenaeos.
2. Quisque pellentesque placerat elementum.
   1. Nam arcu felis, tempor id ex ac, sollicitudin tristique nisl.
   2. Maecenas facilisis dui at neque vulputate rutrum.
   3. Nam eleifend nunc accumsan lorem imperdiet vulputate.
3. Donec eu orci vel eros blandit tincidunt eu pulvinar leo. 

** Body
Vivamus odio mauris, fermentum semper tempus id, scelerisque vel
metus. Aliquam risus lectus, lobortis ut risus eu, facilisis
consectetur diam. Sed euismod ullamcorper erat, at lacinia enim
lacinia eget. Nam sed justo dapibus, tempus ipsum et, sagittis
ex. Integer interdum consequat augue pellentesque fermentum. Integer
vehicula lorem sed purus vulputate, vitae cursus risus
eleifend. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

上面这段例子,用drawer来写就是这样的:

* Main Section

:OUTLINE: 
1. Sed eget arcu nec ligula tristique pretium sit amet eget justo.
   1. Cras lacinia at odio at tincidunt.
   2. Maecenas vitae risus nec arcu pulvinar hendrerit.
      1. Class aptent taciti sociosqu ad litora torquent per conubia
         nostra, per inceptos himenaeos.
2. Quisque pellentesque placerat elementum.
   1. Nam arcu felis, tempor id ex ac, sollicitudin tristique nisl.
   2. Maecenas facilisis dui at neque vulputate rutrum.
   3. Nam eleifend nunc accumsan lorem imperdiet vulputate.
3. Donec eu orci vel eros blandit tincidunt eu pulvinar leo. 
:END:

Vivamus odio mauris, fermentum semper tempus id, scelerisque vel
metus. Aliquam risus lectus, lobortis ut risus eu, facilisis
consectetur diam. Sed euismod ullamcorper erat, at lacinia enim
lacinia eget. Nam sed justo dapibus, tempus ipsum et, sagittis
ex. Integer interdum consequat augue pellentesque fermentum. Integer
vehicula lorem sed purus vulputate, vitae cursus risus
eleifend. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

3.3 Inserting Drawers

插入drawers非常容易: 按下 C-c C-x d 就行了. org-mode manual中有更多详细的细节,不过就目前来说我们只需要知道这点就行了.

3.4 Hiding Drawers on Export

要在导出时隐藏所有的drawers的内容, 你可以在org文件的头部加上 #+OPTIONS: d:nil.

不过如果我紧紧想排除 :OUTLINE: drawer的内容怎么办呢? 这时,我需要加上的是 #+OPTIONS: d:(not) 这一行. 这样一来除了 :OUTLINE: 之外的drawer内容都会导出来. 如果你想隐藏 :OUTLINE::SUMMARY: 这两个drawers的内容, 你需要加上的是 #+OPTIONS: d: (not not "SUMMARY") 这样一行内容.

3.5 Cycling through Drawers like Headers

如果你使用drawers来存放章节总结之类的内容,那么你也许会希望能像章节头一样cycle through这些drawer. 好在 StackExchange上有两个用户折腾出了一个扩展, 你只要把这段代码放入 .emacs 文件中(若你用的是Aquamacs那么放入 Preferences.el 中) 就能对 :SUMMARY: drawer 实现类似的功能了. 你也很容易就能将这段代码修改成对其他drawer生效. 不过就我来说,如果我希望drawer能像章节头一样cycle through的话,那我就这届用标题头就好了.

tags 和 drawers的用法还有很多种,不过本文应该教会你了关于如何通过tags与drawers导出org-mode中部分内容的足够知识了.