Il seguente comando consente di scegliere un back-end e quindi esporta ogni sottostruttura di livello superiore in un file separato:
(defun org-export-all (backend)
"Export all subtrees that are *not* tagged with :noexport: to
separate files.
Note that subtrees must have the :EXPORT_FILE_NAME: property set
to a unique value for this to work properly."
(interactive "sEnter backend: ")
(let ((fn (cond ((equal backend "html") 'org-html-export-to-html)
((equal backend "latex") 'org-latex-export-to-latex)
((equal backend "pdf") 'org-latex-export-to-pdf))))
(save-excursion
(set-mark (point-min))
(goto-char (point-max))
(org-map-entries (lambda () (funcall fn nil t)) "-noexport" 'region-start-level))))
Attualmente supporta l' esportazione HTML ( html
), LaTeX ( latex
) e PDF ( pdf
). È possibile aggiungere supporto per più back-end aggiungendo più clausole a cond
.
Come dice il docstring, per ogni sottostruttura è necessario impostare la :EXPORT_FILE_NAME:
proprietà sul nome del file in cui si desidera esportare. (Vedi sotto per altre opzioni.)
Generazione automatica del nome del file di esportazione dal testo dell'intestazione
Se non si desidera aggiungere :EXPORT_FILE_NAME:
proprietà a tutte le intestazioni di livello superiore, è possibile modificare org-export-all
per generare automaticamente il nome file, ad esempio il testo dell'intestazione, impostando temporaneamente :EXPORT_FILE_NAME:
durante l'esportazione:
(defun org-export-all (backend)
"Export all subtrees that are *not* tagged with :noexport: to
separate files.
Subtrees that do not have the :EXPORT_FILE_NAME: property set
are exported to a filename derived from the headline text."
(interactive "sEnter backend: ")
(let ((fn (cond ((equal backend "html") 'org-html-export-to-html)
((equal backend "latex") 'org-latex-export-to-latex)
((equal backend "pdf") 'org-latex-export-to-pdf)))
(modifiedp (buffer-modified-p)))
(save-excursion
(set-mark (point-min))
(goto-char (point-max))
(org-map-entries
(lambda ()
(let ((export-file (org-entry-get (point) "EXPORT_FILE_NAME")))
(unless export-file
(org-set-property
"EXPORT_FILE_NAME"
(replace-regexp-in-string " " "_" (nth 4 (org-heading-components)))))
(funcall fn nil t)
(unless export-file (org-delete-property "EXPORT_FILE_NAME"))
(set-buffer-modified-p modifiedp)))
"-noexport" 'region-start-level))))
Questa funzione genera il nome file di esportazione sostituendo gli spazi con "_" nel testo del titolo. Se vuoi generare il nome del file in un altro modo, cambia il replace-regexp-in-string
sexp come preferisci.
Generazione :EXPORT_FILE_NAME:
durante l'impostazione:CUSTOM_ID:
Con il seguente consiglio, org-set-property
imposterai automaticamente un valore appropriato per :EXPORT_FILE_NAME:
quando imposti :CUSTOM_ID:
:
(defadvice org-set-property (after set-export-file-name
(property value) activate compile)
(when (equal org-last-set-property "CUSTOM_ID")
(let ((export-file-name
(concat (org-entry-get nil "CUSTOM_ID")
"-"
(replace-regexp-in-string " " "-" (downcase (org-get-heading t t))))))
(org-entry-put nil "EXPORT_FILE_NAME" export-file-name))))
Nota che questo non aggiungerà un'estensione di file al valore di :EXPORT_FILE_NAME:
ma che non importa perché quando esporti in un back-end specifico, org-mode
sceglierà automaticamente l'estensione corretta per i file risultanti .
Informazioni aggiuntive
Aggiornamento di sottotitoli esistenti in blocco
Se si dispone di un numero elevato di sottotitoli esistenti per i quali è necessario impostare la :EXPORT_FILE_NAME:
proprietà, è possibile utilizzare una macro della tastiera . Posizionare il punto sulla prima sottostruttura, quindi effettuare le seguenti operazioni:
F3
... per iniziare la registrazione.
C-c C-x p CUSTOM_ID
RET RET
... per impostare Emacs in :EXPORT_FILE_NAME:
base :CUSTOM_ID:
.
C-c C-f
... per passare al titolo di primo livello successivo.
F4
... per interrompere la registrazione.
Per ripetere la macro per la sottostruttura successiva, premere F4. Per ripetere la macro per tutti i sottotitoli rimanenti, premere M-0 F4(che è uno zero).
Salvataggio di macro per sessioni future
Per impostazione predefinita, le macro della tastiera non vengono salvate tra le sessioni. Per memorizzare la macro nel file init per uso futuro, procedere come segue:
Denominare la macro:
M-x name-last-kbd-macro
RET org-set-export-file-name
RET
Trova il tuo file init e spostati in un punto in cui desideri inserire la macro.
Inserisci la macro:
M-x insert-kbd-macro
RET org-set-export-file-name
RET
Emacs inserirà il seguente codice al punto:
(fset 'org-set-export-file-name
"\C-c\C-xpCUSTOM_ID\C-m\C-m\C-c\C-f")
Se strizzi gli occhi abbastanza forte, puoi vedere che il secondo argomento fset
contiene la sequenza di tasti che hai premuto quando hai registrato la macro :)
(Facoltativo) Per risultati ottimali, potresti voler associare org-set-export-file-name
una chiave:
(define-key org-mode-map (kbd "<f6>") 'org-set-export-file-name)
Salva.
:EXPORT_FILE_NAME:
proprietà:CUSTOM_ID:+heading-title-lowercased
per ogni intestazione?