Можно ли экспортировать содержимое поддеревьев без их заголовков?

28

Я создаю проекты документов в режиме org и экспортирую их в LaTeX, HTML и т. Д. По мере необходимости. Я часто использую тэг :no_export:всякий раз, когда не хочу, чтобы определенное поддерево отображалось в выходных данных.

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

Я идеально представляю себе тег как :no_title:. Я хочу, чтобы мой контур в режиме org выглядел более или менее так, как я привык. Но я бы рассмотрел другие подходы с похожими результатами.

Для иллюстрации приведем MWE документа, созданного в режиме org.

* Chapter 1
** Section 1
*** Paragraph 1      :no_title:
First paragraph of text in the section.
*** Paragraph 2      :no_title:
Second paragraph of text in the section.
* Chapter 2
** Section 1
*** Subsection 1
**** Paragraph 1      :no_title:
First paragraph of text in the subsection.
**** Paragraph 2      :no_title:
Second paragraph of text in the subsection

Когда я экспортирую это в настоящее время, я получаю что-то вроде этого:

1 глава 1

1.1 Раздел 1

1.1.1 Пункт 1: no_title:

Первый абзац текста в разделе.

1.1.2 Пункт 2: no_title:

Второй абзац текста в разделе.

2 Глава 2

2.1 Раздел 1

2.1.1 Подраздел 1

◊ 2.1.1.1 Пункт 1: no_title:

Первый абзац текста в подразделе.

Но то, что я хочу, больше похоже на это:

1 глава 1

1.1 Раздел 1

Первый абзац текста в разделе.

Второй абзац текста в разделе.

2 Глава 2

2.1 Раздел 1

2.1.1 Подраздел 1

Первый абзац текста в подразделе.

Брайан З
источник

Ответы:

27

Это может быть предпочтительным способом (из-за его простоты) достижения вашей цели - кажется, он был похоронен в комментариях к другому ответу:

  1. Добавьте следующее в ваш .emacsфайл:

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Используйте ignoreтег в заголовках, которые вы хотели бы игнорировать (не игнорируя их содержимое)

ПРИМЕЧАНИЕ: если вы используете ELPA для установки org-mode, вы должны добавить репозиторий org-mode в свой список репозиториев ELPA. Смотрите здесь для более подробной информации. После этого обновите список пакетов ( M-x package-refresh-contents) и установите org-plus-contribпакет (например, с помощью M-x package-install). Не забудьте избавиться от любых старых установок в режиме орг.

отметка
источник
2
Это правильный ответ.
Расм
Я принял это как ответ, хотя он не будет работать для меня. Я попытался загрузить org-extra.el, но некоторые другие функции все еще отсутствовали (я застрял с Org 8.2.4).
Брайан З
Я не могу найти посылку «бык-экстра» ...
Зубной щенок
1
@ Tootrot он находится в contrib/lispпапке - см. Orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - в вашем конфигурационном файле emacs вам может понадобиться добавить строку вроде (add-to-list 'load-path "/path/to/contrib/lisp"),
Mark
Обратите внимание, что это только слова в org 8.3+. И вы не можете просто взять ox-extra.el с зависимостями org 8.3+. При экспорте вы получите ошибки о невозможности найти необходимые файлы.
Доджи
16

Да , это вполне возможно. Добавьте следующий код в ваш init-файл:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)

Подтверждения

Этот вопрос задавался ранее в StackOverflow (с другой направленностью и формулировкой, поэтому, вероятно, вы не смогли найти его, когда искали в интернете перед публикацией здесь). Код выше является упрощенной версией кода в принятом ответе ; он работает для нового экспортера, представленного в org-mode8.0, и не зависит от сервера .

Обновить

Как обсуждалось в комментариях, приведенный выше код приводит к тому, что содержимое записей, помеченных значком, :no_title:исчезает, если им предшествует запись, помеченная для исключения из экспортируемого документа. Например, при экспорте следующего документа будет создан документ с заголовком и оглавлением, но без содержимого:

#+EXCLUDE_TAGS: no_export

* No export                          :no_export:
  This is not meant for you to see.
* No title                           :no_title:
  You should see this.

Причина этого заключается в том, что org-modeудаляет заголовок с тэгом , :no_title:прежде чем она удаляет запись , чей заголовок помечен :no_export:. В результате, когда он добирается до удаления no_exportзаписи, он рассматривает содержимое no_titleзаписи как принадлежащее предыдущей no_exportзаписи. Это имеет смысл, потому что больше нет структурного элемента (заголовка), который больше разделяет содержимое исходных записей.

Чтобы решить эту проблему, мы можем передать ответственность за удаление no_exportзаписей на org-remove-headlines. Таким образом, мы уберегаем все no_exportзаписи до того, как заголовки будут удалены из no_titleзаписей:

(defun org-remove-headlines (backend)
  "Remove headlines with :no_title: tag."
  (org-map-entries (lambda () (let ((beg (point)))
                                (outline-next-visible-heading 1)
                                (backward-char)
                                (delete-region beg (point))))
                   "no_export" tree)
  (org-map-entries (lambda () (delete-region (point-at-bol) (point-at-eol)))
                   "no_title"))

(add-hook 'org-export-before-processing-hook #'org-remove-headlines)
itsjeyd
источник
Я много этим пользуюсь, так что спасибо! Но я заметил проблему ... Если заголовок, помеченный no_exportзаголовком, предшествует одному, помеченному заголовком no_title, то содержимое второго заголовка также не экспортируется.
Брайан Z
@BrianZ Всегда пожалуйста! Являются ли братья no_exportи no_titleсестры братьями и сестрами (т.е. имеют ли они одинаковое количество ведущих звезд)? Если нет, то в каком из двух заголовков больше звезд?
itsjeyd
Они братья и сестры. Экспорт этого игрушечного примера не имеет никакого содержания для меня (только заголовок, оглавление и т. Д.) Pastebin.com/KaiK9qJm
Брайан З.
1
@BrianZ Само по себе org-remove-headlinesэто просто функция; это не очень поможет, если его никогда не вызывать откуда угодно. Так что да, вам все равно нужно оценить строку, (add-hook 'org-export-before-processing-hook #'org-remove-headlines)чтобы включить правильное поведение. Я, вероятно, должен был быть явно об этом в редактировании моего первоначального ответа. Что касается предупреждений, которые вы видите: я не получаю те с ванильным Emacs 24.4 и версией 8.2.10 режима Org. Чтобы избавиться от предупреждения, которое вы упоминаете, вы можете попытаться сделать это (require 'org-agenda)перед оценкой add-hookстроки.
itsjeyd
2
Эта функция также реализована как org contrib. Ref: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/...
rudolfo.christ