1 #+OPTIONS: H:3 num:nil toc:2 \n:nil @:t ::t |:t ^:{} -:t f:t *:t TeX:t LaTeX:t skip:nil d:(HIDE) tags:not-in-toc
2 #+STARTUP: align fold nodlcheck hidestars oddeven lognotestate hideblocks
3 #+SEQ_TODO: TODO(t) INPROGRESS(i) WAITING(w@) | DONE(d) CANCELED(c@)
4 #+TAGS: Write(w) Update(u) Fix(f) Check(c)
6 #+AUTHOR: Dan Davison, Eric Schulte
7 #+EMAIL: davison at stats dot ox dot ac dot uk
13 <p>executable source code blocks in org-mode</p>
17 <img src="images/tower-of-babel.png" alt="images/tower-of-babel.png"
18 title="And the Lord said, Behold, the people is one, and they have all one language; and this they begin to do; and now nothing will be restrained from them, which they have imagined to do. Genesis 11:1-9"/>
21 <a href="http://www.flickr.com/photos/23379658@N05/" title=""><b>Martijn Streefkerk</b></a>
34 :CUSTOM_ID: introduction
36 Org-babel is an extension to the very excellent [[http://orgmode.org/][Org-mode]]; an [[http://www.gnu.org/software/emacs/][Emacs]]
37 major mode for doing almost anything with plain text. If you are
38 not familiar with Org-mode please take a moment to read [[http://orgmode.org/][the Org-mode
39 homepage]] before continuing.
41 Org-babel provides the following modifications to [[http://orgmode.org/manual/Literal-examples.html][the existing
42 support]] for blocks of source code examples in the org-mode core.
44 1. Interactive source code execution
45 2. Arguments to source code blocks
46 3. Exportation of source code blocks to files (literate programming)
50 :CUSTOM_ID: getting-started
53 1) Grab the latest code from the git repo at [[http://github.com/eschulte/org-babel/tree/master][github/org-babel]]
55 git clone git://github.com/eschulte/org-babel.git
58 2) Add the following lines to your .emacs, replacing the path as
59 appropriate. A good place to check that things are up and running
60 would the examples in [[* Basic org-babel functionality][Basic org-babel functionality]].
61 #+begin_src emacs-lisp
62 (add-to-list 'load-path "/path/to/org-babel/lisp")
63 (require 'org-babel-init)
66 3) Finally, activate the subset of supported Org-babel languages
67 which you want to be able to execute on your system. As an
68 example, the following activates python, ruby and R. For a full
69 list of languages and notes on their dependencies see the
70 [[#reference-and-documentation][Reference / Documentation]] section below.
71 #+begin_src emacs-lisp
72 (require 'org-babel-python)
73 (require 'org-babel-ruby)
74 (require 'org-babel-R)
76 ;; Once you've activated languages, load the library of babel to
77 ;; make pre-built helper functions available in the languages you will be using.
78 (org-babel-load-library-of-babel)
81 * Basic org-babel functionality
83 :CUSTOM_ID: basic-functionality
85 *** Source code blocks
87 :CUSTOM_ID: source-code-blocks
90 Org-babel is all about *source code blocks* in org mode. These are
91 blocks of code (in whatever language), surrounded by special
92 starting and ending lines. For example, the following is a source
93 block containing [[http://www.ruby-lang.org/][ruby]] code:
96 : "This file was last evaluated on #{Date.today}"
99 If you are unfamiliar with the notion of source code blocks in
100 org-mode, please have a look at the [[http://orgmode.org/manual/Literal-examples.html][relevant manual section]] before
103 Note that above is what the source block looks like in the org-mode
104 file. We had to take [[http://orgmode.org/manual/Literal-examples.html#Literal-examples][special steps]] to make it look that way in the
105 HTML output. Normally, when exported to HTML, source blocks are
106 fontified according to their language, and the begin_src...end_src
107 mark-up is omitted, like this:
110 "This file was last evaluated on #{Date.today}"
113 From now on, if you are viewing the HTML version, you will see the
114 HTML output only. However, much of this document consists of
115 interactive examples, and therefore in order to get a feeling for the
116 mechanics of Org-babel it might make most sense to grab the plain text
118 #+HTML: <a href="org-babel-worg.org">org-babel-worg.org</a>
119 and work through it in Emacs. Alternatively the htmlized
120 version of the plain text of this file at
121 #+HTML: <a href="org-babel-worg.org.html">org-babel-worg.html</a>
122 allows the plain text version to be viewed (non-interactively) in a web browser.
123 *** Source code execution
125 :CUSTOM_ID: source-code-execution
127 For interpreted languages such as shell, python, R, etc, org-babel
128 allows source blocks to be executed: the code is passed to the
129 interpreter and you have control over what is done with the results of
130 excecution. E.g. place point anywhere in the following blocks and use
131 =C-c C-c= to run the code[fn:1]. In each case the code comes first,
132 followed by the results of evlauting the block.
136 "This file was last evaluated on #{Date.today}"
140 : This file was last evaluated on 2009-08-09
142 **** [[http://www.r-project.org/][R]]
143 #+begin_src R :results value
144 matrix(rnorm(6), nrow=2)
148 | 0.496600061063252 | "-1.44355317891110" | 0.106411785870013 |
149 | "-1.81619611674921" | "-1.25542979009380" | 0.00969467528507845 |
151 **** [[http://ditaa.sourceforge.net/][ditaa]]
152 #+begin_src ditaa :file images/blue.png :cmdline -r
163 [[file:images/blue.png]]
165 *** New source block syntax
166 Org-babel adds some new syntactical elements to source blocks in
167 org-mode, illustrated here:
169 : #+srcname: source-block-name(arg1=value1, arg2=value2)
170 : #+begin_src language :var1 var1-value :var2 var2-value ...
176 Note the following two new features
177 **** =srcname= with optional arguments
178 The optional =srcname= line allows a name to be given to the
179 source block, together with any arguments to the source block
180 (see [[#arguments-to-source-code-blocks][below]])
181 **** Header arguments
182 An arbitrary series of :variable value pairs can be specified
183 after the language, controlling various aspects of org-babel
184 operation. The available header arguments are documented [[#header-arguments][below.]]
185 *** What happens to the results?
189 Org-babel provides two fundamentally different modes for capturing
190 the results of code evaluation, specified by the =:results= header
192 **** =:results value= (functional mode)
193 This means that the 'result' of code evaluation is defined to be
194 the *value* of the last statement in the block. Thus with this
195 setting, one can view the code block as a function with a return
196 value. And not only can you view it that way, but you can
197 actually use the return value of one source block as input for
198 another (see later). This setting is the default.
200 As an example, consider the following block of python code and its
203 #+begin_src python :results value
205 print("Hello, today's date is %s" % time.ctime())
206 print('Two plus two is')
213 Notice that in functional mode, the output consists of the value of
214 the last statement, and nothing else.
216 **** =:results output= (scripting mode)
217 With this setting, org-babel captures all the text output of the
218 code block and places it in the org buffer. One can think of this
219 as a 'scripting' mode: the code block contains a series of
220 commands, and you get the output of all the commands. Unlike in
221 the 'functional' mode, the code block has no return value. (This
222 mode will be familiar to Sweave users).
224 Now consider the result of evaluating the same source block as
225 before, but under scripting mode.
228 #+begin_src python :results output
230 print("Hello, today's date is %s" % time.ctime())
231 print('Two plus two is')
236 : Hello, today's date is Fri Sep 4 19:49:06 2009
239 So, we got what we asked for: all the text output by python
240 (stdout). Since we didn't print the last value (2 + 2), we didn't get
243 *** Arguments to source code blocks
245 :CUSTOM_ID: arguments-to-source-code-blocks
247 In addition to evaluation of code blocks, org-babel allows them to
248 be parameterised (i.e. have arguments). Thus source code blocks
249 now have the status of *functions*. Arguments to code blocks can
250 be used in both functional and scripting mode.
252 **** Simple example of using a source block as a function
254 First let's look at a very simple example. The following source
255 block defines an org-babel function that will square its input.
262 In the org-mode file that looks like this:
263 : #+srcname: square(x)
269 Now we use the source block:
275 #+resname: square(x=6)
278 **** A more complex example: using an org-table as input
280 In this example we're going to define a function to compute a
281 Fibonacci sequence, and we're going to make it take its input
282 from a table in the org-mode buffer.
284 Here are the inputs for fibonacci-seq:
286 #+tblname: fibonacci-inputs
287 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
288 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
290 in the Org-mode buffer this looks like
291 : #+tblname: fibonacci-inputs
292 : | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
293 : | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
295 [[http://www.gnu.org/software/emacs/manual/elisp.html][Emacs Lisp]] source code
296 #+srcname: fibonacci-seq(fib-inputs=fibonacci-inputs)
297 #+begin_src emacs-lisp
299 (if (or (= n 0) (= n 1))
301 (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
303 (mapcar (lambda (row)
304 (mapcar #'fibonacci row)) fib-inputs)
307 in the Org-mode buffer this looks like
308 : #+srcname: fibonacci-seq(fib-inputs=fibonacci-inputs)
309 : #+begin_src emacs-lisp
310 : (defun fibonacci (n)
311 : (if (or (= n 0) (= n 1))
313 : (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
315 : (mapcar (lambda (row)
316 : (mapcar #'fibonacci row)) fib-inputs)
319 Results of Emacs Lisp code evaluation
321 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 |
322 | 1 | 3 | 8 | 21 | 55 | 144 | 377 | 987 | 2584 | 6765 |
324 * A meta-programming language for org-mode
326 :CUSTOM_ID: meta-programming-language
329 Since information can pass freely between source-code blocks and
330 org-mode tables you can mix and match languages using each language
331 for those tasks to which it is suited. This makes Org-mode files with
332 Org-babel into a kind of meta-functional programming language in which
333 functions from many languages can work together.
335 As an example, lets take some system diagnostics in the shell, and
336 then graph them with R.
339 #+srcname: directories
340 #+begin_src bash :results replace
341 cd ~ && du -sc * |grep -v total
343 2. Results of the shell source code (on my system, grab this org-mode
344 files and try running it on your own)
345 #+resname: directories
347 | 12156104 | "Documents" |
348 | 3482440 | "Downloads" |
349 | 2901720 | "Library" |
351 | 16548024 | "Music" |
353 | 7649472 | "Pictures" |
361 3. R source code (which calls the previous shell source code)
362 #+srcname: directory-pie
363 #+begin_src R :var dirs = directories :session R-pie-example
364 pie(dirs[,1], labels = dirs[,2])
366 4. Results of R code [[file:images/dirs.png]]
368 * Spreadsheet plugins for org-mode in any language
370 :CUSTOM_ID: spreadsheet
373 *NOTE*: Maybe in-addition-to/in-stead-of this example we should do a
374 more traditional "spreadsheet" example with R [Eric]
376 Not only can Org-babel pass entire tables of data to source code
377 blocks (see [[arguments-to-source-code-blocks]]), Org-babel can also be
378 used to call source code blocks from *within* tables using the
379 Org-mode's [[http://orgmode.org/manual/The-spreadsheet.html#The-spreadsheet][existing spreadsheet functionality]].
381 In fact the functional test suite for Org-babel is implemented as a
382 large Org-mode table. To run the entire test suite you simple
383 evaluate the table =C-u C-c C-c=, and all of the tests are run
384 updating the table with pass/fail statistics.
386 Here's a sample of our test suite.
388 #+TBLNAME: org-babel-tests
389 | functionality | block | arg | expected | results | pass |
390 |------------------+--------------+-----+-------------+-------------+------|
391 | basic evaluation | | | | | pass |
392 |------------------+--------------+-----+-------------+-------------+------|
393 | emacs lisp | basic-elisp | 2 | 4 | 4 | pass |
394 | shell | basic-shell | | 6 | 6 | pass |
395 | ruby | basic-ruby | | org-babel | org-babel | pass |
396 | python | basic-python | | hello world | hello world | pass |
397 | R | basic-R | | 13 | 13 | pass |
398 #+TBLFM: $5='(if (= (length $3) 1) (progn (message (format "running %S" '(sbe $2 (n $3)))) (sbe $2 (n $3))) (sbe $2))::$6='(if (string= $4 $5) "pass" (format "expected %S but was %S" $4 $5))
399 #+TBLFM: $5=""::$6=""
401 *** code blocks for tests
403 #+srcname: basic-elisp
404 #+begin_src emacs-lisp :var n=7
408 #+srcname: basic-shell
409 #+begin_src sh :results silent
413 #+srcname: date-simple
414 #+begin_src sh :results silent
418 #+srcname: basic-ruby
419 #+begin_src ruby :results silent
423 #+srcname: basic-python
424 #+begin_src python :results silent
429 #+begin_src R :results silent
436 :CUSTOM_ID: library-of-babel
438 What about those source code blocks which are so useful you want to
439 have them available in every org-mode buffer?
441 The [[file:library-of-babel.org][Library of Babel]] is an extensible collection of ready-made and
442 easily-shortcut-callable source-code blocks for handling common
443 tasks. Org-babel comes pre-populated with the source-code blocks
444 located in the [[file:library-of-babel.org][library-of-babel.org]] file. It is possible to add
445 source-code blocks from any org-mode file to the library by calling
447 #+srcname: add-file-to-lob
448 #+begin_src emacs-lisp
449 (org-babel-lob-ingest "path/to/file.org")
452 * Reproducible Research
454 :CUSTOM_ID: reproducable-research
457 An article about computational science in a scientific publication is
458 not the scholarship itself, it is merely advertising of the
459 scholarship. The actual scholarship is the complete software
460 development environment and the complete set of instructions which
461 generated the figures.
466 [[http://reproducibleresearch.net/index.php/Main_Page][Reproducible Research]] (RR) is the practice of distributing along with
467 an article of research all data, code, and tools required to reproduce
468 the results discussed in the paper. As such the paper becomes not
469 only a document describing the research but a complete laboratory
470 reproducing the research.
472 Org-mode already has exceptional support for [[http://orgmode.org/manual/Exporting.html#Exporting][exporting to html and
473 LaTeX]]. Org-babel makes Org-mode a tool for RR by *activating* the
474 data and source code embedded into Org-mode documents making the
475 entire document executable. This makes it not only possible, but
476 natural to distribute research in a format that encourages readers to
477 recreate your results, and perform their own analysis.
479 Existing RR tools like [[http://en.wikipedia.org/wiki/Sweave][Sweave]] provide for the embedding of [[http://www.r-project.org/][R]] code into
480 LaTeX documents. While this is very useful, such documents often
481 still require a large degree of "glue code" in the form of external
482 shell scripts, python scripts, and Makefiles. To our knowledge
483 Org-babel is the only RR tool which allows multiple languages and data
484 to coexist and cooperate inside of a single document.
486 * Literate programming
488 :CUSTOM_ID: literate-programming
492 Let us change our traditional attitude to the construction of
493 programs: Instead of imagining that our main task is to instruct a
494 /computer/ what to do, let us concentrate rather on explaining to
495 /human beings/ what we want a computer to do.
497 The practitioner of literate programming can be regarded as an
498 essayist, whose main concern is with exposition and excellence of
499 style. Such an author, with thesaurus in hand, chooses the names of
500 variables carefully and explains what each variable means. He or she
501 strives for a program that is comprehensible because its concepts have
502 been introduced in an order that is best for human understanding,
503 using a mixture of formal and informal methods that reinforce each
509 Org-babel supports [[http://en.wikipedia.org/wiki/Literate_programming][Literate Programming]] (LP) by allowing the act of
510 programming to take place inside of Org-mode documents. The Org-mode
511 file can then be exported (*woven* in LP speak) to html or LaTeX for
512 consumption by a human, and the embedded source code can be extracted
513 (*tangled* in LP speak) into structured source code files for
514 consumption by a computer.
516 To support these operations Org-babel relies on Org-mode's [[http://orgmode.org/manual/Exporting.html#Exporting][existing
517 exporting functionality]] for *weaving* of documentation, and on the
518 =org-babel-tangle= function which makes use of [[http://www.cs.tufts.edu/~nr/noweb/][Noweb]] [[reference-expansion][reference syntax]]
519 for *tangling* of code files.
521 The [[literate-programming-example][following example]] demonstrates the process of *tangling* in
524 *** Simple Literate Programming Example (Noweb syntax)
526 :CUSTOM_ID: literate-programming-example
529 Tangling functionality is controlled by the =tangle= family of
530 [[header-arguments]]. These arguments can be used to turn tangling on or
531 off (the default) on the source code block, or the outline heading
534 The following demonstrates the combination of three source code blocks
535 into a single source code file using =org-babel-tangle=.
537 The following two blocks will not be tangled by default since they
538 have no =tangle= header arguments.
540 #+srcname: hello-world-prefix
541 #+begin_src sh :exports none
542 echo "/-----------------------------------------------------------\\"
545 : #+srcname: hello-world-prefix
546 : #+begin_src sh :exports none
547 : echo "/-----------------------------------------------------------\\"
550 #+srcname: hello-world-postfix
551 #+begin_src sh :exports none
552 echo "\-----------------------------------------------------------/"
555 : #+srcname: hello-world-postfix
556 : #+begin_src sh :exports none
557 : echo "\-----------------------------------------------------------/"
561 The third block does have a =tangle= header argument indicating the
562 name of the file to which it should be written. It also has [[http://www.cs.tufts.edu/~nr/noweb/][Noweb]]
563 style references to the two previous source code blocks which will be
564 expanded during tangling to include them in the output file as well.
566 #+srcname: hello-world
567 #+begin_src sh :tangle hello :exports none
568 # <<hello-world-prefix>>
569 echo "| hello world |"
570 # <<hello-world-postfix>>
573 : #+srcname: hello-world
574 : #+begin_src sh :tangle hello :exports none
575 : # <<hello-world-prefix>>
576 : echo "| hello world |"
577 : # <<hello-world-postfix>>
580 Calling =org-babel-tangle= will result in the following being written
581 to the =hello.sh= file.
583 #+srcname: hello-world-output
586 # generated by org-babel-tangle
588 # [[file:~/src/org-babel/org-babel-worg.org::#literate-programming-example][block-16]]
589 # <<hello-world-prefix>>
590 echo "/-----------------------------------------------------------\\"
592 echo "| hello world |"
593 # <<hello-world-postfix>>
594 echo "\-----------------------------------------------------------/"
598 *** Emacs Initialization with Org-babel
599 Org-babel has special support for embedding your emacs initialization
600 into Org-mode files. The =org-babel-load-file= function can be used
601 to load the emacs lisp embedded in a literate Org-mode file in the
602 same way that you might load a regular elisp file.
604 This allows you to have all the niceness of Org-mode (folding, tags,
605 notes, html export, etc...) available in your emacs initialization.
607 To try this out either see the simple [[literate-emacs-init][Literate Emacs Initialization]]
608 example directly below, or check out the Org-babel Literate
609 Programming version of Phil Hagelberg's excellent [[http://github.com/technomancy/emacs-starter-kit/tree/master][emacs-starter-kit]]
610 available at [[http://github.com/eschulte/emacs-starter-kit/tree/master][Org-babel-emacs-starter-kit]].
612 ***** Literate Emacs Initialization
614 :CUSTOM_ID: literate-emacs-init
617 For a simple example of usage follow these 4 steps.
619 1) create a directory named =.emacs.d= in the base of your home
624 2) checkout the latest versions of Org-mode and Org-babel into the src
625 subdirectory of this new directory
630 git clone git://repo.or.cz/org-mode.git
631 git clone git://github.com/eschulte/org-babel.git
633 3) place the following in a file called =init.el= in your emacs
634 initialization directory (=~/.emacs.d=).
635 #+srcname: emacs-init
636 #+begin_src emacs-lisp
637 ;;; init.el --- Where all the magic begins
639 ;; This file loads both
640 ;; - Org-mode : http://orgmode.org/ and
641 ;; - Org-babel: http://eschulte.github.com/org-babel/
643 ;; It then loads the rest of our Emacs initialization from Emacs lisp
644 ;; embedded in literate Org-mode files.
646 ;; Load up Org Mode and Org Babel for elisp embedded in Org Mode files
647 (setq dotfiles-dir (file-name-directory (or (buffer-file-name) load-file-name)))
648 (add-to-list 'load-path (expand-file-name
649 "lisp" (expand-file-name
650 "org" (expand-file-name
651 "src" dotfiles-dir))))
652 (add-to-list 'load-path (expand-file-name
653 "lisp" (expand-file-name
654 "org-babel" (expand-file-name
655 "src" dotfiles-dir))))
656 (require 'org-babel-init)
658 ;; load up all literate org-mode files in this directory
659 (mapc #'org-babel-load-file (directory-files dotfiles-dir t "\\.org$"))
661 ;;; init.el ends here
663 4) Implement all of your emacs customizations inside of elisp
664 source-code blocks located in Org-mode files in this directory.
665 They will be loaded by emacs on startup.
667 * Reference / Documentation
669 :CUSTOM_ID: reference-and-documentation
672 The following can be added to your .emacs and used to activate
673 languages. It includes a brief list of the requirements for each
674 language. *Note*: this also serves as the list of languages
675 currently supported by Org-babel.
676 #+begin_src emacs-lisp
677 ;; Uncomment each of the following require lines if you want org-babel
678 ;; to support that language. Each language has a comment explaining
679 ;; it's dependencies. See the related files in lisp/langs for more
680 ;; detailed explanations of requirements.
681 ;; (require 'org-babel-R) ;; R and ess-mode
682 ;; (require 'org-babel-asymptote) ;; asymptote
683 ;; (require 'org-babel-css) ;; none
684 ;; (require 'org-babel-ditaa) ;; ditaa
685 ;; (require 'org-babel-dot) ;; dot
686 ;; (require 'org-babel-gnuplot) ;; gnuplot, and gnuplot-mode
687 ;; (require 'org-babel-haskell) ;; haskell, haskell-mode, inf-haskell
688 ;; (require 'org-babel-ocaml) ;; ocaml, and tuareg-mode
689 ;; (require 'org-babel-python) ;; python, and python-mode
690 ;; (require 'org-babel-ruby) ;; ruby, irb, ruby-mode, and inf-ruby
691 ;; (require 'org-babel-sass) ;; sass, sass-mode
692 ;; (require 'org-babel-sql) ;; none
695 *** Source Code block syntax
697 The basic syntax of source-code blocks is as follows:
700 : #+begin_src language header-arguments
704 - name :: This name is associated with the source-code block. This is
705 similar to the =#+TBLNAME= lines which can be used to name tables
706 in org-mode files. By referencing the srcname of a source-code
707 block it is possible to evaluate the block for other places,
708 files, or from inside tables.
709 - language :: The language of the code in the source-code block, valid
710 values must be members of `org-babel-interpreters'.
711 - header-arguments :: Header arguments control many facets of the
712 input to, evaluation of, and output of source-code blocks. See
713 the [[* Header Arguments][Header Arguments]] section for a complete review of available
715 - body :: The actual source code which will be evaluated. This can be
716 edited with `org-edit-special'.
720 :CUSTOM_ID: header-arguments
723 - results :: results arguments specify what should be done with the
724 output of source-code blocks
725 - The following options are mutually exclusive, and specify how the
726 results should be collected from the source-code block
729 - The following options are mutually exclusive and specify what type
730 of results the code block will return
731 - vector :: specifies that the results should be interpreted as a
732 multidimensional vector (even if the vector is
733 trivial), and will be inserted into the org-mode file
735 - scalar :: specifies that the results should be interpreted as a
736 scalar value, and will be inserted into the org-mode
738 - file :: specifies that the results should be interpreted as the
739 path to a file, and will be inserted into the org-mode
741 - The following options specify how the results should be inserted
742 into the org-mode file
743 - replace :: the current results replace any previously inserted
744 results from the code block
745 - silent :: rather than being inserted into the org-mode file the
746 results are echoed into the message bar
747 - exports :: exports arguments specify what should be included in html
748 or latex exports of the org-mode file
749 - code :: the body of code is included into the exported file
750 - results :: the results of evaluating the code is included in the
752 - both :: both the code and results are included in the exported
754 - none :: nothing is included in the exported file
755 - tangle :: tangle arguments specify whether or not the source-code
756 block should be included in tangled extraction of
758 - yes :: the source-code block is exported to a source-code file
759 named after the basename (name w/o extension) of the
761 - no :: (default) the source-code block is not exported to a
763 - other :: any other string passed to the =tangle= header argument
764 is interpreted as a file basename to which the block will
767 *** Noweb reference syntax
768 The [[http://www.cs.tufts.edu/~nr/noweb/][Noweb]] Literate Programming system allows named blocks of code to
769 be referenced by using a =<<code-block-name>>= syntax. When a
770 document is tangled these references are replaced with the named code.
771 An example is provided in the [[literate-programming-example]] in this