218 lines
6.8 KiB
Org Mode
218 lines
6.8 KiB
Org Mode
#+title: The Library of Babel
|
|
#+author: Org-mode People
|
|
#+STARTUP: odd hideblocks
|
|
|
|
* Introduction
|
|
The Library of Babel is an extensible collection of ready-made and
|
|
easily-shortcut-callable source-code blocks for handling common
|
|
tasks. Org-babel comes pre-populated with the source-code blocks
|
|
located in this file. It is possible to add source-code blocks from
|
|
any org-mode file to the library by calling =(org-babel-lob-ingest
|
|
"path/to/file.org")=.
|
|
|
|
This file is included in worg mainly less for viewing through the
|
|
web interface, and more for contribution through the worg git
|
|
repository. If you have code snippets that you think others may
|
|
find useful please add them to this file and [[file:~/src/worg/worg-git.org::contribute-to-worg][contribute them]] to
|
|
worg.
|
|
|
|
The raw Org-mode text of this file can be downloaded at
|
|
[[repofile:contrib/babel/library-of-babel.org][library-of-babel.org]]
|
|
|
|
* Simple
|
|
A collection of simple utility functions
|
|
|
|
#+srcname: echo
|
|
#+begin_src emacs-lisp :var input="echo'd"
|
|
input
|
|
#+end_src
|
|
|
|
* File I/O
|
|
** reading and writing files
|
|
Read the contents of the file at =path= into a string.
|
|
#+srcname: read
|
|
#+begin_src emacs-lisp :var path=""
|
|
(with-temp-filebuffer path
|
|
(buffer-substring (point-min) (point-max)))
|
|
#+end_src
|
|
|
|
Read the lines of the file at =path= into a list.
|
|
#+srcname: read-lines
|
|
#+begin_src emacs-lisp :var path=""
|
|
(split-string
|
|
(with-temp-filebuffer path
|
|
(buffer-substring (point-min) (point-max))))
|
|
#+end_src
|
|
|
|
Write =data= to a file at =path=. If =data= is a list, then write it
|
|
as a table in traditional Org-mode table syntax.
|
|
#+srcname: write
|
|
#+begin_src emacs-lisp :var data="" :var path=""
|
|
(with-temp-file path
|
|
(org-babel-insert-result data))
|
|
nil
|
|
#+end_src
|
|
|
|
** remote files
|
|
|
|
Read local or remote file in [[http://www.json.org/][json]] format into emacs-lisp objects.
|
|
#+srcname: json
|
|
#+begin_src emacs-lisp :var file='() :var url='()
|
|
(require 'json)
|
|
(cond
|
|
(file
|
|
(with-temp-filebuffer file
|
|
(goto-char (point-min))
|
|
(json-read)))
|
|
(url
|
|
(require 'w3m)
|
|
(with-temp-buffer
|
|
(w3m-retrieve url)
|
|
(goto-char (point-min))
|
|
(json-read))))
|
|
#+end_src
|
|
|
|
* Plotting code
|
|
|
|
** R
|
|
Plot column 2 (y axis) against column 1 (x axis). Columns 3 and beyond, if present, are ignored.
|
|
|
|
#+srcname: R-plot(data=R-plot-example-data)
|
|
#+begin_src R :session *R*
|
|
plot(data)
|
|
#+end_src
|
|
|
|
#+tblname: R-plot-example-data
|
|
| 1 | 2 |
|
|
| 2 | 4 |
|
|
| 3 | 9 |
|
|
| 4 | 16 |
|
|
| 5 | 25 |
|
|
|
|
#+lob: R-plot(data=R-plot-example-data)
|
|
|
|
#+resname: R-plot(data=R-plot-example-data)
|
|
: nil
|
|
|
|
** Gnuplot
|
|
|
|
* Tables
|
|
** LaTeX Table export
|
|
*** booktabs
|
|
This block can be used to wrap a table in the latex =booktabs=
|
|
environment, it takes the following arguments -- all but the first two
|
|
are optional.
|
|
| arg | description |
|
|
|-------+--------------------------------------------|
|
|
| table | a reference to the table |
|
|
| align | optional alignment string |
|
|
| env | optional environment, default to "tabular" |
|
|
| width | optional width specification string |
|
|
|
|
#+srcname: booktabs
|
|
#+begin_src emacs-lisp :var table='((:head) hline (:body)) :var align='() :var env="tabular" :var width='() :noweb yes :results latex
|
|
(flet ((to-tab (tab)
|
|
(orgtbl-to-generic
|
|
(mapcar (lambda (lis)
|
|
(if (listp lis)
|
|
(mapcar (lambda (el)
|
|
(if (stringp el)
|
|
el
|
|
(format "%S" el))) lis)
|
|
lis)) tab)
|
|
(list :lend " \\\\" :sep " & " :hline "\\hline"))))
|
|
(org-fill-template
|
|
"
|
|
\\begin{%env}%width%align
|
|
\\toprule
|
|
%table
|
|
\\bottomrule
|
|
\\end{%env}\n"
|
|
(list
|
|
(cons "env" (or env "table"))
|
|
(cons "width" (if width (format "{%s}" width) ""))
|
|
(cons "align" (if align (format "{%s}" align) ""))
|
|
(cons "table"
|
|
;; only use \midrule if it looks like there are column headers
|
|
(if (equal 'hline (second table))
|
|
(concat (to-tab (list (first table)))
|
|
"\n\\midrule\n"
|
|
(to-tab (cddr table)))
|
|
(to-tab table))))))
|
|
#+end_src
|
|
|
|
*** longtable
|
|
This block can be used to wrap a table in the latex =longtable=
|
|
environment, it takes the following arguments -- all but the first two
|
|
are optional.
|
|
| arg | description |
|
|
|-----------+-------------------------------------------------------------|
|
|
| table | a reference to the table |
|
|
| align | optional alignment string |
|
|
| width | optional width specification string |
|
|
| hline | the string to use as hline separator, defaults to "\\hline" |
|
|
| head | optional "head" string |
|
|
| firsthead | optional "firsthead" string |
|
|
| foot | optional "foot" string |
|
|
| lastfoot | optional "lastfoot" string |
|
|
|
|
#+srcname: longtable
|
|
#+begin_src emacs-lisp :var table='((:table)) :var align='() :var width='() :var hline="\\hline" :var firsthead='() :var head='() :var foot='() :var lastfoot='() :noweb yes :results latex
|
|
(org-fill-template
|
|
"
|
|
\\begin{longtable}%width%align
|
|
%firsthead
|
|
%head
|
|
%foot
|
|
%lastfoot
|
|
|
|
%table
|
|
\\end{longtable}\n"
|
|
(list
|
|
(cons "width" (if width (format "{%s}" width) ""))
|
|
(cons "align" (if align (format "{%s}" align) ""))
|
|
(cons "firsthead" (if firsthead (concat firsthead "\n\\endfirsthead\n") ""))
|
|
(cons "head" (if head (concat head "\n\\endhead\n") ""))
|
|
(cons "foot" (if foot (concat foot "\n\\endfoot\n") ""))
|
|
(cons "lastfoot" (if lastfoot (concat lastfoot "\n\\endlastfoot\n") ""))
|
|
(cons "table" (orgtbl-to-generic
|
|
(mapcar (lambda (lis)
|
|
(if (listp lis)
|
|
(mapcar (lambda (el)
|
|
(if (stringp el)
|
|
el
|
|
(format "%S" el))) lis)
|
|
lis)) table)
|
|
(list :lend " \\\\" :sep " & " :hline hline)))))
|
|
#+end_src
|
|
|
|
** Elegant lisp for transposing a matrix.
|
|
|
|
#+tblname: transpose-example
|
|
| 1 | 2 | 3 |
|
|
| 4 | 5 | 6 |
|
|
|
|
#+srcname: transpose
|
|
#+begin_src emacs-lisp :var table=transpose-example
|
|
(apply #'mapcar* #'list table)
|
|
#+end_src
|
|
|
|
#+resname:
|
|
| 1 | 4 |
|
|
| 2 | 5 |
|
|
| 3 | 6 |
|
|
|
|
* Misc
|
|
#+srcname: python-identity(a=1)
|
|
#+begin_src python
|
|
a
|
|
#+end_src
|
|
|
|
#+srcname: python-add(a=1, b=2)
|
|
#+begin_src python
|
|
a + b
|
|
#+end_src
|
|
|
|
|
|
|