Существует ли эквивалент B ignoreheading в Орг-режиме для документов, не являющихся бимерами?


При использовании Org-mode для создания представления бимера можно задать свойство заголовка таким образом, чтобы экспортируемый заголовок не отображался, а только его содержимое. Например, следующее

#+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, чтобы он экспортировал не заголовок, а только его содержимое? Например, можно ли сделать орг-режим экспортируйте следующие

#+title: Test

* Ignored heading
Text

Без экспорта заголовка "игнорируемый заголовок", но только "текст"?

Если я экспортирую

#+title: Test

* 
Text

(Обратите внимание на пробел после *) к LaTeX я получаю следующее (Я включил только соответствующую часть):

section{}

Text

, но это не то, чего я хочу. Я хочу, чтобы заголовок был полностью проигнорирован в экспорте, чтобы я получил следующее (опять же, я включаю только соответствующую часть):

Text
3 8

3 ответа:

Нет поддержки по умолчанию для того, что вы просите. Однако вы можете использовать предпроцессный крюк для получения аналогичного вывода. Вот пример экспорта латекса:

;; 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)

Я нашел простое решение для Emacs 24.4.1 и Org-mode 8.2.10 на Debian Jessie, которое удаляет помеченные заголовки перед обработкой, поэтому он удаляет и их структурные узлы, а не только текст.

;; 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 в Beamer export сохраняет свою функцию.

Вот как я это обнаружил:

  1. я посмотрел документацию по крюку в Advanced раздел confuguration в руководстве по организации. Он содержит пример крючка, который игнорирует все заголовки, почти то, что мне нужно, но я должен был найти способ удалить только заголовки с тегом ignore_heading.
  2. я просмотрел документацию функции org-map-entries (набрав C-h f org-map-entries RET в Emacs) и обнаружил, что ее необязательный второй аргумент MATCH является строкой соответствия в стиле повестки дня, которая также может соответствовать тегам.

Этот опыт еще раз показал мне, что Emacs действительно является расширяемым редактор-документалист. РТФМ США.

Теперь вы можете легко сделать это с помощью ox-extra. Добавьте в свой файл init следующее:

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

Тогда любые заголовки с тегом ignore будут проигнорированы, а их содержимое все равно будет экспортировано.