Apakah mungkin untuk mengekspor konten subtree tanpa judulnya?

28

Saya menyusun dokumen dalam mode-org dan mengekspornya ke LaTeX, HTML, dll. Sesuai kebutuhan. Saya sering menggunakan tag :no_export:setiap kali saya tidak ingin subtree tertentu muncul di output.

Apa yang saya juga inginkan adalah agar ekspor mengabaikan sepenuhnya subtree heading tertentu , tetapi tidak mengabaikan konten subtree di bawah heading itu. Dengan kata lain, subtree tertentu harus diekspor seolah kontennya hanya merupakan kelanjutan dari induk, alih-alih memiliki subtree sendiri.

Idealnya saya membayangkan tag seperti :no_title:. Saya ingin garis besar mode-org saya terlihat kurang lebih seperti yang biasa saya lakukan. Tetapi saya akan mempertimbangkan pendekatan lain dengan hasil yang serupa.

Sebagai ilustrasi, berikut adalah MWE dari dokumen yang disusun dalam mode-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

Ketika saya mengekspor itu saat ini, saya mendapatkan sesuatu seperti ini:

1 Bab 1

1.1 Bagian 1

1.1.1 Paragraf 1: no_title:

Paragraf teks pertama di bagian ini.

1.1.2 Paragraf 2: no_title:

Paragraf teks kedua di bagian ini.

2 Bab 2

2.1 Bagian 1

2.1.1 Subbagian 1

◊ 2.1.1.1 Paragraf 1: no_title:

Paragraf teks pertama dalam sub-bagian.

Tapi yang saya inginkan lebih seperti ini:

1 Bab 1

1.1 Bagian 1

Paragraf teks pertama di bagian ini.

Paragraf teks kedua di bagian ini.

2 Bab 2

2.1 Bagian 1

2.1.1 Subbagian 1

Paragraf teks pertama dalam sub-bagian.

Brian Z
sumber

Jawaban:

27

Ini mungkin cara yang disukai (karena kesederhanaannya) untuk mencapai tujuan Anda - tampaknya telah terkubur dalam komentar dari jawaban lain:

  1. Tambahkan yang berikut ke .emacsfile Anda :

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Gunakan ignoretag pada tajuk utama yang ingin Anda abaikan (tanpa mengabaikan kontennya)

CATATAN: jika Anda menggunakan ELPA untuk menginstal mode-org, Anda harus menambahkan repositori mode-org ke daftar repositori ELPA Anda. Lihat di sini untuk detail lebih lanjut. Setelah ini selesai, segarkan daftar paket ( M-x package-refresh-contents) dan instal org-plus-contribpaket (misalnya dengan M-x package-install). Jangan lupa untuk menyingkirkan instalasi mode-org lama.

Menandai
sumber
2
ini jawaban yang benar.
rasmus
Saya menerima ini sebagai jawaban meskipun itu tidak akan berhasil untuk saya. Saya mencoba memuat org-extra.el tetapi beberapa fungsi lainnya masih hilang (saya terjebak dengan Org 8.2.4).
Brian Z
Saya tidak dapat menemukan paket ekstra sapi ...
Toothrot
1
@Trotrot ada di contrib/lispfolder - lihat orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - dalam file konfigurasi emacs Anda, Anda mungkin perlu menambahkan baris seperti (add-to-list 'load-path "/path/to/contrib/lisp").
Tandai
Perhatikan bahwa ini hanya kata dalam org 8.3+. Dan Anda tidak bisa begitu saja mengambil ox-extra.el, yang memiliki dependensi org 8.3+. Anda akan mendapatkan kesalahan saat mengekspor karena tidak dapat menemukan file yang diperlukan.
Dodgie
16

Ya , ini sepenuhnya mungkin. Tambahkan kode berikut ke file init Anda:

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

Ucapan Terima Kasih

Pertanyaan ini telah ditanyakan pada StackOverflow sebelumnya (dengan fokus dan kata-kata yang berbeda, yang mungkin mengapa Anda tidak dapat menemukannya ketika Anda mencari di internet sebelum memposting di sini). Kode di atas adalah versi kode yang disederhanakan dalam jawaban yang diterima ; ini bekerja untuk eksportir baru yang diperkenalkan pada org-mode8.0 dan merupakan agendostik backend .

Memperbarui

Seperti dibahas dalam komentar, kode di atas menyebabkan isi entri yang ditandai dengan :no_title:hilang jika didahului oleh entri yang ditandai untuk dikeluarkan dari dokumen yang diekspor. Misalnya, mengekspor dokumen berikut akan menghasilkan dokumen dengan judul dan TOC, tetapi tidak ada konten:

#+EXCLUDE_TAGS: no_export

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

Alasan untuk ini adalah bahwa org-modemenghilangkan judul ditandai dengan :no_title:sebelum menghapus entri yang headline ditandai dengan :no_export:. Akibatnya, ketika sempat menghapus no_exportentri, ia memperlakukan konten no_titleentri sebagai milik no_exportentri sebelumnya . Ini masuk akal karena tidak ada elemen struktural (pos) yang memisahkan isi dari entri asli lagi.

Untuk mengatasi masalah ini, kami dapat mentransfer tanggung jawab untuk menghapus no_exportentri org-remove-headlines. Dengan cara ini, kami memastikan semua no_exportentri hilang sebelum berita utama dihapus dari no_titleentri:

(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)
itu hanya
sumber
Saya sudah sering menggunakan ini, jadi terima kasih! Tapi saya perhatikan ada masalah ... Jika tajuk yang ditandai dengan no_exporttajuk tepat sebelum yang ditandai no_title, maka isi tajuk kedua juga tidak diekspor.
Brian Z
@BrianZ Sama-sama! Apakah no_exportdan no_titlejudul saudara kandung (yaitu, apakah mereka memiliki jumlah bintang terkemuka yang sama)? Jika tidak, yang mana dari dua judul yang memiliki lebih banyak bintang?
itsjeyd
Mereka bersaudara. Ekspor contoh mainan ini sama sekali tidak memiliki konten untuk saya (hanya judul, daftar isi, dll.) Pastebin.com/KaiK9qJm
Brian Z
1
@BrianZ Dengan sendirinya, org-remove-headlineshanyalah sebuah fungsi; itu tidak akan banyak membantu Anda jika tidak pernah dipanggil dari mana pun. Jadi ya, Anda masih perlu mengevaluasi jalur (add-hook 'org-export-before-processing-hook #'org-remove-headlines)untuk mengaktifkan perilaku yang benar. Saya mungkin seharusnya secara eksplisit tentang hal itu dalam pengeditan jawaban asli saya. Adapun peringatan yang Anda lihat: Saya tidak mendapatkannya dengan vanilla Emacs 24.4 dan versi 8.2.10 dari Mode Org. Untuk menghilangkan peringatan yang Anda sebutkan, Anda bisa mencoba (require 'org-agenda)sebelum mengevaluasi add-hookbaris.
itsjeyd
2
Fitur ini juga diimplementasikan sebagai contrib org. Ref: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/…
rudolfo.christ