orgmode文档直接knitr输出HTML或PDF
2015-10-23 19:10
711 查看
做为R用户中的Emacs/orgmode粉,如果能一步将org文件导出为HTML或pdf文件,感觉会很爽。下面方法可能不是最简,但应该还有用。
插件文件放在
Chasberry/github 上。但作者是个狂热的orgmode粉,他没有直接给出 ox-ravel.el 文件,而是放到了
ox-ravel.org 文件中。如果不使用Emacs或者不使用orgmode,你是很难看到 ox-ravel.el 的。而对orgmode使用者就很简单,打开文件后用一个C-c C-v t 键盘命令就在当前目录下得到ox-ravel.el 。
把这个文件移到合适位置,设置Emacs配置文件导入插件。它是做为orgmode的补充插件使用的:
上面设置的 exports,tangel,eval 等代码块属性是orgmode原有的,但更重要的是 ox-ravel 插件提供了ravel 属性:
ravel属性设置的内容会原封不动地传递到目标文件的相应代码块。如果输出的是Rhtml文件,上面的代码块会转成下面的样子:
如果转成Rmd文件,它就是这样:
第一步是编写Rhtml/Rnw/Rmd的导出函数,以Rhtml为例,可以这样:
本人Elisp水平有限,上面函数是仿照org的 org-html-export-to-html 函数写的。
第二步,编写函数调用knitr把Rhtml/Rnw/Rmd转成HTML/pdf文件。还是照猫画虎,改编一个:
上面的函数在把Rhtml文件knit后就把它当临时文件删除了,想保留就去掉 unlink 语句。
第三步就很容易了,为上面定义的函数绑定键盘快捷键就可以了:
这里绑定的是 C-c C-v h 按键,可另选。
ESS是必需的,如果你正在寻求一步法将含R代码的org文件输出为HTML/pdf文件,这当然不用提醒了。
作者: ZGUANG@LZU
Created: 2015-10-23 五 19:07
Emacs 24.4.1 (Org mode 8.2.10)
1 ox-ravel.el
对于习惯使用Emacs编辑R代码文档的人来说,这是一个非常有用的插件,它填补了orgmode文件到knitr文件间的空白,作用是把orgmode类型文件转成Rhtml、Rnw或Rmd文件。插件文件放在
Chasberry/github 上。但作者是个狂热的orgmode粉,他没有直接给出 ox-ravel.el 文件,而是放到了
ox-ravel.org 文件中。如果不使用Emacs或者不使用orgmode,你是很难看到 ox-ravel.el 的。而对orgmode使用者就很简单,打开文件后用一个C-c C-v t 键盘命令就在当前目录下得到ox-ravel.el 。
把这个文件移到合适位置,设置Emacs配置文件导入插件。它是做为orgmode的补充插件使用的:
(require 'org) (add-to-list 'load-path "~/path/to/ox-ravel") (require 'ox-ravel)
2 在文档中插入R代码块
使用orgmode通用的代码块模式,即:#+BEGIN_SRC R :exports code :tangle no :eval never #+END_SRC
上面设置的 exports,tangel,eval 等代码块属性是orgmode原有的,但更重要的是 ox-ravel 插件提供了ravel 属性:
#+BEGIN_SRC R :exports code :tangle yes :eval no-export :ravel block1 echo=-1 set.seed(100) sample(100, 10) #+END_SRC
ravel属性设置的内容会原封不动地传递到目标文件的相应代码块。如果输出的是Rhtml文件,上面的代码块会转成下面的样子:
<!--begin.rcode block1 echo=-1 set.seed(100) sample(100, 10) end.rcode-->
如果转成Rmd文件,它就是这样:
```{r block1 echo=-1} set.seed(100) sample(100, 10) ```
3 输出Rhtml/Rnw/Rmd文档
这是 ox-ravel.el 的功能,只要设置正确,在orgmode中使用 C-c C-e 导出文件你就会看到原来的菜单选项中多了这些文件导出类型。只要按照上面的方法插入R代码块,导出时就能得到相应类型格式的代码块。4 整合knitr
导出Rhtml/Rnw/Rmd文档后,如果要想得到最终的HTML或pdf文档,你得打开R程序,载入knitr,然后做knit。但真正的orgmode使用者不会这么做。我们希望用一个键盘命令就能从org文件得到HTML或pdf文件。这个功能ox-ravel 并没有提供,需要自己设置。第一步是编写Rhtml/Rnw/Rmd的导出函数,以Rhtml为例,可以这样:
(defun org-export-rhtml (&optional async subtreep visible-only body-only ext-plist) "Export current buffer to a Rhtml file." (interactive) (let* ((extension ".Rhtml") (file (org-export-output-file-name extension subtreep)) (org-export-coding-system org-html-coding-system)) (org-export-to-file 'html-knitr file async subtreep visible-only body-only ext-plist)) )
本人Elisp水平有限,上面函数是仿照org的 org-html-export-to-html 函数写的。
第二步,编写函数调用knitr把Rhtml/Rnw/Rmd转成HTML/pdf文件。还是照猫画虎,改编一个:
(defun knit-html () (interactive) (let* ((tmp-file (org-babel-temp-file "R-")) (rhtml (org-export-rhtml)) (body (concat "library('knitr'); knit('" rhtml "'); unlink('" rhtml "')"))) (org-babel-eval org-babel-R-command (format org-babel-R-write-object-command "TRUE" "TRUE" (format "{function ()\n{\n%s\n}}()" body) (org-babel-process-file-name tmp-file 'noquote))) (org-babel-R-process-value-result (org-babel-result-cond "silent" (with-temp-buffer (insert-file-contents tmp-file) (buffer-string)) (org-babel-import-elisp-from-file tmp-file '(16))) "TURE")))
上面的函数在把Rhtml文件knit后就把它当临时文件删除了,想保留就去掉 unlink 语句。
第三步就很容易了,为上面定义的函数绑定键盘快捷键就可以了:
(define-key org-mode-map (kbd "\C-c \C-v h") 'knit-html)
这里绑定的是 C-c C-v h 按键,可另选。
ESS是必需的,如果你正在寻求一步法将含R代码的org文件输出为HTML/pdf文件,这当然不用提醒了。
作者: ZGUANG@LZU
Created: 2015-10-23 五 19:07
Emacs 24.4.1 (Org mode 8.2.10)
相关文章推荐
- 原生和html比较
- Html 语法学习笔记三
- Html 语法学习笔记三
- Warning: DOMDocument::loadHTML() [domdocument.loadhtml]: htmlParseEntityRef: expecting ';' in Entity,
- ZH奶酪:HTML元素文本溢出显示省略号(...)
- HTML在线报名
- HTML文本编辑
- pdf转换成html网页格式的方法
- 当用curl爬取数据时,如果想截取的内容前后html都含有换行符,空格,该如何处理
- html简介
- 关于NopCommerce3.6版的@Html.Widget(“home_page_top”)的说明
- Html.ImageGetter() textview加载图片 出现[obj]的问题
- HTML学习 <2>
- HTML编码规范
- 什么是HTML
- 【转】HTML-based script和URL-based script两种脚本录制方式
- html的全局属性
- html标签的嵌套规则
- html input="file" 浏览时只显示指定文件类型 xls、xlsx、csv
- html标签属性