Emacs, rastgele bir ORG PROPERTY'yi rastgele bir dizeye (yani, bir LaTeX etiketi) dönüştürmek için çalışır?


11

Kuruluş dosyaları gibi CUSTOM_LABEL özelliğine sahip birçok belgem var

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

Bu durumda, dosyaların LaTeX olarak dışa aktarılması ve her birinin a CUSTOM_LABELolarak çevrilmesi gerekir \label{marker}. Yukarıdaki örnek tercüme edilmelidir \label{AP 1}.

Ben zaten ihracat zamanında özel fonksiyonları aramak için biliyorum, ama ben bu belirli dönüşüm yapmak için bir defun yazmak için yeterince uzman değilim, yani CUSTOM_LABEL->\label{}

Nasıl defun bir enjekte etmek olabilir custom_labelolarak \label{}yazılabilir?

Ben bile sadece bazı sahte kod, ya da bazı işaretçiler takdir ediyorum.

Bu soruyu burada başka yerler yerine soruyorum, çünkü bu daha çok bir Emacs sorusu, çünkü org modu kılavuzunu iyice araştırdım ve bu tür özellikler şu anda kullanılamıyor.

Dışa aktarma sırasında belirli bir EMLAK'ı (LaTeX, HTML veya başka bir format) dönüştürmek için kullanılan genel bir işlev daha da iyi olurdu.

Teşekkür ederim.


Başlık kapalı görünüyor. Soruyu anlarsam, bir org özelliğini başka bir org özelliğine değil, rastgele bir dizeye (yani, LaTeX etiketi) dönüştürmek istersiniz.
Malabarba

@rasmus: O işaretçi için teşekkürler. Bunu birkaç saat önce emacs-orgmodelistede okuyordum (diğerleri arasında lists.gnu.org/archive/html/emacs-orgmode/2014-09/msg00498.html ). Bu kodu denedim ve sadece ayar yaptım org-latex-custom-id-as-label. HTML dışa aktarma ile iyi çalışır, ancak LaTeX dışa aktarma ile herhangi bir etkisi yoktur. Keşke sadece org-modetemel işlevlere güvenebilseydim , yine de güzel bir genellemeye izin verdiği için @ malababrba'nın cevabını seviyorum.
gsl

@rasmus İhtiyacım olan davranış bu. Ama kodunu çalıştırdım ama \section{h}\label{sec-1}kullanıyorum 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.orgve Org-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/). Ayrıca, emin olmak için, benim .emacs.d adını değiştirdim, bu yüzden özel bir şey olmadan koştu.
gsl

Çok güzel bir kod örneğinde bütün bir çalışma örneğini nasıl sentezlemeyi başardınız!
gsl

Ah, bu açıklayabilirdi! org-modeBu el-gettarifi kullanarak en son yüklemeyi denedim : github.com/dimitri/el-get/blob/master/recipes/org-mode.rcp , ama yine de Org-mode version 8.2.6 (release_8.2.6-1 @ /Users/gsl/.emacs.d/el-get/org-mode/lisp/bu tarifi nasıl kullanacağımı biliyor musunuz? dev-dal? Bunu yeni bir soru olarak da sorabilirim. Bunu işaret ettiğiniz için çok teşekkür ederim.
gsl

Yanıtlar:


10

İstediğinizi oldukça genişletilebilir bir şekilde yapan bir işlev yazdım. Hangi başlıkların özelliği CUSTOM_LABEL (veya yapılandırdığınız başka bir özelliği) içerdiğini kontrol eder ve endless/insert-org-label-latexher birindeki işlevi bağımsız değişken olarak özelliğin değeriyle çağırır .

Örnek snippet ayrıca html veya diğer arka uçlar için nasıl genişletileceğini gösterir.

Değiştirmeleri yapılandırın

Bu değişkenle, önem verdiğiniz özellikleri ve her özelliği işlemek için hangi işlevlerin çağrıldığını yapılandırabilirsiniz.

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

Ağır işçi

Bu işlev, kuruluş dışa aktarma kancasına eklemeniz gereken işlevdir. Yukarıda listelenen özellikleri kontrol etmek ve bu özelliklerle ilişkili işlevleri çağırmakla ilgilenir.

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

Tanımladığınız fonksiyonlar

Bunlar asıl değiştirmeyi yapanlardır. Aşağıda lateks vaka için bir örnek bulunmaktadır.

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

Sonuç

Yukarıdaki tüm kodları değerlendirin, ardından aşağıdaki kuruluş tamponunu latekse verin.

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

Ortaya çıkan lateks tamponu böyle bir şey olmalıdır.

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

Kod, yorumlar ve yardım için teşekkür ederim. Çok faydalı. Ben de çok şey öğrendim. Teşekkür ederim.
gsl

5

Kod parçacıkları için geçerli geliştirme sürümünü kullanmanız gerekir (org-version) => "8.3beta".

Lütfen CUSTOM_IDve dahili bağlantı kullanın . Bkz (info "(org) Handling links").

Çoğu durumda Kuruluş'taki dahili adlandırma işleminin dışa aktarılan sonucu konusunda endişelenmemelisiniz. Şekillere ve başlıklara bağlantılar, örneğin, dışa aktarıldığında doğru olacaktır. Bkz (info "(org) Internal links").

LaTeX için şunu deneyin:

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

Sonuç:

\section{h}
\label{h}

Gibi ihracatçıların ise ox-odtve ox-htmlmanşetlere hem iç kimliği içermez, IDve CUSTOM_ID. Hangi bağlantının kullanıldığı bağlantıya bağlıdır:

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

Sonuç:

<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 kullanıcı için varsayılan yolu işaret ettiğiniz için teşekkür ederiz! CUSTOM_IDBaşka bir kuruluş özelliğini geçirmek için @ malabarba's kullanırken hala varsayılan yol kullanılabilir. Aslında bunu (cite anahtarları, tür, mekan, vb CUSTOM_ID. Gibi) birkaç özellik geçmek için kullanıyorum .
gsl

1

Emin değilim, ancak büyük olasılıkla ihracatçı işlevini önermeniz veya hatta üzerine yazmanız gerekir. Org 8'de bu org-latex-export-headline.

İşlev başlık öğesini, başlık içeriğini ve ek bir özellik listesini alır. Dışa aktarma işlevi içinde, öğe özelliklerini (özel etiketiniz dahil) ile alabilirsiniz org-element-property.


İşaretçi için çok teşekkür ederim. Diğer gönderilerden / makalelerden anladığım kadarıyla, yeni orgihracatçı danışmanlık ile çok fazla çalışmıyor, aksine filterihracat sürecinin belirli bir aşamasında kabaca şu şekilde çağrılacak işlevler yaratıyor : `` (eval-after -load 'ox-latex' (listeye ekle 'org-export-filter-final-output-function' my-filter-function)) `` (Back-tick sözdiziminin neden çalışmadığından emin değilim yorumlarda?)
gsl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.