Est-il possible d'exporter le contenu des sous-arbres sans leurs titres?

28

Je rédige des documents en mode organisation et les exporte vers LaTeX, HTML, etc. selon les besoins. J'utilise fréquemment la balise :no_export:chaque fois que je ne veux pas qu'un sous-arbre particulier apparaisse dans la sortie.

Ce que je veux aussi, c'est que l'exportation soit complètement ignorée de certains en- têtes de sous-arbre , mais ne pas ignorer le contenu du sous-arbre sous cet en-tête. En d'autres termes, certains sous-arbres doivent être exportés comme si leur contenu n'était qu'une continuation du parent, au lieu d'avoir son propre sous-arbre.

J'imagine idéalement une balise comme :no_title:. Je veux que mon plan en mode organisation ressemble plus ou moins à mon habitude. Mais je considérerais d'autres approches avec des résultats similaires.

Pour illustrer, voici un MWE d'un document rédigé en org-mode.

* 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

Lorsque j'exporte cela actuellement, j'obtiens quelque chose comme ceci:

1 Chapitre 1

1.1 Section 1

1.1.1 Paragraphe 1: no_title:

Premier paragraphe de texte dans la section.

1.1.2 Paragraphe 2: sans_titre:

Deuxième paragraphe de texte dans la section.

2 Chapitre 2

2.1 Section 1

2.1.1 Sous-section 1

◊ 2.1.1.1 Paragraphe 1: no_title:

Premier paragraphe du texte de la sous-section.

Mais ce que je veux ressemble plus à ceci:

1 Chapitre 1

1.1 Section 1

Premier paragraphe de texte dans la section.

Deuxième paragraphe de texte dans la section.

2 Chapitre 2

2.1 Section 1

2.1.1 Sous-section 1

Premier paragraphe du texte de la sous-section.

Brian Z
la source

Réponses:

27

Cela peut être un moyen préféré (en raison de sa simplicité) d'atteindre votre objectif - il semble avoir été enterré dans les commentaires d'une autre réponse:

  1. Ajoutez les éléments suivants à votre .emacsfichier:

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Utilisez la ignorebalise sur les titres que vous aimeriez ignorer (sans ignorer leur contenu)

REMARQUE: si vous utilisez ELPA pour installer le mode organisationnel, vous devez ajouter le référentiel en mode organisationnel à votre liste de référentiels ELPA. Voir ici pour plus de détails. Après cela, actualisez la liste des packages ( M-x package-refresh-contents) et installez le org-plus-contribpackage (par exemple avec M-x package-install). N'oubliez pas de vous débarrasser des anciennes installations en mode org.

marque
la source
2
c'est la bonne réponse.
rasmus
J'ai accepté cela comme la réponse même si cela ne fonctionnera pas pour moi. J'ai essayé de charger org-extra.el mais une autre fonction manquait toujours (je suis coincé avec Org 8.2.4).
Brian Z du
Je ne trouve pas le paquet ox-extra ...
Toothrot
1
@Toothrot c'est dans le contrib/lispdossier - voir orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - dans votre fichier de configuration emacs, vous devrez peut-être ajouter une ligne comme (add-to-list 'load-path "/path/to/contrib/lisp").
Mark
Notez que cela ne contient que des mots dans org 8.3+. Et vous ne pouvez pas simplement récupérer ox-extra.el, qui a des dépendances org 8.3+. Vous obtiendrez des erreurs lors de l'exportation lorsque vous ne pourrez pas trouver les fichiers nécessaires.
Dodgie
16

Oui , c'est tout à fait possible. Ajoutez le code suivant à votre fichier 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)

Remerciements

Cette question a déjà été posée sur StackOverflow (avec un accent et un libellé différents, c'est probablement pourquoi vous n'avez pas pu le localiser lorsque vous avez recherché Internet avant de publier ici). Le code ci-dessus est une version simplifiée du code dans la réponse acceptée ; il fonctionne pour le nouvel exportateur introduit dans la version org-mode8.0 et est indépendant du backend .

Mise à jour

Comme indiqué dans les commentaires, le code ci-dessus fait :no_title:disparaître le contenu des entrées marquées avec si elles sont précédées d'une entrée étiquetée à exclure du document exporté. Par exemple, l'exportation du document suivant produira un document avec un titre et une table des matières, mais sans contenu:

#+EXCLUDE_TAGS: no_export

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

La raison en est que org-modesupprime le titre balisé avec :no_title:avant de supprimer l' entrée dont le titre est balisé :no_export:. Par conséquent, lorsqu'il parvient à supprimer l' no_exportentrée, il traite le contenu de l' no_titleentrée comme appartenant à l' no_exportentrée précédente . Cela est parfaitement logique car il n'y a plus d'élément structurel (en-tête) qui sépare le contenu des entrées originales.

Pour résoudre ce problème, nous pouvons transférer la responsabilité de la suppression des no_exportentrées vers org-remove-headlines. De cette façon, nous nous assurons que toutes les no_exportentrées ont disparu avant que les titres ne soient supprimés des no_titleentrées:

(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
la source
J'utilise beaucoup cela, alors merci! Mais j'ai remarqué un problème ... Si un titre étiqueté avec no_exporttitre vient juste avant celui étiqueté avec no_title, alors le contenu de la deuxième rubrique n'est pas non plus exporté.
Brian Z
@BrianZ Vous êtes les bienvenus! Les frères no_exportet no_titlesœurs sont-ils (c.-à-d. Ont-ils le même nombre d'étoiles principales)? Sinon, laquelle des deux rubriques a le plus d'étoiles?
itsjeyd
Ils sont frères et sœurs. Une exportation de cet exemple de jouet n'a aucun contenu pour moi (juste le titre, la table des matières, etc.) pastebin.com/KaiK9qJm
Brian Z
1
@BrianZ En soi, org-remove-headlinesn'est qu'une fonction; cela ne vous sera pas très utile s'il n'est jamais appelé de n'importe où. Alors oui, vous devez toujours évaluer la ligne (add-hook 'org-export-before-processing-hook #'org-remove-headlines)pour activer le bon comportement. J'aurais probablement dû être explicite à ce sujet dans les modifications apportées à ma réponse d'origine. Quant aux avertissements que vous voyez: je ne les reçois pas avec Emacs 24.4 vanilla et la version 8.2.10 du mode Org. Pour vous débarrasser de l'avertissement que vous mentionnez, vous pouvez essayer (require 'org-agenda)avant d'évaluer la add-hookligne.
itsjeyd
2
Cette fonctionnalité est également implémentée en tant que contrib org. Réf: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/…
rudolfo.christ