Emacs函数将任意ORG属性转换为任意字符串(即LaTeX标签)吗?


11

我有许多文档作为具有CUSTOM_LABEL属性的组织文件,例如

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

在这种情况下,需要将文件导出为LaTeX,并将每个文件翻译CUSTOM_LABEL\label{marker}。上面的示例应转换为\label{AP 1}

我已经知道如何在导出时调用自定义函数,但是我不够熟练,无法编写defun来执行该特定转换,即CUSTOM_LABEL->\label{}

如何能在defun函数中注入custom_label作为\label{}写?

我什至只喜欢一些伪代码或一些指针。

我在这里而不是在其他地方问这个问题,因为这是一个Emacs问题,因为我彻底搜索了组织模式手册,并且该功能目前不可用。

在导出时转换特定属性(LaTeX,HTML或任何其他格式)的通用函数会更好。

谢谢。


标题似乎不对。如果我理解这个问题,则想将org属性转换为任意字符串(即LaTeX标签),而不是另一个org属性。
马拉巴巴2014年

@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 2014年

@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.orgOrg-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/)。另外,为确保确定,我重命名了.emacs.d,因此它没有任何自定义内容。
gsl 2014年

太好了,您如何仅用一行代码就能合成一个完整的工作示例!
gsl 2014年

啊,这可以解释!我尝试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/知道您如何调整该食谱,以便可以将其用于开发分支?我也可以问这个新问题。非常感谢您指出这一点。
gsl 2014年

Answers:


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

重型工人

此功能是您应添加到组织导出挂钩中的功能。它负责检查上面列出的属性,并调用与这些属性关联的函数。

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

结果

评估上面的所有代码,然后将以下组织缓冲区导出到Latex。

* 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")

在大多数情况下,您不必担心Org​​内部命名的导出结果。例如,指向图形和标题的链接在导出时将是正确的。请参阅(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-odtox-html标题都包含内部ID IDCUSTOM_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传递其他任何组织属性。我实际上是在以这种方式使用它来传递旁边的其他一些属性(例如cite-key,流派,场所等)CUSTOM_ID
gsl 2014年

1

我不确定,但是您可能需要建议甚至覆盖导出器功能。在组织8中,即org-latex-export-headline

该函数获取标题元素,标题内容和其他属性列表。在导出器函数中,您可以使用来获取元素属性(包括自定义标签)org-element-property


非常感谢您的指导。据我从其他帖子/文章中了解到,新的org出口商并没有过多地提供建议,而是filter在出口过程的某个阶段创建了要调用的函数,大致如下:```(eval-after -load'ox-latex'(添加到列表'org-export-filter-final-output-functions'my-filter-function))```(我不确定为什么反引号语法不起作用在评论中?)
gsl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.