ฟังก์ชัน Emacs ในการแปลง ORG PROPERTY ตามอำเภอใจให้เป็นสตริงโดยพลการ (คือฉลาก LaTeX)?


11

ฉันมีเอกสารหลายฉบับเป็นไฟล์ org ซึ่งมีคุณสมบัติ CUSTOM_LABEL เช่น

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

ในกรณีนี้ไฟล์ที่จะต้องมีการส่งออกเป็นน้ำยางแต่ละแปลเป็นCUSTOM_LABEL ตัวอย่างข้างต้นควรจะแปลให้\label{marker}\label{AP 1}

ฉันรู้แล้วว่าจะเรียกใช้ฟังก์ชันที่กำหนดเองในเวลาส่งออกได้อย่างไร แต่ฉันไม่เชี่ยวชาญพอที่จะเขียน defun เพื่อทำการแปลงเฉพาะเช่นCUSTOM_LABEL->\label{}

defun สามารถฉีด a custom_labelตามที่\label{}เขียนได้อย่างไร?

ฉันจะขอบคุณแม้เพียงบางรหัสหลอกหรือตัวชี้บางอย่าง

ฉันถามคำถามนี้ที่นี่แทนที่จะเป็นที่อื่นเพราะนี่เป็นคำถามของ Emacs มากกว่าเนื่องจากฉันค้นหาคู่มือโหมด org อย่างละเอียดและคุณลักษณะประเภทนั้นไม่สามารถใช้งานได้ในขณะนี้

ฟังก์ชั่นทั่วไปเพื่อแปลงคุณสมบัติที่กำหนดเมื่อส่งออก (LaTeX, HTML หรือรูปแบบอื่น ๆ ) จะดียิ่งขึ้น

ขอบคุณ.


ชื่อดูเหมือนจะปิด หากฉันเข้าใจคำถามคุณต้องการเปลี่ยนคุณสมบัติขององค์กรให้เป็นสตริงที่กำหนดเอง (กล่าวคือฉลาก LaTeX) ไม่ใช่ทรัพย์สินขององค์กรอื่น
Malabarba

@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

@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

เป็นเรื่องที่ดีมากที่คุณสามารถสังเคราะห์ตัวอย่างการทำงานทั้งหมดได้ในรหัสบรรทัดเดียว!
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/คุณรู้วิธีบิดสูตรนั้นไหมเพื่อที่ฉันจะได้ใช้มันสำหรับ dev สาขา? ฉันสามารถถามคำถามนี้เป็นคำถามใหม่ได้ ขอบคุณมากสำหรับการชี้ว่า
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)))))

คนงานหนัก

ฟังก์ชั่นนี้คือสิ่งที่คุณควรเพิ่มลงใน hook ส่งออก org มันจะคอยตรวจสอบคุณสมบัติตามรายการข้างต้นและเรียกใช้ฟังก์ชันที่เกี่ยวข้องกับคุณสมบัติเหล่านั้น

(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ในขณะที่ยังคงใช้ @ malabarba สำหรับการส่งผ่านองค์กรอื่น ๆ ฉันกำลังจริงโดยใช้วิธีการที่จะผ่านคุณสมบัติอื่น ๆ ไม่กี่ (ชอบอ้างคีย์, ประเภทสถานที่ ฯลฯ ) CUSTOM_IDข้าง
gsl

1

ฉันไม่แน่ใจ แต่คุณอาจต้องแนะนำหรือเขียนทับฟังก์ชั่นผู้ส่งออก ในองค์กรที่ 8 org-latex-export-headlineที่เป็น

ฟังก์ชั่นรับองค์ประกอบพาดหัวเนื้อหาพาดหัวและรายการคุณสมบัติเพิ่มเติม ภายในฟังก์ชั่นการส่งออกคุณจะได้รับคุณสมบัติขององค์ประกอบ (รวมถึงป้ายที่กำหนดเองของคุณ) org-element-propertyกับ


ขอบคุณมากสำหรับตัวชี้ เท่าที่ฉันเข้าใจจากการโพสต์ / บทความอื่น ๆorgผู้ส่งออกรายใหม่ไม่ทำงานมากเกินไปเมื่อให้คำปรึกษา แต่มีผู้สร้างfilterหน้าที่ที่จะเรียกในขั้นตอนหนึ่งของกระบวนการส่งออกโดยประมาณดังนี้ `` ` โหลด 'ox-latex' (Add-to-list 'org-export-filter-final-output-function' my-filter-function)) `` `(ฉันไม่แน่ใจว่าทำไมไวยากรณ์ด้านหลังเห็บไม่ทำงาน ในความคิดเห็น?)
gsl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.