見出しなしでサブツリーのコンテンツをエクスポートすることはできますか?


28

org-modeでドキュメントを作成し、必要に応じてLaTeX、HTMLなどにエクスポートします。:no_export:特定のサブツリーを出力に表示したくない場合は、常にタグを使用します。

私は何もしたいことは、完全に特定のサブツリー無視したいが輸出用である見出しを、しかしない、その後無視する内容という見出しの下のサブツリーの。言い換えると、特定のサブツリーは、そのコンテンツが独自のサブツリーを持つのではなく、親の継続であるかのようにエクスポートされる必要があります。

理想的にはのようなタグを想像してい:no_title:ます。org-modeのアウトラインを、これまでとほぼ同じように見せたいです。しかし、私は同様の結果を持つ他のアプローチを検討します。

例として、組織モードで作成されたドキュメントのMWEを示します。

* 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

現在それをエクスポートすると、次のようになります。

1第1章

1.1セクション1

1.1.1パラグラフ1:no_title:

セクション内のテキストの最初の段落。

1.1.2パラグラフ2:no_title:

セクション内のテキストの2番目の段落。

2第2章

2.1セクション1

2.1.1サブセクション1

◊2.1.1.1パラグラフ1:no_title:

サブセクションのテキストの最初の段落。

しかし、私が欲しいのはもっとこのようなものです:

1第1章

1.1セクション1

セクション内のテキストの最初の段落。

セクション内のテキストの2番目の段落。

2第2章

2.1セクション1

2.1.1サブセクション1

サブセクションのテキストの最初の段落。

回答:


27

これはあなたの目標を達成するための好ましい方法である可能性があります(単純さのため)-別の答えのコメントに埋もれてしまったようです:

  1. .emacsファイルに次を追加します。

    (require 'ox-extra)
    (ox-extras-activate '(ignore-headlines))
    
  2. ignore無視したい見出しのタグを使用します(コンテンツを無視しません)

注: ELPAを使用して組織モードをインストールする場合は、組織モードリポジトリをELPAリポジトリのリストに追加する必要があります。詳細はこちらをご覧ください。これが完了したら、パッケージリストを更新し(M-x package-refresh-contents)、org-plus-contribパッケージをインストールします(たとえば、M-x package-install)。古い組織モードのインストールを削除することを忘れないでください。


2
これが正解です。
ラスムス

うまくいかないかもしれませんが、これを答えとして受け入れました。org-extra.elをロードしようとしましたが、他の機能がまだありませんでした(Org 8.2.4でスタックしています)。
ブライアンZ

パッケージox-extraが見つかりません...
Toothrot

1
@Toothrotはcontrib/lispフォルダ内にあります-orgmode.org/cgit.cgi/org-mode.git/tree/contrib/lisp/ox-extra.elを参照してください-emacs設定ファイルで、次のような行を追加する必要があるかもしれません(add-to-list 'load-path "/path/to/contrib/lisp")
マーク

これは組織8.3+の単語のみです。また、組織8.3以上の依存関係を持つox-extra.elを取得することはできません。エクスポート時に、必要なファイルが見つからないというエラーが表示されます。
ドッジ

16

はい、これは完全に可能です。次のコードを初期ファイルに追加します。

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

謝辞

この質問は以前にStackOverflowで尋ねられました(異なるフォーカスと言葉遣いで、ここに投稿する前にインターネットを検索したときにそれを見つけることができなかった理由です)。上記のコードは、受け入れられた回答のコードの簡略版です。8.0で導入された新しいエクスポーターで機能し、バックエンドに依存しませんorg-mode

更新

コメントで説明したように、上記のコードにより、タグ付けされ:no_title:たエントリの内容の前に、エクスポートされたドキュメントから除外するタグが付けられたエントリがある場合、その内容が消えます。たとえば、次のドキュメントをエクスポートすると、タイトルと目次は含まれますが、コンテンツは含まれません。

#+EXCLUDE_TAGS: no_export

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

この理由は、がタグ付けされorg-mode見出しを持つエントリ:no_title:削除する前に、タグ付けされた見出しを削除するからです。その結果、エントリの削除に進むと、エントリの内容を前のエントリに属するものとして扱います。これは、元のエントリのコンテンツを分離する構造要素(見出し)がなくなったため、完全に理にかなっています。:no_export:no_exportno_titleno_export

この問題を解決するために、no_exportエントリを削除する責任をに移すことができますorg-remove-headlines。このようにして、no_export見出しがno_titleエントリから削除される前に、すべてのエントリが削除されていることを確認します。

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

私はこれをたくさん使ってきたので、ありがとう!しかし、問題に気づきました...でタグ付けされたno_export見出しがでタグ付けされた見出しの直前に来るno_titleと、2番目の見出しの内容もエクスポートされません。
ブライアンZ

@BrianZどういたしまして!あるno_exportno_title見出し兄弟は(つまり、彼らは主要な星の数が同じか)?そうでない場合、2つの見出しのどちらがより多くの星を持っていますか?
itsjeyd

彼らは兄弟です。このおもちゃの例のエクスポートには、コンテンツがまったくありません(タイトル、目次など)pastebin.com/KaiK9qJm
ブライアンZ

1
@BrianZそれ自体は、org-remove-headlines単なる関数です。どこからも呼び出されない場合は、あまり役に立ちません。その(add-hook 'org-export-before-processing-hook #'org-remove-headlines)ため、正しい動作を有効にするには、行を評価する必要があります。私はおそらく、元の答えの編集でそれについて明示的にすべきだったでしょう。表示されている警告については、バニラEmacs 24.4およびOrgモードのバージョン8.2.10の警告は表示されません。あなたが言及した警告を取り除くために、あなた(require 'org-agenda)add-hook行を評価する前に試みることができると言いました。
itsjeyd

2
この機能は、org contribとしても実装されています。参考:orgmode.org/cgit.cgi/org-mode.git/plain/contrib/lisp/...
rudolfo.christ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.