È possibile esportare il contenuto di sottotitoli senza i titoli?


28

Redigo documenti in modalità org ed esportali in LaTeX, HTML, ecc. Secondo necessità. Uso frequentemente il tag :no_export:ogni volta che non voglio che un determinato sottostruttura venga visualizzato nell'output.

Ciò che voglio anche è che l'esportazione ignori completamente alcune intestazioni dei sottotree , ma non ignori il contenuto del sottotree sotto quell'intestazione. In altre parole, alcuni sottotitoli dovrebbero essere esportati come se il loro contenuto fosse solo una continuazione del genitore, invece di avere una propria sottostruttura.

Immagino idealmente un tag simile :no_title:. Voglio che la mia struttura in modalità org assomigli più o meno al modo in cui sono abituata. Ma prenderei in considerazione altri approcci con risultati simili.

Per illustrare, ecco un MWE di un documento redatto in modalità 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

Quando esporto quello attualmente, ottengo qualcosa del genere:

1 capitolo 1

1.1 Sezione 1

1.1.1 Paragrafo 1: no_title:

Primo paragrafo del testo nella sezione.

1.1.2 Paragrafo 2: no_title:

Secondo paragrafo del testo nella sezione.

2 Capitolo 2

2.1 Sezione 1

2.1.1 Sottosezione 1

◊ 2.1.1.1 Paragrafo 1: no_title:

Primo paragrafo del testo nella sottosezione.

Ma quello che voglio è più simile a questo:

1 capitolo 1

1.1 Sezione 1

Primo paragrafo del testo nella sezione.

Secondo paragrafo del testo nella sezione.

2 Capitolo 2

2.1 Sezione 1

2.1.1 Sottosezione 1

Primo paragrafo del testo nella sottosezione.

Risposte:


27

Questo potrebbe essere un modo preferito (grazie alla sua semplicità) per raggiungere il tuo obiettivo - sembra essere stato sepolto nei commenti di un'altra risposta:

  1. Aggiungi quanto segue al tuo .emacsfile:

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Utilizza il ignoretag sui titoli che desideri ignorare (senza ignorarne il contenuto)

NOTA: se si utilizza ELPA per installare la modalità org, è necessario aggiungere il repository in modalità org al proprio elenco di repository ELPA. Vedi qui per maggiori dettagli. Al termine, aggiornare l'elenco dei pacchetti ( M-x package-refresh-contents) e installare il org-plus-contribpacchetto (ad es. Con M-x package-install). Non dimenticare di sbarazzarti di tutte le vecchie installazioni in modalità org.


2
questa è la risposta corretta
rasmus

Ho accettato questa come risposta anche se non funzionerà per me. Ho provato a caricare org-extra.el ma mancava ancora qualche altra funzione (sono bloccato con Org 8.2.4).
Brian Z,

Non riesco a trovare il pacchetto ox-extra ...
Toothrot,

1
@Toothrot è nella contrib/lispcartella - vedi orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - nel tuo file di configurazione di emacs, potresti dover aggiungere una riga come (add-to-list 'load-path "/path/to/contrib/lisp").
Segna il

Nota che questo è solo parole in org 8.3+. E non puoi semplicemente prendere ox-extra.el, che ha dipendenze da org 8.3+. Verranno visualizzati errori nell'esportazione per non essere in grado di trovare i file necessari.
Dodgie,

16

, questo è del tutto possibile. Aggiungi il seguente codice al tuo file 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)

Ringraziamenti

Questa domanda è stata posta su StackOverflow in precedenza (con un focus e una formulazione diversi, motivo per cui non sei riuscito a trovarla quando hai cercato su Internet prima di pubblicare qui). Il codice sopra è una versione semplificata del codice nella risposta accettata ; funziona per il nuovo esportatore introdotto in org-mode8.0 ed è indipendente dal backend .

Aggiornare

Come discusso nei commenti, il codice sopra fa :no_title:scomparire il contenuto delle voci taggate con se sono precedute da una voce taggata da escludere dal documento esportato. Ad esempio, l'esportazione del seguente documento produrrà un documento con un titolo e un sommario, ma senza contenuto:

#+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 ragione di ciò è che org-moderimuove il titolo con tag :no_title:prima che rimuova la voce con il titolo con tag :no_export:. Di conseguenza, quando si avvicina alla rimozione della no_exportvoce, considera i contenuti della no_titlevoce come appartenenti alla no_exportvoce precedente . Questo ha perfettamente senso perché non esiste più un elemento strutturale (titolo) che separa più il contenuto delle voci originali.

Per risolvere questo problema, possiamo trasferire la responsabilità per la rimozione di no_exportvoci a org-remove-headlines. In questo modo, ci assicuriamo che tutte le no_exportvoci siano sparite prima che i titoli vengano rimossi dalle no_titlevoci:

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

Lo sto usando molto, quindi grazie! Ma ho notato un problema ... Se un'intestazione contrassegnata con no_exportun'intestazione viene visualizzata prima di un'etichetta no_title, anche il contenuto della seconda intestazione non viene esportato.
Brian Z,

@BrianZ Prego! I fratelli no_exporte le no_titleintestazioni sono (cioè hanno lo stesso numero di stelle principali)? In caso contrario, quale delle due voci ha più stelle?
itsjeyd

Sono fratelli. Un'esportazione di questo esempio di giocattolo non ha alcun contenuto per me (solo titolo, sommario ecc.) Pastebin.com/KaiK9qJm
Brian Z

1
@BrianZ Di per sé, org-remove-headlinesè solo una funzione; non ti aiuterà molto se non viene mai chiamato da nessuna parte. Quindi sì, devi comunque valutare la linea (add-hook 'org-export-before-processing-hook #'org-remove-headlines)per abilitare il comportamento corretto. Probabilmente avrei dovuto essere esplicito al riguardo nelle modifiche alla mia risposta originale. Per quanto riguarda gli avvisi che stai vedendo: non li ricevo con Emacs vaniglia 24.4 e versione 8.2.10 della modalità Org. Per sbarazzarsi dell'avvertimento menzionato, è possibile provare (require 'org-agenda)prima di valutare la add-hookriga.
itsjeyd

2
Questa funzione è implementata anche come contributo dell'organizzazione. Rif: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/…
rudolfo.christ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.