org-modeからエクスポートされたHTMLのセクションにパーマリンクを作成する


8

デフォルトでは、組織モードのドキュメントがHTMLにエクスポートされると、セクションとサブセクションのリンクは次のようになります。

file:///path/to/export/location/doc.html#sec-1-1

問題は、セクションを並べ替えると、上記のリンクが正しいセクションをポイントしないことです。

自動生成される各セクションのパーマリンクを以下のようにするにはどうすればよいですか?

file:///path/to/export/location/doc.html#introduction

回答:


11

CUSTOM_IDプロパティを設定すると、この結果を得ることができます。

次のファイルから:

* Test
:PROPERTIES:
:CREATED:  [2014-10-02 Thu 11:48]
:END:
** Sub no custom
:PROPERTIES:
:CREATED:  [2014-10-02 Thu 11:49]
:END:
** Sub custom
:PROPERTIES:
:CREATED:  [2014-10-02 Thu 11:49]
:CUSTOM_ID: Custom
:END:

次のエクスポート(C-c C-e h H)が表示されます。

<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1. Test</a>
<ul>
<li><a href="#sec-1-1">1.1. Sub no custom</a></li>
<li><a href="#Custom">1.2. Sub custom</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1"><span class="section-number-2">1</span> Test</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-sec-1-1" class="outline-3">
<h3 id="sec-1-1"><span class="section-number-3">1.1</span> Sub no custom</h3>
<div class="outline-text-3" id="text-1-1">
</div>
</div>
<div id="outline-container-Custom" class="outline-3">
<h3 id="Custom"><a id="sec-1-2"></a><span class="section-number-3">1.2</span> Sub custom</h3>

だから、Sub no customによってリンクされ#sec-1-1ながら、Sub custom用途#customリファレンスとして。


IDの自動生成

org-idロード済みorg-modulesまたは直接評価中のリストに追加すると、(require 'org-id)を使用してIDを生成できorg-id-get-createます。以下はIDを自動的に挿入し、エクスポートで使用します。

;; Use custom ID if present, otherwise create a new one when trying to
;; resolve links
(setq org-id-link-to-org-use-id
      'create-if-interactive-and-no-custom-id)

;; Based on org-expiry-insinuate
(add-hook 'org-insert-heading-hook 'org-id-get-create)
(add-hook 'org-after-todo-state-change-hook 'org-id-get-create)
(add-hook 'org-after-tags-change-hook 'org-id-get-create)

これは、バッファー内の既存の見出しを調べ、IDを更新する必要があります。IDが存在しない場合にのみIDを作成します。

(defun my/org-update-ids ()
  (interactive)
  (let* ((tree (org-element-parse-buffer 'headline))
         (map (reverse
               (org-element-map tree 'headline
                 (lambda (hl)
                   (org-element-property :begin hl))))))
    (save-excursion
      (cl-loop for point in map do
               (goto-char point)
               (org-id-get-create)))))

注意。これは、正しいIDを指すようにTOCリンクを修正しません。TOCは、リンクの生成CUSTOM_IDまたは使用のためにのみ構成されていsec-#-#ます。ただし、IDでセクションにアクセスできます(この方法で使用する場合は、IDの長さを短くするためorg-id-methodorgからuuidに変更することをお勧めします。

CUSTOM_ID見出しに人間が判読できるIDが実際に必要な場合は、おそらくまだ最善の策です。 my/org-update-idsその開始点として使用できるはずです(各見出しのバッファーをマップし、見出しに移動してからアクションを実行します)。

出発点は(org-entry-put (point) "CUSTOM_ID" id)、設定と(org-entry-get (point) "CUSTOM_ID")取得です。何を使用するかは、id名前を付ける方法によって決まります。


ありがとう!:CUSTOM_ID:値を自動生成するために何かを調理し、ここに投稿します。これは私の計画です:PROPERTIES:。各サブセクションのブロックを入力するのは面倒です。代わりに、elispコードでこれらを生成し、:CUSTOM_ID:存在しない場合は自動生成できます。org-export-before-processing-hookソースorgファイルが変更されないように、すべての。これを実装するには少し時間がかかるかもしれませんが、完了したらここに投稿します。
Kaushal Modi 2014

:ID:それぞれのプロパティを作成するメソッドを提供しました(そして、不足している場所にそれらを含めるようにバッファーを更新します)。見出しに動的にIDを割り当てる関数を作成する場合(見出し名に基づいて?)、それをに置き換えることがorg-id-get-createでき、:Custom_ID:代わりにcreateを使用します。
Jonathan Leech-Pepin 2014年

my/org-update-ids単一の要素にのみ影響します。すべてIDのを一度に更新する方法は?
akater

1
その問題を修正するために更新されました。もう一度テストしてみたところ、特定の見出しのみが更新され、他の見出しは更新されていないことがわかりました。見出しの冒頭のリストを逆にすると修正されます(元のリストはgoto-charエントリが挿入されると失敗します)
Jonathan Leech-Pepin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.