Ist es möglich, Inhalte von Teilbäumen ohne deren Überschriften zu exportieren?

28

Ich entwerfe Dokumente im Organisationsmodus und exportiere sie nach Bedarf nach LaTeX, HTML usw. Ich verwende das Tag häufig, :no_export:wenn ein bestimmter Teilbaum nicht in der Ausgabe angezeigt werden soll.

Was ich will , auch will , ist für den Export ist vollständig bestimmte Teilstruktur ignorieren Schriften , aber nicht dann ignorieren Inhalt des Unterbaums unter dieser Überschrift. Mit anderen Worten, bestimmte Teilbäume sollten exportiert werden, als ob ihr Inhalt nur eine Fortsetzung des übergeordneten Baums wäre, anstatt einen eigenen Teilbaum zu haben.

Ich stelle mir idealerweise ein Etikett wie vor :no_title:. Ich möchte, dass mein Organigramm mehr oder weniger so aussieht, wie ich es gewohnt bin. Aber ich würde andere Ansätze mit ähnlichen Ergebnissen in Betracht ziehen.

Zur Veranschaulichung sehen Sie hier eine MWE eines Dokuments, das im Organisationsmodus erstellt wurde.

* 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

Wenn ich das aktuell exportiere, erhalte ich so etwas:

1 Kapitel 1

1.1 Abschnitt 1

1.1.1 Absatz 1: no_title:

Erster Absatz des Textes im Abschnitt.

1.1.2 Absatz 2: no_title:

Zweiter Absatz des Textes im Abschnitt.

2 Kapitel 2

2.1 Abschnitt 1

2.1.1 Unterabschnitt 1

◊ 2.1.1.1 Absatz 1: no_title:

Erster Absatz des Textes im Unterabschnitt.

Aber was ich will, ist eher so:

1 Kapitel 1

1.1 Abschnitt 1

Erster Absatz des Textes im Abschnitt.

Zweiter Absatz des Textes im Abschnitt.

2 Kapitel 2

2.1 Abschnitt 1

2.1.1 Unterabschnitt 1

Erster Absatz des Textes im Unterabschnitt.

Brian Z
quelle

Antworten:

27

Dies ist möglicherweise ein bevorzugter Weg (aufgrund seiner Einfachheit), um Ihr Ziel zu erreichen - es scheint in den Kommentaren einer anderen Antwort begraben zu sein:

  1. Fügen Sie Ihrer .emacsDatei Folgendes hinzu :

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Verwenden Sie das ignoreTag für Überschriften, die Sie ignorieren möchten (ohne deren Inhalt zu ignorieren).

HINWEIS: Wenn Sie den Organisationsmodus mit ELPA installieren, müssen Sie das Repository für den Organisationsmodus zu Ihrer Liste der ELPA-Repositorys hinzufügen. Sehen Sie hier für weitere Details. Aktualisieren Sie anschließend die Paketliste ( M-x package-refresh-contents) und installieren Sie das org-plus-contribPaket (z M-x package-install. B. mit ). Vergessen Sie nicht, alte Installationen im Organisationsmodus zu entfernen.

Kennzeichen
quelle
2
Das ist die richtige Antwort.
Rasmus
Ich habe dies als Antwort akzeptiert, obwohl es für mich nicht funktionieren wird. Ich habe versucht, org-extra.el zu laden, aber es fehlte noch eine andere Funktion (ich bin bei Org 8.2.4 geblieben).
Brian Z
Ich kann das Paket ox-extra nicht finden ...
Toothrot
1
@Toothrot befindet sich im contrib/lispOrdner - siehe orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - in Ihrer emacs-Konfigurationsdatei müssen Sie möglicherweise eine Zeile wie hinzufügen (add-to-list 'load-path "/path/to/contrib/lisp").
Mark
Beachten Sie, dass dies nur Wörter in org 8.3+ sind. Und Sie können nicht einfach ox-extra.el mit Abhängigkeiten ab org 8.3 herunterladen. Beim Exportieren treten Fehler auf, weil die erforderlichen Dateien nicht gefunden werden können.
Dodgie
16

Ja , das ist durchaus möglich. Fügen Sie der Init-Datei den folgenden Code hinzu:

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

Danksagung

Diese Frage wurde bereits bei StackOverflow gestellt (mit einem anderen Fokus und einer anderen Formulierung, weshalb Sie sie wahrscheinlich nicht finden konnten, als Sie das Internet durchsucht haben, bevor Sie hier gepostet haben). Der obige Code ist eine vereinfachte Version des Codes in der akzeptierten Antwort . Es funktioniert für den in 8.0 eingeführten neuen Exporterorg-mode und ist Back-End-unabhängig .

Aktualisieren

Wie in den Kommentaren erläutert, wird durch den obigen Code der Inhalt von mit Tags versehenen Einträgen ausgeblendet :no_title:, wenn vor ihnen ein mit Tags versehener Eintrag angezeigt wird, der aus dem exportierten Dokument ausgeschlossen werden soll. Wenn Sie beispielsweise das folgende Dokument exportieren, wird ein Dokument mit einem Titel und einem Inhaltsverzeichnis, jedoch ohne Inhalt erstellt:

#+EXCLUDE_TAGS: no_export

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

Der Grund dafür ist , dass die org-modeentfernt die Schlagzeile mit dem Stichwort , :no_title:bevor es den entfernt Eintrag , deren Überschrift ist getaggt mit :no_export:. Wenn es darum geht, den no_exportEintrag zu entfernen , wird der Inhalt des no_titleEintrags als zum vorhergehenden no_exportEintrag gehörig behandelt . Dies macht durchaus Sinn, da es kein Strukturelement (Überschrift) mehr gibt, das den Inhalt der Originaleinträge trennt.

Um dieses Problem zu lösen, können wir die Verantwortung für das Entfernen von no_exportEinträgen an übertragen org-remove-headlines. Auf diese Weise stellen wir sicher, dass alle no_exportEinträge gelöscht sind, bevor die Überschriften aus den no_titleEinträgen entfernt werden:

(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
quelle
Ich habe das oft benutzt, also danke! Aber ich habe ein Problem festgestellt ... Wenn eine Überschrift mit no_exporteinem Tag direkt vor einer mit einem Tag versehenen Überschrift steht no_title, wird auch der Inhalt der zweiten Überschrift nicht exportiert.
Brian Z
@BrianZ Gern geschehen! Sind die Geschwister no_exportund die no_titleÜberschriften Geschwister (dh haben sie die gleiche Anzahl führender Sterne)? Wenn nicht, welche der beiden Überschriften hat mehr Sterne?
itsjeyd
Sie sind Geschwister. Ein Export dieses Spielzeugbeispiels hat für mich überhaupt keinen Inhalt (nur Titel, Inhaltsverzeichnis usw.) pastebin.com/KaiK9qJm
Brian Z
1
@ BrianZ an sich org-remove-headlinesist nur eine Funktion; es hilft dir nicht viel, wenn es nie von irgendwo angerufen wird. Ja, Sie müssen die Zeile noch auswerten (add-hook 'org-export-before-processing-hook #'org-remove-headlines), um das richtige Verhalten zu ermöglichen. Ich hätte das in den Änderungen meiner ursprünglichen Antwort wahrscheinlich explizit erwähnen sollen. Zu den Warnungen, die Sie sehen: Ich verstehe keine mit Vanille-Emacs 24.4 und Version 8.2.10 des Org-Modus. Um die von Ihnen erwähnte Warnung zu beseitigen, können Sie versuchen, sie (require 'org-agenda)vor der Auswertung der add-hookZeile zu überprüfen .
itsjeyd
2
Diese Funktion ist auch als org contrib implementiert. Ref: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/…
rudolfo.christ