Emacs-Funktion zum Konvertieren eines beliebigen ORG-EIGENTUMS in einen beliebigen String (nämlich ein LaTeX-Label)?

11

Ich habe viele Dokumente als Organisationsdateien, die eine CUSTOM_LABEL-Eigenschaft haben, wie z

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

In diesem Fall müssen die Dateien als LaTeX exportiert und jeweils CUSTOM_LABELals übersetzt werden \label{marker}. Das obige Beispiel sollte übersetzt werden in \label{AP 1}.

Ich weiß bereits, wie man benutzerdefinierte Funktionen beim Export aufruft, aber ich bin nicht kompetent genug, um eine Definition für diese bestimmte Konvertierung zu schreiben, dh CUSTOM_LABEL->\label{}

Wie kann der Defun injiziert werden, custom_labelwie \label{}geschrieben?

Ich würde sogar nur einen Pseudocode oder einige Zeiger schätzen.

Ich stelle diese Frage hier anstelle anderer Stellen, da dies eher eine Emacs-Frage ist, da ich das Handbuch im Organisationsmodus gründlich durchsucht habe und diese Art von Funktion derzeit nicht verfügbar ist.

Eine generische Funktion zum Konvertieren eines bestimmten EIGENTUMS beim Exportieren (LaTeX, HTML oder ein anderes Format) wäre sogar noch besser.

Vielen Dank.

gsl
quelle
Der Titel scheint aus. Wenn ich die Frage verstehe, möchten Sie eine org-Eigenschaft in eine beliebige Zeichenfolge (nämlich eine LaTeX-Bezeichnung) und nicht in eine andere org-Eigenschaft umwandeln.
Malabarba
@rasmus: Danke für diesen Hinweis. Ich habe darüber erst vor wenigen Stunden auf der emacs-orgmodeListe gelesen (unter anderem lists.gnu.org/archive/html/emacs-orgmode/2014-09/msg00498.html ). Ich habe diesen Code ausprobiert und nur eingestellt org-latex-custom-id-as-label. Es funktioniert gut mit dem HTML-Export, hat aber keine Auswirkungen auf den LaTeX-Export. Ich wünschte, ich könnte mich nur auf die org-modeKernfunktionen verlassen, trotzdem gefällt mir die Antwort von @ malababrba, da sie eine nette Verallgemeinerung ermöglicht.
gsl
@rasmus Das ist das Verhalten, das ich brauche. Aber ich habe Ihren Code ausgeführt, aber ich verstehe, dass \section{h}\label{sec-1}ich 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.orgund verwende Org-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/). Um sicherzugehen, habe ich meine .emacs.d umbenannt, sodass sie ohne benutzerdefinierte Inhalte ausgeführt wurde.
gsl
So schön, wie Sie es geschafft haben, ein ganzes Arbeitsbeispiel in nur einer Codezeile zusammenzufassen!
gsl
Ah, das würde es erklären! Ich habe versucht, die neueste Versionorg-mode mit diesem el-getRezept zu installieren : github.com/dimitri/el-get/blob/master/recipes/org-mode.rcp , aber ich bekomme immer noch Org-mode version 8.2.6 (release_8.2.6-1 @ /Users/gsl/.emacs.d/el-get/org-mode/lisp/Würdest du wissen, wie man dieses Rezept optimiert, damit ich es für das verwenden kann? dev-branch? Ich könnte dies auch als neue Frage stellen. Vielen Dank, dass Sie darauf hingewiesen haben.
gsl

Antworten:

10

Ich habe eine Funktion geschrieben, die auf erweiterbare Weise das tut, was Sie wollen. Es prüft, welche Überschriften die Eigenschaft CUSTOM_LABEL (oder eine andere von Ihnen konfigurierte Eigenschaft) enthalten, und ruft die Funktion endless/insert-org-label-latexfür jede von ihnen mit dem Wert der Eigenschaft als Argument auf.

Das Beispiel-Snippet zeigt auch, wie es für HTML oder andere Backends erweitert werden kann.

Konfigurieren Sie die Ersetzungen

Mit dieser Variablen können Sie Eigenschaften konfigurieren, die Ihnen wichtig sind, und welche Funktionen aufgerufen werden, um jede Eigenschaft zu behandeln.

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

Der schwere Arbeiter

Diese Funktion sollten Sie dem org export export hook hinzufügen. Es wird darauf geachtet, nach den oben aufgeführten Eigenschaften zu suchen und die diesen Eigenschaften zugeordneten Funktionen aufzurufen.

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

Die Funktionen, die Sie definieren

Dies sind diejenigen, die den eigentlichen Austausch durchführen. Unten finden Sie ein Beispiel für den Latexfall.

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

Ergebnis

Bewerten Sie den gesamten obigen Code und exportieren Sie dann den folgenden Organisationspuffer in Latex.

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

Der resultierende Latexpuffer sollte ungefähr so ​​sein.

\section{Test}
\label{sec-1}
\label{hi}
Test
Malabarba
quelle
Vielen Dank für den Code, die Kommentare und die Hilfe. Es ist sehr hilfreich. Ich habe auch viel gelernt. Vielen Dank.
gsl
5

Hinweis: Für die Codefragmente müssen Sie die aktuelle Entwicklungsversion verwenden (org-version) => "8.3beta".

Bitte verwenden Sie CUSTOM_IDund interne Verknüpfung. Siehe (info "(org) Handling links").

In den meisten Fällen sollten Sie sich keine Gedanken über das exportierte Ergebnis der internen Benennung in Org machen. Links zu Abbildungen und Überschriften sind beispielsweise beim Export korrekt. Siehe (info "(org) Internal links").

Für LaTeX versuchen Sie:

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

Ergebnis:

\section{h}
\label{h}

In Exporteuren wie ox-odtund ox-htmlÜberschriften enthalten sowohl interne ID IDals auch CUSTOM_ID. Welcher Link verwendet wird, hängt vom Link ab:

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

Ergebnis:

<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
quelle
Vielen Dank, dass Sie den Standardweg für> 8.3 Benutzer angegeben haben! Man könnte die Standardmethode für verwenden CUSTOM_ID, während man @ malabarba's immer noch zum Übergeben anderer org-Eigenschaften verwendet. Ich benutze es tatsächlich so, um ein paar andere Eigenschaften (wie Cite-Keys, Genre, Veranstaltungsort usw.) daneben zu übergeben CUSTOM_ID.
gsl
1

Ich bin mir nicht sicher, aber Sie müssen wahrscheinlich die Exporterfunktion beraten oder sogar überschreiben. In Org 8 also org-latex-export-headline.

Die Funktion erhält das Überschriftenelement, den Überschrifteninhalt und eine zusätzliche Eigenschaftsliste. Innerhalb der Exporterfunktion können Sie Elementeigenschaften (einschließlich Ihrer benutzerdefinierten Beschriftung) mit abrufen org-element-property.

Mondhorn
quelle
Vielen Dank für den Hinweis. Soweit ich aus anderen Beiträgen / Artikeln verstanden habe, arbeitet der neue orgExporteur nicht zu sehr mit Beratung, sondern man erstellt filterFunktionen, die in einer bestimmten Phase des Exportprozesses aufgerufen werden können, ungefähr so: `` `(eval-after -load 'ox-latex' (zur Liste hinzufügen 'org-export-filter-final-output-Funktionen' my-filter-function)) `` `(Ich bin nicht sicher, warum die Back-Tick-Syntax nicht funktioniert in Kommentaren?)
gsl