9

使用 Org 模式创建投影仪演示时,可以设置标题的属性,以便不显示导出的标题,而只显示其内容。例如,以下

#+title: Test

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

#+BEAMER_FRAME_LEVEL: 2

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

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

#+title: Test

* Ignored heading
Text

不导出标题“忽略的标题”而只导出“文本”?

如果我出口

#+title: Test

* 
Text

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

\section{}

Text

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

Text
4

3 回答 3

9

您所要求的内容没有默认支持。但是,您可以使用预处理挂钩来获得类似的输出。这是 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)

这是我的 org-mode 设置中的一个片段。你可以在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}

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

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

\include{preamble.tex}

preamble.tex文件可以包括摘要或致谢等部分。但是您应该注意,这会使您的 org 文件与导出后端非常紧密地联系在一起。例如,将相同的 org 文件导出到 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)
于 2012-04-24T20:07:59.077 回答
4

现在您可以使用ox-extra. 将以下内容添加到您的init文件中:

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

然后任何带有标签的标题ignore都将被忽略,而它们的内容仍将被导出。

于 2017-02-09T02:41:48.620 回答
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标签来确保ignoreheading投影仪导出中的标签保留其功能。

这是我发现它的方法:

  1. 我查看了组织手册中高级配置部分的钩子文档。它包含一个忽略所有标题的钩子示例,这几乎是我需要的,但我必须找到一种方法来仅删除带有ignore_heading标签的标题。
  2. 我查看了org-map-entries函数的文档(通过输入C-h f org-map-entries RETEmacs),发现它的可选第二个参数MATCH是一个议程样式的匹配字符串,它也可以匹配标签。

这次经历再次向我展示了 Emacs 确实是一个可扩展的自文档编辑器。RTFM FTW!

于 2015-04-12T10:35:59.363 回答