Чи можливо експортувати вміст підрядів без їх заголовків?


28

Я готую документи в org-режимі та експортую їх у необхідні LaTeX, HTML тощо. Я часто використовую тег, :no_export:коли я не хочу, щоб певне піддерево з'являлося у висновку.

Я також хочу, щоб експорт повністю ігнорував певні заголовки піддіаграми , але не ігнорував тоді вміст піддерева під цим заголовком. Іншими словами, певні підкреслення повинні бути експортовані так, як ніби їхній вміст є лише продовженням батьківського, а не власного піддерева.

Я в ідеалі уявляю собі такий тег :no_title:. Я хочу, щоб контури мого органу виглядали більш-менш так, як я звик. Але я б розглядав інші підходи з подібними результатами.

Для ілюстрації, ось 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-режиму, потрібно додати сховище org-mode до свого списку сховищ ELPA. Дивіться тут для більш детальної інформації. Після цього оновіть список пакунків ( M-x package-refresh-contents) та встановіть org-plus-contribпакет (наприклад, за допомогою M-x package-install). Не забудьте позбутися будь-яких старих установок org-mode.


2
це правильна відповідь.
rasmus

Я прийняв це як відповідь, хоча це не спрацює для мене. Я спробував завантажити org-extra.el, але якась інша функція все ще відсутня (я застряг у Org 8.2.4).
Брайан Z

Я не можу знайти пакету вола-зайвого ...
Зуб

1
@Toothrot знаходиться у 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").
Марк

Зауважте, що це лише слова в 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:до зникнення вмісту записів, позначених тегами, якщо їм передує запис, який позначений для виключення з експортованого документа. Наприклад, експорт наступного документа створить документ із заголовком та TOC, але без вмісту:

#+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)

Я цим багато користувався, тому дякую! Але я помітив проблему ... Якщо заголовок, позначений no_exportзаголовком, надходить безпосередньо перед одним із позначкою no_title, то вміст другого заголовка також не експортується.
Брайан Z

@BrianZ Ласкаво просимо! Чи є брати no_exportта no_titleсестри (чи є вони однаковою кількістю провідних зірок)? Якщо ні, то який із двох заголовків має більше зірок?
itsjeyd

Вони є побратимами. Експорт цього прикладу іграшки для мене зовсім не містить вмісту (лише назва, зміст тощо) pastebin.com/KaiK9qJm
Brian Z

1
@BrianZ Сама по собі org-remove-headlinesє лише функцією; це не дуже допоможе тобі, якщо його ніде не дзвонять. Так що так, вам все одно потрібно оцінити лінію, (add-hook 'org-export-before-processing-hook #'org-remove-headlines)щоб дозволити правильну поведінку. Я, мабуть, мав би бути чітко про це в редакціях моєї оригінальної відповіді. Щодо попереджень, які ви бачите: я не отримую тих, хто має ванільний Emacs 24.4 та версію 8.2.10 Org Mode. Щоб позбутися згадуваного попередження, ви можете спробувати, (require 'org-agenda)перш ніж оцінювати add-hookрядок.
itsjeyd

2
Ця функція також реалізована як org contrib. Відгук
rudolfo.christ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.