O Emacs funciona para converter uma PROPRIEDADE ORG arbitrária em uma string arbitrária (ou seja, um rótulo LaTeX)?


11

Tenho muitos documentos como arquivos org que possuem uma propriedade CUSTOM_LABEL, como

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

Nesse caso, os arquivos precisam ser exportados como LaTeX, traduzindo cada CUSTOM_LABELum como a \label{marker}. O exemplo acima deve ser traduzido para \label{AP 1}.

Eu já sei como chamar funções personalizadas no momento da exportação, mas não sou especialista o suficiente para escrever um resumo para fazer essa conversão específica, ou seja, CUSTOM_LABEL->\label{}

Como o desafiador para injetar um custom_labelcomo \label{}está escrito?

Eu apreciaria mesmo apenas alguns pseudo-códigos ou alguns indicadores.

Estou fazendo essa pergunta aqui, em vez de outros lugares, porque essa é mais uma pergunta do Emacs, já que pesquisei minuciosamente o manual do modo organizacional e esse tipo de recurso não está disponível no momento.

Uma função genérica para converter uma determinada PROPRIEDADE ao exportar (LaTeX, HTML ou qualquer outro formato) seria ainda melhor.

Obrigado.


O título parece desligado. Se eu entendi a pergunta, você deseja transformar uma propriedade organizacional em uma sequência arbitrária (ou seja, um rótulo LaTeX), não em outra propriedade organizacional.
Malabarba 24/09

@rasmus: Obrigado por esse ponteiro. Eu estava lendo sobre isso há apenas algumas horas na emacs-orgmodelista (entre outras, lists.gnu.org/archive/html/emacs-orgmode/2014-09/msg00498.html ). Eu tentei esse código, e apenas definindo org-latex-custom-id-as-label. Funciona bem com a exportação de HTML, mas não tem nenhum efeito com a exportação do LaTeX. Eu gostaria de poder confiar apenas nas org-modefunções principais, ainda assim como a resposta de @ malababrba, pois permite uma boa generalização.
GSL

@rasmus Esse é o comportamento que eu preciso. Mas eu corri seu código, mas entendi \section{h}\label{sec-1}que estou usando 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.orge Org-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/). Também, para ter certeza, renomei meu arquivo .emacs.d, para que ele funcionasse sem itens personalizados.
GSL

Que bom que você conseguiu sintetizar um exemplo de trabalho inteiro em apenas uma linha de código!
GSL

Ah, isso explicaria isso! Tentei instalar a última versãoorg-mode usando esta el-getreceita: github.com/dimitri/el-get/blob/master/recipes/org-mode.rcp , mas ainda recebo Org-mode version 8.2.6 (release_8.2.6-1 @ /Users/gsl/.emacs.d/el-get/org-mode/lisp/Você sabe como ajustar essa receita para que eu possa usá-la no dev-branch? Eu também poderia fazer isso como nova pergunta. Muito obrigado por apontar isso.
GSL

Respostas:


10

Eu escrevi uma função que faz o que você deseja de uma maneira bastante extensível. Ele verifica quais títulos contêm a propriedade CUSTOM_LABEL (ou alguma outra propriedade configurada) e chama a função endless/insert-org-label-latexem cada uma delas com o valor da propriedade como argumento.

O trecho de exemplo também mostra como estendê-lo para html ou outros back-ends.

Configure as substituições

Com essa variável, você pode configurar as propriedades importantes e quais funções são chamadas para lidar com cada propriedade.

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

O trabalhador pesado

Esta função é o que você deve adicionar ao gancho de exportação organizacional. Ele cuida da verificação das propriedades listadas acima e da chamada das funções associadas a essas propriedades.

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

As funções que você define

Estes são os que fazem a substituição real. Abaixo está um exemplo para o caso de látex.

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

Resultado

Avalie todo esse código acima e exporte o seguinte buffer organizacional para o látex.

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

O buffer de látex resultante deve ser algo assim.

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

Obrigado pelo código, pelos comentários e pela ajuda. É muito útil. Eu também aprendi muito. Obrigado.
gsl

5

Nota para os trechos de código, você deve usar a versão de desenvolvimento atual (org-version) => "8.3beta",.

Por favor, use CUSTOM_IDe link interno. Veja (info "(org) Handling links").

Na maioria dos casos, você não deve se preocupar com o resultado exportado da nomeação interna na organização. Os links para figuras e manchetes, digamos, estarão corretos quando exportados. Veja (info "(org) Internal links").

Para o LaTeX, tente:

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

Resultado:

\section{h}
\label{h}

Nos exportadores, como ox-odte as ox-htmlmanchetes, contêm os IDs internos IDe CUSTOM_ID. Qual link é usado depende do link:

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

Resultado:

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

Obrigado por apontar o caminho padrão para> 8,3 usuários! Pode-se usar o caminho padrão para CUSTOM_ID, enquanto ainda estiver usando @ malabarba's para passar qualquer outra propriedade organizacional. Na verdade, estou usando dessa maneira para passar algumas outras propriedades (como cite-keys, gênero, local etc.) ao lado CUSTOM_ID.
GSL

1

Não tenho certeza, mas você provavelmente precisará aconselhar ou mesmo substituir a função exportador. Na Org 8, é isso org-latex-export-headline.

A função obtém o elemento do título, o conteúdo do título e uma lista de propriedades adicionais. Na função exportador, você pode obter propriedades do elemento (incluindo seu rótulo personalizado) com org-element-property.


Muito obrigado pelo ponteiro. Tanto quanto eu entendi de outras postagens / artigos, o novo orgexportador não trabalha muito com aconselhamento, mas cria filterfunções para serem chamadas em um determinado estágio do processo de exportação, mais ou menos assim: `` (eval-after -load 'ox-latex' (adicionar à lista 'funções org-export-filter-final-output-functions' my-filter-function)) `` `(Não sei por que a sintaxe do back-tick não funciona nos comentários?)
gsl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.