조직 모드 버퍼의 최상위 제목을 파일로 내보내는 방법은 무엇입니까?


17

org-mode버퍼 의 각 최상위 제목을 해당 CUSTOM_ID+ (위생) 제목 값을 따서 명명 된 별도의 파일로 내보내려면 어떻게해야합니까?

버퍼에 다음이 포함되어 있다고 가정 해 봅시다.

* Title of Heading 1
  :PROPERTIES:
  :CUSTOM_ID: fibrillogenesis
  :END:
  Suspendisse potenti. Mauris ac felis vel velit tristique imperdiet.  

** Sub-Heading
   Nullam rutrum.

* Another Title for Heading 2
  :PROPERTIES:
  :CUSTOM_ID: mitochondrion
  :END:
  Mauris mollis tincidunt felis.  Sed bibendum.

최종 결과는 다음과 같은 파일 이름과 컨텐츠를 사용하여 내보내기 시간에 선택한 형식 (HTML, LaTeX 등)으로 두 개의 파일 (두 개의 최상위 표제 각각에 대해 하나씩)을 포함하는 디렉토리입니다.

  1. 처음 내 보낸 제목의 파일 이름 : fibrillogenesis-title-of-heading-1.[ext]

    원래 첫 번째 최상위 제목에 해당하는 내 보낸 내용 :

    * Title of Heading 1
      :PROPERTIES:
      :CUSTOM_ID: fibrillogenesis
      :END:
      Suspendisse potenti. Mauris ac felis vel velit tristique imperdiet.  
    
    ** Sub-Heading 
       Nullam rutrum.
    
  2. 두 번째로 내 보낸 제목의 파일 이름 : mitochondrion-another-title-for-heading-2.[ext]

    원래 두 번째 최상위 제목에 해당하는 내 보낸 내용 :

    * Another Title for Heading 2
    :PROPERTIES:
    :CUSTOM_ID: mitochondrion
    :END:
    Mauris mollis tincidunt felis.  Sed bibendum. 
    

힌트, 방향, 의사 코드 또는 (더 나은) 실제 코드에 대해 매우 감사하겠습니다.

답변:


27

다음 명령을 사용하면 백엔드를 선택한 다음 각 최상위 하위 트리를 별도의 파일로 내 보냅니다.

(defun org-export-all (backend)
  "Export all subtrees that are *not* tagged with :noexport: to
separate files.

Note that subtrees must have the :EXPORT_FILE_NAME: property set
to a unique value for this to work properly."
  (interactive "sEnter backend: ")
  (let ((fn (cond ((equal backend "html") 'org-html-export-to-html)
                  ((equal backend "latex") 'org-latex-export-to-latex)
                  ((equal backend "pdf") 'org-latex-export-to-pdf))))
    (save-excursion
      (set-mark (point-min))
      (goto-char (point-max))
      (org-map-entries (lambda () (funcall fn nil t)) "-noexport" 'region-start-level))))

현재 HTML ( html), LaTeX ( latex) 및 PDF ( pdf) 내보내기를 지원합니다. 에 절을 더 추가하여 더 많은 백엔드에 대한 지원을 추가 할 수 있습니다 cond.

docstring에서 알 수 있듯이 각 하위 트리마다 :EXPORT_FILE_NAME:속성을 내보낼 파일 이름 으로 설정해야 합니다. (다른 옵션은 아래를 참조하십시오.)

제목 텍스트에서 내보내기 파일 이름 자동 생성

:EXPORT_FILE_NAME:모든 최상위 제목 에 속성 을 추가하지 않으려는 경우 내보내기 중에 org-export-all일시적으로 설정 :EXPORT_FILE_NAME:되는 제목 텍스트 등에서 파일 이름을 자동으로 생성하도록 수정할 수 있습니다 .

(defun org-export-all (backend)
  "Export all subtrees that are *not* tagged with :noexport: to
separate files.

Subtrees that do not have the :EXPORT_FILE_NAME: property set
are exported to a filename derived from the headline text."
  (interactive "sEnter backend: ")
  (let ((fn (cond ((equal backend "html") 'org-html-export-to-html)
                  ((equal backend "latex") 'org-latex-export-to-latex)
                  ((equal backend "pdf") 'org-latex-export-to-pdf)))
        (modifiedp (buffer-modified-p)))
    (save-excursion
      (set-mark (point-min))
      (goto-char (point-max))
      (org-map-entries
       (lambda ()
         (let ((export-file (org-entry-get (point) "EXPORT_FILE_NAME")))
           (unless export-file
             (org-set-property
              "EXPORT_FILE_NAME"
              (replace-regexp-in-string " " "_" (nth 4 (org-heading-components)))))
           (funcall fn nil t)
           (unless export-file (org-delete-property "EXPORT_FILE_NAME"))
           (set-buffer-modified-p modifiedp)))
       "-noexport" 'region-start-level))))

이 함수는 제목 텍스트에서 공백을 "_"로 바꾸어 내보내기 파일 이름을 생성합니다. 다른 방법으로 파일 이름을 생성하려면 replace-regexp-in-stringsexp를 원하는대로 변경하십시오 .

:EXPORT_FILE_NAME:설정할 때 생성:CUSTOM_ID:

다음 조언에 따라 org-set-property설정시 자동으로 적절한 값을 :EXPORT_FILE_NAME:설정합니다 :CUSTOM_ID:.

(defadvice org-set-property (after set-export-file-name
                                   (property value) activate compile)
  (when (equal org-last-set-property "CUSTOM_ID")
    (let ((export-file-name
           (concat (org-entry-get nil "CUSTOM_ID")
                   "-"
                   (replace-regexp-in-string " " "-" (downcase (org-get-heading t t))))))
      (org-entry-put nil "EXPORT_FILE_NAME" export-file-name))))

이것은 파일 확장자를 값에 추가 :EXPORT_FILE_NAME:하지 않지만 특정 백엔드로 내보낼 때 org-mode 결과 파일에 대한 올바른 확장자를 자동으로 선택 하기 때문에 중요하지 않습니다 .


추가 정보

기존 하위 트리를 대량으로 업데이트

:EXPORT_FILE_NAME:등록 정보 를 설정해야하는 기존 하위 트리가 많이있는 경우 키보드 매크로를 사용할 수 있습니다 . 첫 번째 하위 트리에서 위치를 지정한 후 다음을 수행하십시오.

  • F3

    ... 녹화를 시작합니다.

  • C-c C-x p CUSTOM_ID RET RET

    ... 이맥스를 :EXPORT_FILE_NAME:기반으로 설정 합니다 :CUSTOM_ID:.

  • C-c C-f

    ... 다음 최상위 헤드 라인으로 이동합니다.

  • F4

    ... 녹음을 중지합니다.

다음 하위 트리에 대해 매크로를 반복하려면을 누르십시오 F4. 나머지 모든 하위 트리에 대해 매크로를 반복하려면 M-0 F4(0)을 누릅니다 .

향후 세션을위한 매크로 저장

기본적으로 키보드 매크로는 세션간에 저장되지 않습니다. 나중에 사용할 수 있도록 매크로를 init 파일에 저장하려면 다음과 같이하십시오.

  1. 매크로 이름을 지정하십시오.

    M-x name-last-kbd-macro RET org-set-export-file-name RET

  2. init 파일을 찾아서 매크로를 삽입하려는 지점으로 이동하십시오.

  3. 매크로를 삽입하십시오.

    M-x insert-kbd-macro RET org-set-export-file-name RET

    Emacs는 다음 코드를 삽입합니다.

    (fset 'org-set-export-file-name
       "\C-c\C-xpCUSTOM_ID\C-m\C-m\C-c\C-f")

    충분히 곁눈질 fset하면 매크로를 기록 할 때 누른 일련의 키가 포함 된 두 번째 인수를 볼 수 있습니다 :)

  4. (선택 사항) 최상의 결과를 얻으려면 org-set-export-file-name키 에 바인딩 할 수 있습니다 .

    (define-key org-mode-map (kbd "<f6>") 'org-set-export-file-name)
  5. 저장.


1
좋은. 프로그래밍 방식 으로 각 제목에 대해 :EXPORT_FILE_NAME:속성을 설정하는 방법에 대한 힌트를 줄 수 :CUSTOM_ID:+heading-title-lowercased있습니까?
gsl

1
@gsl 설정시 속성 org-set-property을 자동으로 생성 하도록 조언 :EXPORT_FILE_NAME:할 수 있습니다 :CUSTOM_ID:.
itsjeyd

1
충고 해 주셔서 감사합니다! 나는 유창 elisp하지는 않지만 시도 할 것이다. 각 제목의 제목을 캡처하고 공백으로 대시를 대체하고 소문자를 넣고 위생 처리 된 문자열을 추가 :CUSTOM_ID:하고 마지막으로 조직 속성을 설정하는 방법을 찾아야 합니다.
gsl

1
@gsl 당신이 설정할 때 defadvice자동으로 설정 :EXPORT_FILE_NAME:되는 대답 에 a 를 추가했습니다 . <custom-id>-<heading>:CUSTOM_ID:
itsjeyd

1
너무 감사합니다, 나는 당신의 코드를 많이 배웠습니다. s가 설정된 org-mode파일 이 이미 있다면 CUSTOM_ID"EXPORT_FILE_NAME"을 설정하는 코드를 어떻게 실행할 수 있습니까? 새로운 삽입이 없습니다. defadvice작동하지 않을 것 같아요 ? 모든 최상위 제목을 통과하고 코드를 적용하는 반복 기능이 있습니까?
gsl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.