组织模式:导出时,从目录中排除特定标题


13

问:org-mode导出时如何判断要从目录中排除特定标题?

例如,导出

* Headline 1: Put me in TOC
* Headline 2: Put me in TOC
* Headline 3: DO NOT put me in TOC

生成HTML

...
<div id="text-table-of-contents">
  <ul>
    <li><a href="#sec-1">1. Headline 1: Put me in TOC</a></li>
    <li><a href="#sec-2">2. Headline 2: Put me in TOC</a></li>
    <li><a href="#sec-3">3. Headline 3: DO NOT put me in TOC</a></li>
  </ul>
</div>
...

但我要它产生

...
<div id="text-table-of-contents">
  <ul>
    <li><a href="#sec-1">1. Headline 1: Put me in TOC</a></li>
    <li><a href="#sec-2">2. Headline 2: Put me in TOC</a></li>
  </ul>
</div>
...

内容表中的部分org-mode手册没有这方面的消息。

另外,我知道我可以通过()org-mode设置COMMENT关键字或使用标记来避免导出标题。虽然这确实使受影响的标题不会出现在TOC中,但它也导致其内容从生成的文档中省略,这不是我想要的。C-c ;org-toggle-comment:noexport:


1
这不是您要查找的答案,只是作为另一个死胡同的提示:EXPORT_OPTIONS: toc:nil 几乎可以满足您的需求,但仅当您仅导出子树时。为了明确起见,您是否仍要对该部分进行编号,或者您想要类似于LaTeX的内容\section*
肖恩·艾瑞德

@SeanAllred我希望该部分仍然编号。更笼统地说,我不想更改各个节的导出方式。我只是不希望其中一些出现在目录中。
itsjeyd 2014年

Answers:


12

组织用于org-export-collect-headlines收集应该在目录中的标题。此功能已经包括两个用于排除标题的条件:标题深度以及是否为“脚注部分”(*),因此很容易添加另一个。

请参阅org-export-collect-headlines下面的修改版本。通过设置该NOTOC属性,此版本可以防止标题显示在目录中。

* Section 1: shows up in the TOC

* Section 2: modified Org code (not in the TOC)
  :PROPERTIES:
  :NOTOC:    t
  :END:

  This is the modified =org-export-collect-headlines=:

  #+BEGIN_SRC elisp
  (defun org-export-collect-headlines (info &optional n)
    "Collect headlines in order to build a table of contents. [...]

  Return a list of all exportable headlines as parsed elements.
  Footnote sections, if any, will be ignored."
    (let ((limit (plist-get info :headline-levels)))
      (setq n (if (wholenump n) (min n limit) limit))
      (org-element-map (plist-get info :parse-tree) 'headline
        #'(lambda (headline)
            (unless (or (org-element-property :NOTOC headline)               ; new condition
                        (org-element-property :footnote-section-p headline)) ; old condition
              (let ((level (org-export-get-relative-level headline info)))
                (and (<= level n) headline))))
        info)))
  #+END_SRC

** Sub-section
   This shows up in the TOC: property inheritance is off by default.

(*)我不知道什么是“脚注部分”。

这适用于手动构建TOC的导出后端。LaTeX,Beamer和Texinfo后端没有。

通过添加此建议,org-export-numbered-headline-p可以使UNNUMBERED属性导出为标题,将属性\section*{...}导出到LaTeX和Beamer时将它们从TOC中排除:

(advice-add 'org-export-numbered-headline-p :around
            (lambda (orig headline info)
              (and (funcall orig headline info)
                   (not (org-element-property :UNNUMBERED headline)))))

请注意,截至2014年10月3日20:06:34(GMT),UNNUMBERED的检查已内置


1
谢谢,这对HTML导出效果很好。实际上,我也需要此功能才能用于LaTeX / Beamer;我最初没有提到这一点是因为我认为必须有一个通用的解决方案,该解决方案适用于所有(或至少大多数)出口后端。您是否知道如何解决LaTeX出口的这一问题?比较.html和导出时生成的.tex文件,org-mode主要问题似乎是org-mode为HTML手动构建TOC,而只是将通用文件转储\tableofcontents.tex文件中。
itsjeyd 2014年

@itsjeyd:我认为不可能有通用的解决方案:正如您所说,LaTeX(以及Beamer和Texinfo)导出后端使用本机命令来构建TOC,而其他后端则是手动构建TOC。这可能的排除在TOC LaTeX的一个部分,但我还没有发现,被社会接受的解决方案正确的。使用我在org-mode导出代码中链接到的想法时,需要对进行重大更改org-latex-headline。至于在Texinfo支持下实现这一点,我什至不知道从哪里开始。
君士坦丁

好的,非常感谢您的跟进。对于Beamer,我认为我只会将不想显示在目录中的部分设为未编号。案件结案。:)
itsjeyd 2014年

@itsjeyd:您可以修改org-export-numbered-headline-p为几乎自动获得此行为-如果可以将其变成未编号的部分,可以选择。如果您有兴趣,我可以详细说明。
君士坦丁

请做-一直对简化解决方案感兴趣!
itsjeyd 2014年
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.