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.