Наступна команда дозволяє вибирати бек-енд, а потім експортувати кожне піддерево верхнього рівня в окремий файл:
(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))))
На даний момент підтримується експорт HTML ( html
), LaTeX ( latex
) та PDF ( pdf
). Ви можете додати підтримку для більшої кількості зворотних версій, додавши до них більше пропозицій cond
.
Як говориться в docstring, для кожного піддерева потрібно встановити :EXPORT_FILE_NAME:
властивість на ім'я файлу, до якого потрібно експортувати. (Інші параметри див. Нижче).
Автоматичне генерування імені файлу експорту з тексту заголовка
Якщо ви не хочете додавати :EXPORT_FILE_NAME:
властивості до кожного заголовка верхнього рівня, ви можете змінити, org-export-all
щоб автоматично генерувати ім’я файлу, наприклад, текст заголовка, тимчасово встановлений :EXPORT_FILE_NAME:
під час експорту:
(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))))
Ця функція генерує імпорт файлу експорту, замінюючи пробіли на "_" у тексті заголовка. Якщо ви хочете генерувати ім'я файлу іншим способом, змініть replace-regexp-in-string
підставку на те, що вам подобається.
Створення :EXPORT_FILE_NAME:
при налаштуванні:CUSTOM_ID:
Дотримуючись наведених нижче порад, org-set-property
автоматично встановлюється відповідне значення :EXPORT_FILE_NAME:
при встановленні :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))))
Зауважте, що це не додасть розширення файлу до значення, :EXPORT_FILE_NAME:
але це не має значення, оскільки при експорті до конкретного бек-енду org-mode
автоматично вибере правильне розширення для файлів, що випливають .
Додаткова інформація
Оновлення існуючих підкреслень оптом
Якщо у вас є велика кількість існуючих підрядів, для яких потрібно встановити :EXPORT_FILE_NAME:
властивість, ви можете використовувати макрос клавіатури . Поставте точку на першому піддереві, потім виконайте наступне:
F3
... для початку запису.
C-c C-x p CUSTOM_ID
RET RET
... зробити Emacs :EXPORT_FILE_NAME:
на основі :CUSTOM_ID:
.
C-c C-f
... щоб перейти до наступного заголовка верхнього рівня.
F4
... припинити запис.
Щоб повторити макрос для наступного піддерева, натисніть F4. Щоб повторити макрос для всіх інших підрядів, натисніть M-0 F4(це нуль).
Збереження макросів для майбутніх сеансів
За замовчуванням макроси клавіатури не зберігаються протягом сеансів. Щоб зберегти макрос у своєму init-файлі для подальшого використання, зробіть це:
Назвіть макрос:
M-x name-last-kbd-macro
RET org-set-export-file-name
RET
Знайдіть свій файл init та перейдіть до місця, де ви хочете вставити макрос.
Вставте макрос:
M-x insert-kbd-macro
RET org-set-export-file-name
RET
Emacs вставить наступний код у точку:
(fset 'org-set-export-file-name
"\C-c\C-xpCUSTOM_ID\C-m\C-m\C-c\C-f")
Якщо ви косити досить сильно, ви можете бачити, що другий аргумент fset
містить послідовність клавіш, які ви натискали, коли ви записували макрос :)
(Необов’язково) Для найкращих результатів, можливо, ви захочете прив’язати org-set-export-file-name
до клавіші:
(define-key org-mode-map (kbd "<f6>") 'org-set-export-file-name)
Зберегти.
:EXPORT_FILE_NAME:
властивість:CUSTOM_ID:+heading-title-lowercased
для кожного заголовка?