在Org Mode中插入和使用图片

源起

在使用orgmode作为任务管理的工具之后,逐渐开始膨胀,关键是文本折叠和缩进的功能实在太好用,导致想让orgmode完成更多的事情。无论是用于hugo的编辑工具还是作为笔记的主力,插入图片都是绕不过去的问题。

但是由于emacs天生就是geek使用的,而geek通常都是使用linux的,因此图片的插入和显示变得异常困难。

orgmode原有一个inline image显示。另外还有一个iimage mode。本文主要讲inline image display。

测试是否可以显示图片

可以运行 (print image-library-alist) 默认在scratch buffer中输入这条命令,然后再 C-j 即可运行这条elisp代码。如碰到无法执行的情况,此时另一种方法是eshell中运行, M-x eshell 后,运行再回车,会显示如下结果:

(print image-library-alist)
((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll")
 (png "libpng16.dll" "libpng16-16.dll")
 (tiff "libtiff-5.dll" "libtiff3.dll" "libtiff.dll")
 (jpeg "libjpeg-8.dll")
 (gif "libgif-7.dll")
 (svg "librsvg-2-2.dll")
 (gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
 (glib "libglib-2.0-0.dll")
 (gobject "libgobject-2.0-0.dll")
 (gnutls "libgnutls-30.dll")
 (libxml2 "libxml2-2.dll" "libxml2.dll")
 (zlib "zlib1.dll" "libz-1.dll")
 (lcms2 "liblcms2-2.dll"))

上述会显示出支持图片的类型

也可以运行命令: (image-type-available-p 'jpeg) 来判断是否支持显示jpeg文件,如返回 t 则表示支持,如返回 nil 则表示不支持,参考:https://kelvinh.github.io/blog/2013/03/26/emacs-image-support-on-windows/

如果缺省dll,则需要下载后拷贝到bin文件夹,重启emacs后生效。

另外,如果是全新安装,或正好遇到升级,在下载emacs程序的时候,请选择从“main GNU ftp server”下载,这个链接中的安装包种类更全。找到windows的下载链接后,同一版本的emacs通常会有几个链接,不要选择带“no-deps”字样的,尽管体积可以小100多M(一半)。这样下载的emacs应该默认支持全部图片格式了。

插入图片

本地图片

先列出几种方式,假设在这个org文件同目录下有一个01.jpg。

[[file:01.jpg]]
[[./01.jpg]]

上述两种形式显示的内容是相同的。

当然也可以以链接的形式。

[[file:01.jpg][图片显示1]]
[[./01.jpg][图片显示2]]

我因为是使用hugo来生成图片,也就是你看到的这个网页,显示名称如:“图片显示1”,在生成时将这个图片的title和alt都设为显示图片

外链图片

和本地图片格式基本相同,只是把图片文件路径改为url。

外链示例1

[[http://wx3.sinaimg.cn/mw690/6ee6203cgy1ft3wp3ogijj20d60bljs0.jpg][外链图片示例]]

图片显示

外链示例2

http://wx3.sinaimg.cn/mw690/6ee6203cgy1ft3wp3ogijj20d60bljs0.jpg]]

在上述的两种形式中,如果使用org mode的htmlize的导出时,第一种仅保留链接,第两种以图片形式展示。

详细外链示例

#+CAPTION: A black cat stalking a spider

#+ATTR_HTML: :alt cat/spider image :title Action!

#+ATTR_HTML: :width 100px

cat/spider image
Action!

显示图片

参考:Org-mode进行文学编程的最佳配置

你可能会奇怪,即使按照上面的做了,但是图片还是没有显示,只是显示了链接,因为切换到显示inline image,快捷键是 C-c C-x C-v

不过外链图片默认是无法在emacs中显示的(通过修改配置文件也是可以实现的),生成html后是会显示的。

如果需要全局开启inline image display需要在配置中加入:

;; Enable inline image when entering org-mode

;; Make sure you have all the necessary DLL for image display

;; Windows ones can be downloaded from: https://sourceforge.net/projects/ezwinports/files/

(defun turn-on-org-show-all-inline-images ()
  (org-display-inline-images t t))

(add-hook 'org-mode-hook 'turn-on-org-show-all-inline-images)

其它

插入图片之后,无法直接导出html,运行 C-c C-e h h 后提示: Please install htmlize from https://github.com/hniksic/emacs-htmlize 。 在这种情况下,需要到melpha中下载htmlize插件。

海上一民工

Related