Có thể xuất nội dung của cây con mà không có tiêu đề của họ?


28

Tôi phác thảo tài liệu ở chế độ org và xuất chúng sang LaTeX, HTML, v.v. nếu cần. Tôi thường xuyên sử dụng thẻ :no_export:bất cứ khi nào tôi không muốn có một cây con nào đó xuất hiện trong đầu ra.

Điều tôi cũng muốn là muốn xuất hoàn toàn bỏ qua các tiêu đề cây con nhất định , nhưng không bỏ qua nội dung của cây con dưới tiêu đề đó. Nói cách khác, một số cây con nhất định phải được xuất ra như thể nội dung của chúng chỉ là sự tiếp nối của cha mẹ, thay vì có cây con riêng.

Tôi lý tưởng tưởng tượng một thẻ như thế nào :no_title:. Tôi muốn phác thảo chế độ tổ chức của tôi trông ít nhiều giống như cách tôi đã quen. Nhưng tôi sẽ xem xét các phương pháp khác với kết quả tương tự.

Để minh họa, đây là một MWE của một tài liệu được phác thảo ở chế độ 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

Khi tôi xuất cái đó hiện tại, tôi nhận được một cái gì đó như thế này:

1 Chương 1

1.1 Mục 1

1.1.1 Đoạn 1: no_title:

Đoạn đầu của văn bản trong phần.

1.1.2 Đoạn 2: no_title:

Đoạn văn bản thứ hai trong phần.

2 Chương 2

2.1 Mục 1

2.1.1 Tiểu mục 1

◊ 2.1.1.1 Đoạn 1: no_title:

Đoạn đầu của văn bản trong tiểu mục.

Nhưng những gì tôi muốn là như thế này:

1 Chương 1

1.1 Mục 1

Đoạn đầu của văn bản trong phần.

Đoạn văn bản thứ hai trong phần.

2 Chương 2

2.1 Mục 1

2.1.1 Tiểu mục 1

Đoạn đầu của văn bản trong tiểu mục.

Câu trả lời:


27

Đây có thể là một cách ưa thích (do đơn giản) để hoàn thành mục tiêu của bạn - dường như đã bị chôn vùi trong các ý kiến ​​của một câu trả lời khác:

  1. Thêm vào đây vào .emacstập tin của bạn :

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. Sử dụng ignorethẻ trên các tiêu đề bạn muốn bỏ qua (trong khi không bỏ qua nội dung của chúng)

LƯU Ý: nếu bạn đang sử dụng ELPA để cài đặt chế độ org, bạn phải thêm kho lưu trữ chế độ org vào danh sách kho ELPA của bạn. Xem ở đây để biết thêm chi tiết. Sau khi hoàn thành, làm mới danh sách gói ( M-x package-refresh-contents) và cài đặt org-plus-contribgói (ví dụ với M-x package-install). Đừng quên thoát khỏi mọi cài đặt chế độ org cũ.


2
Đây là câu trả lời chính xác.
rasmus

Tôi chấp nhận đây là câu trả lời mặc dù nó không hiệu quả với tôi. Tôi đã thử tải org-Extra.el nhưng một số chức năng khác vẫn bị thiếu (tôi bị kẹt với Org 8.2.4).
Brian Z

Tôi không thể tìm thấy gói ox-Extra ...
Toothrot

1
@Toothrot có trong contrib/lispthư mục - xem orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.el - trong tệp cấu hình emacs của bạn, bạn có thể cần thêm một dòng như (add-to-list 'load-path "/path/to/contrib/lisp").
Đánh dấu

Lưu ý rằng đây chỉ là từ trong org 8.3+. Và bạn không thể lấy ox-Extra.el, có phụ thuộc org 8.3+. Bạn sẽ gặp lỗi khi xuất về việc không thể tìm thấy các tệp cần thiết.
Dodgie

16

Vâng , điều này là hoàn toàn có thể. Thêm mã sau vào tệp init của bạn:

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

Lời cảm ơn

Câu hỏi này đã được hỏi trên StackOverflow trước đây (với trọng tâm và từ ngữ khác nhau, đó có thể là lý do tại sao bạn không thể tìm thấy nó khi bạn tìm kiếm trên internet trước khi đăng ở đây). Mã ở trên là phiên bản đơn giản của mã trong câu trả lời được chấp nhận ; nó hoạt động cho nhà xuất khẩu mới được giới thiệu trong org-mode8.0 và không phụ thuộc .

Cập nhật

Như đã thảo luận trong các ý kiến, đoạn mã trên khiến nội dung của các mục được gắn thẻ :no_title:biến mất nếu chúng được đi trước bởi một mục được gắn thẻ để loại trừ khỏi tài liệu đã xuất. Ví dụ: xuất tài liệu sau sẽ tạo tài liệu có tiêu đề và TOC, nhưng không có nội dung:

#+EXCLUDE_TAGS: no_export

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

Lý do cho việc này là org-modeloại bỏ tiêu đề được gắn thẻ :no_title:trước khi xóa mục nhập có tiêu đề được gắn thẻ :no_export:. Kết quả là, khi nó đi xung quanh để loại bỏ no_exportmục, nó coi nội dung của no_titlemục là thuộc về no_exportmục trước . Điều này có ý nghĩa hoàn hảo vì không có yếu tố cấu trúc (tiêu đề) phân tách nội dung của các mục gốc nữa.

Để giải quyết vấn đề này, chúng tôi có thể chuyển trách nhiệm loại bỏ no_exportcác mục org-remove-headlines. Bằng cách này, chúng tôi đảm bảo tất cả no_exportcác mục đã biến mất trước khi các tiêu đề được xóa khỏi no_titlecác mục:

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

Tôi đã sử dụng nó rất nhiều, vì vậy cảm ơn! Nhưng tôi nhận thấy một vấn đề ... Nếu một tiêu đề được gắn thẻ no_exporttiêu đề xuất hiện ngay trước khi được gắn thẻ no_title, thì nội dung của tiêu đề thứ hai cũng không được xuất.
Brian Z

@BrianZ Bạn được chào đón! Có phải các anh chị em no_exportno_titlecác tiêu đề (nghĩa là họ có cùng số lượng ngôi sao hàng đầu) không? Nếu không, cái nào trong hai tiêu đề có nhiều ngôi sao?
itjeyd

Họ là anh em ruột. Một bản xuất của ví dụ đồ chơi này hoàn toàn không có nội dung cho tôi (chỉ tiêu đề, mục lục, v.v.) pastebin.com/KaiK9qJm
Brian Z

1
@BrianZ Chính nó, org-remove-headlineschỉ là một chức năng; nó sẽ không giúp bạn nhiều nếu nó không bao giờ được gọi từ bất cứ đâu. Vì vậy, có, bạn vẫn cần đánh giá dòng (add-hook 'org-export-before-processing-hook #'org-remove-headlines)để kích hoạt hành vi chính xác. Tôi có lẽ nên rõ ràng về điều đó trong các chỉnh sửa cho câu trả lời ban đầu của tôi. Đối với các cảnh báo bạn đang thấy: Tôi không nhận được những người có vanilla Emacs 24.4 và phiên bản 8.2.10 của Chế độ Org. Để thoát khỏi cảnh báo bạn đề cập, bạn có thể thử (require 'org-agenda)trước khi đánh giá add-hookdòng.
itjeyd

2
Tính năng này cũng được thực hiện dưới dạng org contrib. Tham chiếu: orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/ Kẻ
rudolfo.christ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.