임의의 ORG PROPERTY를 임의의 문자열 (즉, LaTeX 레이블)로 변환하는 Emacs 기능?


11

CUSTOM_LABEL 속성이있는 org 파일로 많은 문서가 있습니다.

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

이 경우 파일을 LaTeX로 내보내 각 파일을로 변환 CUSTOM_LABEL해야합니다 \label{marker}. 위의 예는로 번역되어야합니다 \label{AP 1}.

나는 수출시 사용자 정의 함수를 호출하는 방법을 이미 알고,하지만 난 특정 변환을 할 수있는 defun는를 작성하는 전문가 부족, 즉 아니다 CUSTOM_LABEL->\label{}

어떻게 defun는이 주입 할 수있는 custom_label등의 \label{}기록을?

일부 의사 코드 또는 포인터조차도 감사하겠습니다.

나는 org-mode 매뉴얼을 철저히 검색했기 때문에 이맥스 질문이기 때문에 다른 장소 대신이 질문을하고 있습니다.이 기능은 현재 사용할 수 없습니다.

내보낼 때 주어진 속성 (LaTeX, HTML 또는 기타 형식)을 변환하는 일반적인 기능이 더 좋습니다.

감사합니다.


제목이 벗어난 것 같습니다. 질문을 이해하면 조직 속성을 다른 조직 속성이 아닌 임의의 문자열 (즉, LaTeX 레이블)로 바꾸고 싶습니다.
Malabarba

@ 라스무스 : 그 포인터 주셔서 감사합니다. 나는 몇 시간 전에 emacs-orgmode목록에서 그것에 대해 읽었습니다 . 그 코드를 시도하고 설정했습니다 org-latex-custom-id-as-label. HTML 내보내기에서는 잘 작동하지만 LaTeX 내보내기에는 영향을 미치지 않습니다. 나는 org-mode핵심 기능 에만 의존 할 수 있기를 바랍니다 . 여전히 @malababrba의 답변을 좋아합니다. 좋은 일반화가 가능합니다.
gsl

@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.org하고 Org-mode version 8.2.6 (release_8.2.6-1 @ /Applications/Emacs.app/Contents/Resources/lisp/org/)있습니다. 또한 확인하기 위해 .emacs.d의 이름을 변경 했으므로 사용자 정의 항목이 없었습니다.
gsl

한 줄의 코드로 전체 작업 예제를 합성하는 방법이 훌륭합니다!
gsl

아, 그거 설명해! org-modeel-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

답변:


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

결과

위의이 코드를 모두 평가 한 후 다음 조직 버퍼를 라텍스로 내보내십시오.

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

대부분의 경우 조직에서 내부 이름을 내 보낸 결과에 대해 걱정하지 않아도됩니다. 예를 들어, 내보낼 때 수치 및 헤드 라인에 대한 링크가 정확합니다. 참조하십시오 (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를 포함 ID하고 CUSTOM_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를 사용하여 다른 조직 속성을 전달하는 동안 기본 방법을 사용할 수 있습니다 . 실제로 옆에 몇 가지 다른 속성 (예 : 인용 키, 장르, 장소 등)을 전달하는 방식으로 사용하고 있습니다 CUSTOM_ID.
gsl

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.