Emacsの関数は、任意のORGプロパティを任意の文字列(つまり、LaTeXラベル)に変換しますか?


11

私はCUSTOM_LABELプロパティを持つorg-filesとして多くのドキュメントを持っています。

* Introduction :PROPERTIES: :CUSTOM_LABEL: AP 1 :END:

この場合、ファイルをLaTeXとしてエクスポートし、それぞれをCUSTOM_LABELとして翻訳する必要があります\label{marker}。上記の例はに変換され\label{AP 1}ます。

私は、エクスポート時にカスタム関数を呼び出す方法をすでに知っているが、私は、その特定の変換を行うための関数定義を書くために専門家に十分な、すなわちないですCUSTOM_LABEL- >\label{}

どのように関数定義を注入することができますcustom_labelよう\label{}に書くことを?

私はいくつかの疑似コード、またはいくつかのポインタさえいただければ幸いです。

org-modeマニュアルを徹底的に検索したため、これはEmacsの質問であり、そのような機能は現在利用できません。

エクスポート時に特定のプロパティを変換する一般的な関数(LaTeX、HTML、またはその他の形式)は、さらに優れています。

ありがとうございました。


タイトルがずれているようです。私が質問を理解した場合、組織のプロパティを別の組織のプロパティではなく、任意の文字列(つまり、LaTeXラベル)に変換したいとします。
マラバルバ2014

@rasmus:そのポインタをありがとう。私は数時間前にemacs-orgmodeリストでそれについて読んでいました(とりわけ、lists.gnu.org / archive / html / emacs-orgmode / 2014-09 / msg00498.html)。私はそのコードを試して、設定だけをしましたorg-latex-custom-id-as-label。HTMLエクスポートでは問題なく機能しますが、LaTeXエクスポートでは効果がありません。org-modeコア関数だけに頼ることができればいいのに、@ malababrbaの答えが気に入っています。
gsl 2014年

@rasmusそれが私が必要とする行動です。しかし、私はあなたのコードを実行しましたが、私はと\section{h}\label{sec-1}を使用GNU Emacs 24.3.94.1 (x86_64-apple-darwin13.4.0, NS apple-appkit-1265.21) of 2014-10-04 on builder10-9.porkrind.orgしていOrg-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/)ます。また、念のため、.emacs.dの名前を変更したので、カスタムスタッフなしで実行されました。
gsl 2014年

たった1行のコードで実際に機能する例全体を合成できたのは素晴らしいことです。
gsl 2014年

ああ、それはそれを説明するでしょう!私は、最新のをインストールしようとしたorg-modeこの使用el-get:レシピgithub.com/dimitri/el-get/blob/master/recipes/org-mode.rcpを、私はまだ取得しOrg-mode version 8.2.6 (release_8.2.6-1 @ /Users/gsl/.emacs.d/el-get/org-mode/lisp/、あなたが私はそれを使用することができるように、そのレシピを微調整する方法を知っているだろうし開発ブランチ?これもまた新しい質問です。指摘いただきありがとうございます。
gsl 2014年

回答:


10

あなたが望むことをかなり拡張可能な方法で実行する関数を書きました。どの見出しにプロパティCUSTOM_LABEL (または構成した他のプロパティ)が含まれているかを確認し、プロパティendless/insert-org-label-latexの値を引数として各プロパティに関数を呼び出し ます。

サンプルスニペットは、それをhtmlまたは他のバックエンドに拡張する方法も示しています。

代替品を構成する

この変数を使用すると、気になるプロパティを構成し、各プロパティを処理するために呼び出される関数を設定できます。

(defcustom endless/org-property-mapping 
  '((latex ("CUSTOM_LABEL" . endless/insert-org-label-latex))
    (html ("CUSTOM_LABEL" . endless/insert-org-label-html)))
  "List of mappings from org property to arbitrary strings.
Each element is a list:
  (BACKEND (PROPERTY1 . FUNCTION1) (PROPERTY2 . FUNCTION2) ...)

FUNCTION are functions which get called with a single
argument (the value of PROPERTY) and are responsible for doing
whatever should be done."
  :type '(repeat (cons symbol (repeat (cons string string)))))

ヘビーワーカー

この関数は、組織のエクスポートフックに追加する必要があるものです。上記のプロパティのチェックと、それらのプロパティに関連付けられた関数の呼び出しを処理します。

(defun endless/replace-org-property (backend)
  "Convert org properties using `endless/org-property-mapping'.
Lookup BACKEND in `endless/org-property-mapping' for a list of
\(PROPERTY REPLACEMENT). For each healine being exported, if it has a
PROPERTY listed insert a string immediately after the healine given by
    (format REPLACEMENT PROPERTY-VALUE)"
  (let ((map (cdr (assoc backend endless/org-property-mapping)))
        value replacement)
    (when map      
      (org-map-entries
       (lambda () 
         (dolist (it map)
           (save-excursion
             (when (setq value (org-entry-get (point) (car it))) 
               (funcall (cdr it) value)))))))))

(add-hook 'org-export-before-processing-hook #'endless/replace-org-property)

定義する関数

これらは、実際の置き換えを行うものです。以下は、ラテックスケースの例です。

(defun endless/insert-org-label-latex (label)
  "Insert \"\\\\label{LABEL}\\n\" after the :PROPERTY: drawer."
  (search-forward-regexp org-property-end-re)
  (forward-char 1)
  (insert (format "\\label{%s}\n" label)))

結果

上記のすべてのコードを評価してから、次の組織バッファーをlatexにエクスポートします。

* Test
  :PROPERTIES:
  :CUSTOM_LABEL: hi
  :END:
Test

結果のラテックスバッファーは次のようになります。

\section{Test}
\label{sec-1}
\label{hi}
Test

コード、コメント、およびヘルプをありがとうございます。とても助かります。私もたくさん学びました。ありがとうございました。
gsl 2014

5

コードスニペットについては、現在の開発バージョンを使用する必要があることに注意してください(org-version) => "8.3beta"

CUSTOM_ID内部リンクをご利用ください。を参照してください(info "(org) Handling links")

ほとんどの場合、Orgの内部命名のエクスポート結果について心配する必要はありません。たとえば、図や見出しへのリンクはエクスポート時に正しくなります。を参照してください(info "(org) Internal links")

LaTeXの場合:

(with-temp-buffer
  (let ((org-latex-prefer-user-labels t))
(insert "
* h
:PROPERTIES:
:CUSTOM_ID: h
:END:")
(org-mode)
(org-latex-export-as-latex nil nil nil t)))

結果:

\section{h}
\label{h}

などのエクスポーターではox-odtox-html見出しに内部ID IDとの両方が含まれますCUSTOM_ID。使用されるリンクは、リンクによって異なります。

(with-temp-buffer
  (let ((org-export-with-toc nil))
(insert "
* h
:PROPERTIES:
:CUSTOM_ID: h
:END:
[[*h]] [[#h]]")
(org-mode)
(org-html-export-as-html nil nil nil t)))

結果:

<div id="outline-container-h" class="outline-2">
<h2 id="h"><a id="sec-1"></a><span class="section-number-2">1</span> h</h2>
<div class="outline-text-2" id="text-h">
<p>
<a href="#sec-1">1</a> <a href="#h">1</a>
</p>
</div>
</div>

> 8.3ユーザーのデフォルトの方法を指定していただきありがとうございます。CUSTOM_ID他の組織プロパティを渡すために@malabarbaを使用しながら、のデフォルトの方法を使用できます。私は実際にそれを使用して、の他にいくつかのその他のプロパティ(引用キー、ジャンル、会場など)を渡しますCUSTOM_ID
gsl 2014年

1

よくわかりませんが、エクスポーター関数をアドバイスしたり、上書きしたりする必要があるかもしれません。組織8では、それはorg-latex-export-headlineです。

この関数は、headline要素、headlineコンテンツ、および追加のプロパティリストを取得します。エクスポーター関数内では、を使用して要素のプロパティ(カスタムラベルを含む)を取得できますorg-element-property


ポインタをありがとうございました。私が他の投稿/記事から理解している限り、新しいorgエクスポーターはアドバイスをあまりfilter機能しませんが、エクスポートプロセスの特定の段階で呼び出される関数を作成します。 -load 'ox-latex'(add-to-list 'org-export-filter-final-output-functions' my-filter-function)) `` `(バックティック構文が機能しない理由がわかりませんコメントで?)
gsl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.