Hàm Emacs để chuyển đổi một TÀI SẢN ORG tùy ý thành một chuỗi tùy ý (cụ thể là nhãn LaTeX)?


11

Tôi có nhiều tài liệu dưới dạng tệp org có thuộc tính CUSTOM_LABEL, như

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

Trong trường hợp này, các tệp cần được xuất dưới dạng LaTeX, dịch từng tệp CUSTOM_LABELlà a \label{marker}. Ví dụ trên nên dịch sang \label{AP 1}.

Tôi đã biết cách gọi các chức năng tùy chỉnh tại thời điểm xuất, nhưng tôi không đủ chuyên môn để viết một defun để thực hiện chuyển đổi cụ thể đó, tức là CUSTOM_LABEL->\label{}

Làm thế nào các defun để tiêm custom_labelnhư \label{}được viết?

Tôi sẽ đánh giá cao thậm chí chỉ một số mã giả, hoặc một số con trỏ.

Tôi đang hỏi câu hỏi này ở đây thay vì những nơi khác, bởi vì đây là câu hỏi của Emacs nhiều hơn, vì tôi đã tìm kiếm kỹ hướng dẫn sử dụng chế độ org và loại tính năng này hiện không có sẵn.

Một hàm chung để chuyển đổi một SỞ HỮU nhất định khi xuất (LaTeX, HTML hoặc bất kỳ định dạng nào khác), thậm chí còn tốt hơn.

Cảm ơn bạn.


Tiêu đề dường như tắt. Nếu tôi hiểu câu hỏi, bạn muốn biến một thuộc tính org thành một chuỗi tùy ý (cụ thể là nhãn LaTeX), chứ không phải là một thuộc tính org khác.
Malabarba

@rasmus: Cảm ơn bạn vì con trỏ đó. Tôi đã đọc về điều đó chỉ một vài giờ trước trong emacs-orgmodedanh sách (trong số những người khác, list.gnu.org/archive/html/emacs-orgmode/2014-09/msg00498.html ). Tôi đã thử mã đó, và chỉ cần thiết lập org-latex-custom-id-as-label. Nó hoạt động tốt với xuất HTML, nhưng nó không có bất kỳ ảnh hưởng nào với xuất LaTeX. Tôi ước tôi có thể chỉ dựa vào org-modecác chức năng cốt lõi, nhưng tôi vẫn thích câu trả lời của @ malababrba, vì nó cho phép một sự khái quát tốt đẹp.
gsl

@rasmus Đó là hành vi tôi cần. Nhưng tôi đã chạy mã của bạn, nhưng tôi nhận được \section{h}\label{sec-1}tôi đang sử dụng 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.orgOrg-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/). Ngoài ra, để đảm bảo, tôi đã đổi tên .emacs.d của mình, để nó chạy mà không có công cụ tùy chỉnh.
GSL

Thật tuyệt vời khi bạn quản lý để tổng hợp một ví dụ làm việc hoàn toàn chỉ trong một dòng mã!
gsl

Ah, điều đó sẽ giải thích nó! Tôi đã thử cài đặt mới nhất org-modebằng el-getcông thức này : github.com/dimitri/el-get/blob/master/recipes/org-mode.rcp , nhưng tôi vẫn Org-mode version 8.2.6 (release_8.2.6-1 @ /Users/gsl/.emacs.d/el-get/org-mode/lisp/biết Bạn có biết cách điều chỉnh công thức đó để tôi có thể sử dụng nó cho chi nhánh? Tôi cũng có thể hỏi đây là câu hỏi mới. Cảm ơn bạn rất nhiều vì đã chỉ ra rằng.
gsl

Câu trả lời:


10

Tôi đã viết một chức năng thực hiện những gì bạn muốn một cách khá mở rộng. Nó kiểm tra các tiêu đề nào chứa thuộc tính CUSTOM_LABEL (hoặc một số thuộc tính khác mà bạn định cấu hình) và gọi hàm endless/insert-org-label-latextrên mỗi chúng với giá trị của thuộc tính làm đối số.

Đoạn mã ví dụ cũng cho thấy cách mở rộng nó cho html hoặc các phụ trợ khác.

Cấu hình thay thế

Với biến này, bạn có thể định cấu hình các thuộc tính bạn quan tâm và các hàm nào được gọi để xử lý từng thuộc tính.

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

Công nhân nặng

Chức năng này là những gì bạn nên thêm vào hook xuất org. Nó đảm nhiệm việc kiểm tra các thuộc tính được liệt kê ở trên và gọi các hàm liên quan đến các thuộc tính đó.

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

Các chức năng bạn xác định

Đây là những người làm thay thế thực tế. Dưới đây là một ví dụ cho trường hợp latex.

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

Kết quả

Đánh giá tất cả các mã này ở trên, sau đó xuất bộ đệm org sau sang latex.

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

Bộ đệm latex kết quả nên là một cái gì đó như thế này.

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

Cảm ơn bạn đã mã, các ý kiến, và sự giúp đỡ. Nó rất hữu ích. Tôi cũng học được rất nhiều. Cảm ơn bạn.
gsl

5

Lưu ý đối với các đoạn mã bạn phải sử dụng phiên bản phát triển hiện tại , (org-version) => "8.3beta".

Vui lòng sử dụng CUSTOM_IDvà liên kết nội bộ. Xem (info "(org) Handling links").

Trong hầu hết các trường hợp, bạn không nên quan tâm đến kết quả xuất khẩu của việc đặt tên nội bộ trong Org. Liên kết đến số liệu và tiêu đề, nói, sẽ chính xác khi xuất khẩu. Xem (info "(org) Internal links").

Đối với LaTeX hãy thử:

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

Kết quả:

\section{h}
\label{h}

Trong các nhà xuất khẩu như ox-odtox-htmltiêu đề chứa cả id nội bộ IDCUSTOM_ID. Liên kết nào được sử dụng phụ thuộc vào liên kết:

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

Kết quả:

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

Cảm ơn bạn đã chỉ đường mặc định cho> 8.3 người dùng! Người ta có thể sử dụng cách mặc định cho CUSTOM_ID, trong khi vẫn sử dụng @ malabarba để chuyển bất kỳ thuộc tính org nào khác. Tôi thực sự đang sử dụng nó theo cách đó để vượt qua một vài thuộc tính khác (như trích dẫn, thể loại, địa điểm, v.v.), bên cạnh CUSTOM_ID.
gsl

1

Tôi không chắc chắn, nhưng bạn có thể cần phải tư vấn hoặc thậm chí ghi đè chức năng nhà xuất khẩu. Trong Org 8, đó là org-latex-export-headline.

Hàm lấy phần tử tiêu đề, nội dung tiêu đề và danh sách thuộc tính bổ sung. Trong hàm xuất khẩu, bạn có thể nhận các thuộc tính phần tử (bao gồm nhãn tùy chỉnh của bạn) với org-element-property.


Cảm ơn bạn rất nhiều cho con trỏ. Theo như tôi hiểu từ các bài viết / bài viết khác, orgnhà xuất khẩu mới không làm việc quá nhiều với việc tư vấn, mà là người ta tạo ra các filterhàm được gọi ở một giai đoạn nhất định của quy trình xuất khẩu, đại khái như sau: `` `(eval-after -load 'ox-latex' (add-to-list 'org-export-filter-Final-output-function' my-filter-function)) `` (Tôi không chắc tại sao cú pháp back-tick không hoạt động trong ý kiến?)
gsl
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.