Czy można eksportować zawartość poddrzewa bez ich nagłówków?

28

Robię dokumenty w trybie org i eksportuję je do LaTeX, HTML itp. W razie potrzeby. Często używam tego znacznika, :no_export:ilekroć nie chcę, aby pewne poddrzewo pojawiło się na wyjściu.

Chcę także, aby eksport całkowicie ignorował niektóre nagłówki poddrzewa , ale nie ignorował zawartości tego poddrzewa pod tym nagłówkiem. Innymi słowy, niektóre poddrzewa powinny być eksportowane tak, jakby ich zawartość była tylko kontynuacją elementu nadrzędnego, zamiast mieć własne poddrzewo.

Idealnie wyobrażam sobie taki tag :no_title:. Chcę, aby mój kontur trybu org wyglądał mniej więcej tak, jak zwykle. Ale rozważałbym inne podejścia z podobnymi wynikami.

Aby to zilustrować, oto MWE dokumentu sporządzonego w trybie 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

Kiedy eksportuję to obecnie, otrzymuję coś takiego:

1 Rozdział 1

1.1 Sekcja 1

1.1.1 Ustęp 1: no_title:

Pierwszy akapit tekstu w sekcji.

1.1.2 Ustęp 2: no_title:

Drugi akapit tekstu w sekcji.

2 Rozdział 2

2.1 Sekcja 1

2.1.1 Podsekcja 1

◊ 2.1.1.1 Ustęp 1: no_title:

Pierwszy akapit tekstu w podsekcji.

Ale chcę bardziej:

1 Rozdział 1

1.1 Sekcja 1

Pierwszy akapit tekstu w sekcji.

Drugi akapit tekstu w sekcji.

2 Rozdział 2

2.1 Sekcja 1

2.1.1 Podsekcja 1

Pierwszy akapit tekstu w podsekcji.

Brian Z
źródło

Odpowiedzi:

27

Może to być preferowany (ze względu na prostotę) sposób osiągnięcia celu - wydaje się, że został pochowany w komentarzach do innej odpowiedzi:

  1. Dodaj następujące elementy do .emacspliku:

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Użyj ignoretagu w nagłówkach, które chcesz zignorować (nie ignorując ich treści)

UWAGA: jeśli używasz ELPA do instalacji w trybie org, musisz dodać repozytorium w trybie org do swojej listy repozytoriów ELPA. Zobacz tutaj po więcej szczegółów. Po wykonaniu tej czynności odśwież listę pakietów ( M-x package-refresh-contents) i zainstaluj org-plus-contribpakiet (np. Za pomocą M-x package-install). Nie zapomnij pozbyć się starych instalacji w trybie org.

znak
źródło
2
to jest poprawna odpowiedź.
rasmus
Zaakceptowałem to jako odpowiedź, chociaż nie będzie to dla mnie skuteczne. Próbowałem załadować org-extra.el, ale wciąż brakowało jakiejś innej funkcji (utknąłem w Org 8.2.4).
Brian Z
Nie mogę znaleźć pakietu ox-extra ...
Toothrot 15.10.16
1
@Toothrot znajduje się w contrib/lispfolderze - patrz orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - w pliku konfiguracyjnym emacsa może być konieczne dodanie wiersza w rodzaju (add-to-list 'load-path "/path/to/contrib/lisp").
Mark
Pamiętaj, że to tylko słowa z org 8.3+. I nie możesz po prostu złapać ox-extra.el, który ma zależności org 8.3+. Podczas eksportowania wystąpią błędy związane z niemożnością znalezienia niezbędnych plików.
Dodgie
16

Tak , jest to całkowicie możliwe. Dodaj następujący kod do pliku 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)

Podziękowanie

To pytanie zostało już zadane na StackOverflow (z innym naciskiem i sformułowaniami, prawdopodobnie dlatego nie udało się go zlokalizować podczas przeszukiwania Internetu przed opublikowaniem tutaj). Powyższy kod jest uproszczoną wersją kodu w zaakceptowanej odpowiedzi ; działa dla nowego eksportera wprowadzonego w wersji org-mode8.0 i jest niezależny od backendów .

Aktualizacja

Jak omówiono w komentarzach, powyższy kod powoduje :no_title:zniknięcie zawartości pozycji oznaczonych za pomocą, jeśli są poprzedzone pozycją oznaczoną jako wykluczoną z eksportowanego dokumentu. Na przykład eksportowanie następującego dokumentu spowoduje utworzenie dokumentu z tytułem i spisem treści, ale bez zawartości:

#+EXCLUDE_TAGS: no_export

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

Powodem tego jest to, że org-modeusuwa nagłówek oznaczony :no_title:przed usunięciem wpisu, którego nagłówek jest oznaczony :no_export:. W związku z tym, gdy przechodzi do usuwania no_exportwpisu, traktuje zawartość no_titlewpisu jako należącą do poprzedniego no_exportwpisu. Ma to doskonały sens, ponieważ nie ma już elementu strukturalnego (nagłówka), który oddziela zawartość oryginalnych wpisów.

Aby rozwiązać ten problem, możemy przenieść odpowiedzialność za usunięcie no_exportwpisów org-remove-headlines. W ten sposób upewniamy się, że wszystkie no_exportwpisy zniknęły, zanim nagłówki zostaną usunięte z no_titlewpisów:

(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
źródło
Używałem tego dużo, więc dzięki! Ale zauważyłem problem ... Jeśli nagłówek oznaczony no_exportnagłówkiem pojawia się tuż przed znacznikiem no_title, zawartość drugiego nagłówka również nie jest eksportowana.
Brian Z
@BrianZ Nie ma za co! Czy rodzeństwo no_exporti no_titlenagłówki (tj. Czy mają taką samą liczbę wiodących gwiazd)? Jeśli nie, to który z dwóch nagłówków ma więcej gwiazdek?
itsjeyd
Oni są bliźniakami. Eksport tego przykładu zabawki nie ma dla mnie żadnej treści (tylko tytuł, spis treści itp.) Pastebin.com/KaiK9qJm
Brian Z
1
@BrianZ Sam w sobie org-remove-headlinesjest tylko funkcją; nic ci nie pomoże, jeśli nigdy nie zostanie wywołany z dowolnego miejsca. Tak, nadal musisz ocenić linię, (add-hook 'org-export-before-processing-hook #'org-remove-headlines)aby umożliwić prawidłowe zachowanie. Prawdopodobnie powinienem był to wyraźnie wyrazić podczas edycji mojej oryginalnej odpowiedzi. Co do ostrzeżeń, które widzisz: nie dostaję tych z waniliowym Emacsem 24.4 i wersją 8.2.10 Trybu Org. Aby pozbyć się ostrzeżenia, wspomnij, że możesz spróbować (require 'org-agenda)przed oceną add-hooklinii.
itsjeyd
2
Ta funkcja jest również zaimplementowana jako narzędzie współdzielenia organizacji. Ref: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/…
rudolfo.christ