Emacs एक मनमाना ORG PROPERTY को एक मनमाना स्ट्रिंग (अर्थात्, एक LaTeX लेबल) में बदलने का कार्य करता है?


11

मेरे पास org-files के रूप में कई दस्तावेज हैं जिनमें CUSTOM_LABEL संपत्ति है, जैसे

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

इस मामले में, फ़ाइलों को प्रत्येक के CUSTOM_LABELरूप में अनुवाद करते हुए, LaTeX के रूप में निर्यात किया जाना चाहिए \label{marker}। ऊपर दिए गए उदाहरण का अनुवाद करना चाहिए \label{AP 1}

मुझे पहले से ही पता है कि निर्यात समय पर कस्टम फ़ंक्शन को कैसे कॉल किया जाता है, लेकिन मैं विशेष रूप से रूपांतरण करने के लिए एक मानहानि लिखने के लिए पर्याप्त विशेषज्ञ नहीं हूं, अर्थात CUSTOM_LABEL->\label{}

एक के custom_labelरूप में लिखने के लिए डीफॉन कैसे इंजेक्ट किया \label{}जा सकता है?

मैं भी सिर्फ कुछ छद्म कोड, या कुछ संकेत की सराहना करेंगे।

मैं अन्य स्थानों के बजाय यहां यह सवाल पूछ रहा हूं, क्योंकि यह एक एमएसीएस प्रश्न है, क्योंकि मैंने ऑर्ग-मोड मैनुअल को अच्छी तरह से खोजा है, और वर्तमान में इस तरह की सुविधा अनुपलब्ध है।

निर्यात करते समय दिए गए PROPERTY को परिवर्तित करने का एक सामान्य कार्य (LaTeX, HTML, या कोई अन्य प्रारूप), और भी बेहतर होगा।

धन्यवाद।


शीर्षक से लगता है। यदि मैं प्रश्न को समझता हूं, तो आप एक ऑर्गेन प्रॉपर्टी को एक मनमाने स्ट्रिंग (जैसे, एक एलएटीएक्स लेबल) में बदलना चाहते हैं, न कि किसी अन्य ऑर्ग प्रॉपर्टी में।
मालाबार

@ क्रासमस: उस पॉइंटर के लिए धन्यवाद। मैं उस सूची के बारे में कुछ घंटों पहले 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

@ परमास वह व्यवहार है जिसकी मुझे आवश्यकता है। लेकिन मैं अपने कोड भाग गया, लेकिन मैं मिलता है \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

इतना अच्छा आप कोड की एक पंक्ति में एक पूरे काम कर रहे उदाहरण को संश्लेषित करने में कैसे कामयाब रहे!
gsl

आह, कि यह समझा जाएगा! मैंने 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

जवाबों:


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

परिणाम

उपरोक्त सभी कोड का मूल्यांकन करें, फिर निम्न ओर्गन बफर को लेटेक्स में निर्यात करें।

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

परिणामी लेटेक्स बफर कुछ इस तरह होना चाहिए।

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

कोड, टिप्पणियों और मदद के लिए धन्यवाद। यह बहुत ही उपयोगी है। मैंने भी बहुत कुछ सीखा। धन्यवाद।
gsl

5

कोड स्निपेट के लिए ध्यान दें कि आपको वर्तमान विकास-संस्करण का उपयोग करना चाहिए, और (org-version) => "8.3beta"

कृपया उपयोग करें CUSTOM_IDऔर आंतरिक लिंकिंग। देखते हैं (info "(org) Handling links")

ज्यादातर मामलों में आपको ऑर्ग में आंतरिक नामकरण के निर्यात परिणाम के बारे में चिंतित नहीं होना चाहिए। निर्यात किए जाने पर आंकड़े और सुर्खियों के लिंक, सही होंगे। देखते हैं (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-odtऔर ox-htmlसुर्खियों में दोनों आंतरिक आईडी होते हैं, 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किसी अन्य org-property को पास करने के लिए @ malabarba का उपयोग करते हुए भी डिफ़ॉल्ट तरीके का उपयोग कर सकता है । मैं वास्तव में इसका उपयोग इस तरह से कर रहा हूं कि बगल में कुछ अन्य संपत्तियों (जैसे काइट-की, शैली, स्थल, आदि) को पारित करने के लिए CUSTOM_ID
gsl

1

मुझे यकीन नहीं है, लेकिन आपको निर्यातक फ़ंक्शन को सलाह देने या यहां तक ​​कि ओवरराइट करने की आवश्यकता है। संगठन 8 में, वह है org-latex-export-headline

फ़ंक्शन को शीर्षक तत्व, शीर्षक सामग्री और एक अतिरिक्त संपत्ति सूची मिलती है। निर्यातक फ़ंक्शन के भीतर, आप तत्व गुण (अपने कस्टम लेबल सहित) प्राप्त कर सकते हैं org-element-property


सूचक के लिए बहुत बहुत धन्यवाद। जहां तक ​​मुझे अन्य पोस्ट / लेखों से समझ में आया है, नया orgनिर्यातक सलाह देने के साथ बहुत अधिक काम नहीं करता है, बल्कि filterनिर्यात प्रक्रिया के एक निश्चित चरण में बुलाए जाने वाले कार्यों को बनाता है, मोटे तौर पर इस तरह: `` `(eval-after -ऑक्स 'ऑक्स-लेटेक्स' (ऐड-टू-लिस्ट 'ऑर्ग-एक्सपोर्ट-फिल्टर-फाइनल-आउटपुट-फंक्शन' माय-फिल्टर-फंक्शन)) `` (मुझे यकीन नहीं है कि बैक-टिक सिंटैक्स काम नहीं करता है टिप्पणियों में?)
gsl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.