본문 바로가기

Org Mode 문서에 외부 이미지 넣기

기술적인 이야기/이맥스 2020. 1. 14.
반응형

Org Mode 문서에 이미지를 넣기 위해서는 단순히 이미지 파일을 준비해놓고 아래처럼 링크 문법으로 이미지 파일의 경로를 적어주면 됩니다.

[[./foo/bar/image.png]]

하지만 외부 이미지, 즉 다른 사이트에 있는 이미지를 문서에 첨부하려는 경우는 좀 다릅니다. 예를 들어 아래의 경우를 봅시다.

[[https://foo.bar/img/image.png]]

위 링크는 과연 이미지가 나올까요? 아니면 링크가 걸릴까요? 물론 평범하게 URL 링크가 걸리게 됩니다. 따라서 당연하게도 익스포트 한 결과물에는 이미지가 나오지 않지요.

자 그러면 이 문제를 어떻게 해결하면 좋을까요?

커스텀 링크

Org Mode에는 친절하게도 org-add-link-type 함수를 이용해 커스텀 링크를 추가하는 방법을 제공합니다. 사용 방법에 대한 자세한 설명을 하기엔 저도 지식이 좀 부족하니 일단 우리가 원하는 바를 다짜고짜 코드로 살펴보겠습니다.

(defun org-custom-link-img-follow (path)
  (org-link-open-from-string path))

(defun org-custom-link-img-export (path desc format)
  (cond
   ((eq format 'html)
    (format "<img src=\"%s\" alt=\"%s\"/>" path desc))))

(org-add-link-type "img" 'org-custom-link-img-follow 'org-custom-link-img-export)

이 코드를 실행시킨 후 Org 문서에 아래와 같은 문법으로 코드를 작성하면 외부 사이트의 이미지를 문서에 넣을 수 있게 됩니다.

[[img:https://foo.bar/img/image.png]]

코드 자체의 가독성도 그다지 나쁘지는 않은 것 같습니다. 하여간 익스포트를 하게 되면 적절하게 이미지가 표시됩니다.

티스토리에 올린 이미지를 Org Mode 문서로 첨부해서 깃헙 페이지에 익스포트한 결과

약간의 설명

org-add-link-type 함수의 첫 번째 인자는 FOLLOW 함수를 지정하는데 Org Mode에서 입력한 링크에서 엔터를 누를 경우 어떤 식으로 동작할지를 결정할 수 있게 합니다. 만약 이미지가 아니라 로컬 문서를 링크하고 있는 경우라면 이 FOLLOW 함수에서 file:path 와 같은 식의 값을 돌려줄 경우 일반적인 [[file:...]] 링크와 비슷하게 동작하게 됩니다.

두 번째 인자인 EXPORT 함수는 보시다시피 실제로 익스포트 될 내용을 돌려주는 함수입니다. 이 EXPORT 함수에 전달되는 두 번째 인자인 desc[[LINK NAME][DESCRIPTION]] 과 같이 링크 설명을 분리해서 적을 경우 뒷부분의 description이 여기로 전달됩니다.

주의

org-add-link-type 함수는 이름처럼 커스텀 링크 함수를 추가(add)하는 함수입니다. 만약 해당하는 함수를 수정하고 코드를 evaluate 하더라도 만약 이전에 적용된 코드가 있다면 새로 고친 코드는 제대로 적용이 안 되게 됩니다. 따라서 해당 커스텀 링크 함수를 개발하는 도중에는 귀찮지만 수정할 때마다 이맥스를 재시동하는 편이 좀 더 정확한 결과를 얻을 수 있습니다.

728x90
반응형

댓글