Emacs berfungsi untuk mengubah PROPERTI ORG yang sewenang-wenang menjadi string sewenang-wenang (yaitu, label LaTeX)?

11

Saya memiliki banyak dokumen sebagai file org yang memiliki properti CUSTOM_LABEL, seperti

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

Dalam hal ini, file perlu diekspor sebagai LaTeX, menerjemahkan masing CUSTOM_LABEL- masing sebagai a \label{marker}. Contoh di atas harus diterjemahkan ke \label{AP 1}.

Saya sudah tahu cara memanggil fungsi kustom pada waktu ekspor, tetapi saya tidak cukup ahli untuk menulis defun untuk melakukan konversi tertentu, yaitu CUSTOM_LABEL->\label{}

Bagaimana defun untuk menyuntikkan custom_labelseperti yang \label{}ditulis

Saya akan menghargai bahkan hanya beberapa pseudo-code, atau beberapa pointer.

Saya mengajukan pertanyaan ini di sini alih-alih di tempat lain, karena ini lebih merupakan pertanyaan Emacs, karena saya mencari secara menyeluruh manual mode-org, dan fitur semacam itu saat ini tidak tersedia.

Fungsi generik untuk mengonversi PROPERTI yang diberikan saat mengekspor (LaTeX, HTML, atau format lainnya), akan lebih baik.

Terima kasih.

gsl
sumber
Judulnya sepertinya tidak tepat. Jika saya mengerti pertanyaannya, Anda ingin mengubah properti org menjadi string yang sewenang-wenang (yaitu, label LaTeX), bukan menjadi properti org lain.
Malabarba
@rasmus: Terima kasih untuk pointer itu. Saya membaca tentang itu beberapa jam yang lalu pada emacs-orgmodedaftar (antara lain, lists.gnu.org/archive/html/emacs-orgmode/2014-09/msg00498.html ). Saya mencoba kode itu, dan hanya pengaturan org-latex-custom-id-as-label. Ini berfungsi dengan baik dengan ekspor HTML, tetapi tidak memiliki efek dengan ekspor LaTeX. Saya berharap saya bisa hanya mengandalkan org-modefungsi inti, masih saya suka jawaban @ malababrba, karena memungkinkan generalisasi yang bagus.
gsl
@rasmus Itulah perilaku yang saya butuhkan. Tapi saya menjalankan kode Anda, tetapi saya mengerti \section{h}\label{sec-1}saya menggunakan 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.orgdan Org-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/). Juga, untuk memastikan, saya mengganti nama .emacs.d saya, jadi itu berjalan tanpa hal-hal khusus.
gsl
Sangat bagus bagaimana Anda berhasil mensintesis seluruh contoh kerja hanya dalam satu baris kode!
gsl
Ah, itu akan menjelaskannya! Saya mencoba menginstal terbaru org-modemenggunakan ini el-getresep: github.com/dimitri/el-get/blob/master/recipes/org-mode.rcp , tapi aku masih mendapatkan Org-mode version 8.2.6 (release_8.2.6-1 @ /Users/gsl/.emacs.d/el-get/org-mode/lisp/bahasa Apakah Anda tahu bagaimana untuk men-tweak resep itu sehingga saya bisa menggunakannya untuk cabang-dev? Saya juga bisa menanyakan ini sebagai pertanyaan baru. Terima kasih banyak untuk menunjukkannya.
gsl

Jawaban:

10

Saya telah menulis fungsi yang melakukan apa yang Anda inginkan dengan cara yang cukup panjang. Ia memeriksa tajuk mana yang berisi properti CUSTOM_LABEL (atau properti lain yang Anda konfigurasikan) dan memanggil fungsi endless/insert-org-label-latexmasing-masing dengan nilai properti sebagai argumen.

Cuplikan contoh juga menunjukkan cara memperluasnya untuk html atau backend lainnya.

Konfigurasikan penggantian

Dengan variabel ini, Anda dapat mengonfigurasi properti yang Anda pedulikan dan fungsi mana yang dipanggil untuk menangani masing-masing properti.

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

Pekerja Berat

Fungsi ini adalah apa yang harus Anda tambahkan ke kait ekspor org. Ini mengurus memeriksa properti yang tercantum di atas, dan memanggil fungsi yang terkait dengan properti tersebut.

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

Fungsi yang Anda tetapkan

Ini adalah orang-orang yang melakukan penggantian yang sebenarnya. Di bawah ini adalah contoh untuk kasus lateks.

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

Hasil

Evaluasi semua kode ini di atas, lalu ekspor buffer org berikut ke lateks.

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

Buffer lateks yang dihasilkan harus seperti ini.

\section{Test}
\label{sec-1}
\label{hi}
Test
Malabarba
sumber
Terima kasih atas kodenya, komentarnya, dan bantuannya. Ini sangat membantu. Saya belajar banyak juga. Terima kasih.
gsl
5

Catatan untuk cuplikan kode Anda harus menggunakan versi pengembangan saat ini (org-version) => "8.3beta",.

Silakan gunakan CUSTOM_IDdan tautan internal. Lihat (info "(org) Handling links").

Dalam kebanyakan kasus, Anda tidak perlu khawatir tentang hasil penamaan internal yang diekspor di Org. Tautan ke angka dan tajuk berita, katakanlah, akan benar ketika diekspor. Lihat (info "(org) Internal links").

Untuk LaTeX coba:

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

Hasil:

\section{h}
\label{h}

Dalam eksportir seperti ox-odtdan ox-htmltajuk berisi id internal, IDdan CUSTOM_ID. Tautan mana yang digunakan tergantung pada tautan:

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

Hasil:

<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>
rasmus
sumber
Terima kasih telah menunjukkan cara default untuk pengguna> 8.3! Orang bisa menggunakan cara default untuk CUSTOM_ID, sementara masih menggunakan @ malabarba untuk melewati properti org lainnya. Saya sebenarnya menggunakannya untuk melewatkan beberapa properti lainnya (seperti cite-keys, genre, venue, dll), di samping CUSTOM_ID.
gsl
1

Saya tidak yakin, tetapi Anda mungkin perlu memberi saran atau bahkan menimpa fungsi eksportir. Dalam Org 8, itu org-latex-export-headline.

Fungsi ini mendapatkan elemen tajuk, isi tajuk, dan daftar properti tambahan. Dalam fungsi eksportir, Anda bisa mendapatkan properti elemen (termasuk label khusus) org-element-property.

lunaryorn
sumber
Terima kasih banyak untuk penunjuknya. Sejauh yang saya mengerti dari posting / artikel lain, orgeksportir baru tidak bekerja terlalu banyak dengan menasihati, tetapi satu menciptakan filterfungsi untuk dipanggil pada tahap tertentu dari proses ekspor, kira-kira seperti ini: `` `(eval-after -load 'ox-latex' (tambahkan-ke-daftar 'org-ekspor-filter-final-fungsi-fungsi' my-filter-function)) `` `(Saya tidak yakin mengapa sintaks back-tick tidak bekerja dalam komentar?)
gsl