对于非beamer文档,是否存在等效的Org-mode的b_ignoreheading?

时间:2012-04-24 09:27:29

标签: emacs org-mode

使用组织模式创建beamer presentation时,可以设置标题的property,以便不显示导出的标题,只显示其内容。例如,以下

#+title: Test

#+options: toc:nil
#+latex_class: beamer
#+startup: beamer

#+BEAMER_FRAME_LEVEL: 2

* Ignored heading                                           :B_ignoreheading:
:PROPERTIES:
:BEAMER_env: ignoreheading
:END:
Text

结果只有一个框架,只有“文本”而没有标题。这种功能是否适用于非beamer文档?也就是说,是否可以告诉Org-mode不导出标题而只导出其内容?例如,是否可以使Org-mode导出以下

#+title: Test

* Ignored heading
Text

不导出标题“忽略标题”但只导出“文字”?

如果我导出

#+title: Test

* 
Text

(注意*之后的空间)到LaTeX我得到以下内容(我只包括相关部分):

\section{}

Text

但这不是我想要的。我希望在导出中完全忽略标题,以便我得到以下内容(同样我只包括相关部分):

Text

3 个答案:

答案 0 :(得分:8)

您所要求的内容没有默认支持。但是你可以使用 一个预处理钩子来获得类似的输出。以下是LaTeX导出的示例:

;; backend aware export preprocess hook
(defun sa-org-export-preprocess-hook ()
  "My backend aware export preprocess hook."
  (save-excursion
    (when (eq org-export-current-backend 'latex)
      ;; ignoreheading tag for bibliographies and appendices
      (let* ((tag "ignoreheading"))
        (org-map-entries (lambda ()
                           (delete-region (point-at-bol) (point-at-eol)))
                         (concat ":" tag ":"))))))

(add-hook 'org-export-preprocess-hook 'sa-org-export-preprocess-hook)

这是我的组织模式设置的片段。你可以看到原件 github。 上面的代码将忽略标有ignoreheading的标题,例如

* Heading 1
* Heading 2                           :ignoreheading:
+ Some text
+ an item

导出为:

\section{Heading 1}
\label{sec-1}

\begin{itemize}
\item Some text
\item an item
\end{itemize}

警告:此解决方案存在已知问题。它 当你在第一个标题上尝试这个时,它不起作用。我不 明白为什么会这样,希望有一天我会有时间 调查。

解决方法需要注意:以上限制可以 通过在组织之后使用这样的行来规避LaTeX导出 文件头:

\include{preamble.tex}

preamble.tex文件可以包含抽象或 确认。但是你应该注意这会使你的组织文件非常好 与出口后端密切相关。这将变得非常重要 例如,将相同的组织文件导出为HTML。

注意:对于使用新导出框架的类似设置(Org 8.0或更高版本),使用以下内容:

(defun sa-ignore-headline (contents backend info)
  "Ignore headlines with tag `ignoreheading'."
  (when (and (org-export-derived-backend-p backend 'latex 'html 'ascii)
          (string-match "\\`.*ignoreheading.*\n"
                (downcase contents)))
    (replace-match "" nil nil contents)))

(add-to-list 'org-export-filter-headline-functions 'sa-ignore-headline)

答案 1 :(得分:3)

我在Debian Jessie上找到了Emacs 24.4.1和Org-mode 8.2.10的简单解决方案,它在处理之前删除了标记的标题,因此它也删除了它们的结构节点,而不仅仅是文本。

;; ignore_heading tag in Org mode, based on the manual and func docs
(defun ignored-headlines-removal (backend)
  "Remove all headlines with tag ignore_heading in the current buffer.
     BACKEND is the export back-end being used, as a symbol."
  (org-map-entries
   (lambda () (delete-region (point) (progn (forward-line) (point))))
   "ignore_heading"))

(add-hook 'org-export-before-parsing-hook 'ignored-headlines-removal)

我没有特定的导出后端,因为它不需要。我还使用ignore_heading标记来确保beamer导出中的ignoreheading标记保留其功能。

以下是我发现它的方式:

  1. 我查看了Org手册中Advanced confuguration部分中的钩子文档。它包含一个忽略所有标题的钩子示例,几乎是我需要的,但我必须找到一种方法来仅删除带有ignore_heading标记的标题。
  2. 我查看了org-map-entries函数的文档(通过在Emacs中键入C-h f org-map-entries RET)并发现其可选的第二个参数MATCH是一个议程样式的匹配字符串,可以也匹配标签。
  3. 这次经历再一次向我展示了Emacs真正是一个可扩展的自我记录编辑器。 RTFM FTW!

答案 2 :(得分:1)

现在,您可以使用ox-extra轻松完成此操作。将以下内容添加到init文件中:

(require 'ox-extra)
(ox-extras-activate '(ignore-headlines))

然后,任何带有ignore标记的标题都会被忽略,而其内容仍会被导出。