noweb 的用法

釋名

noweb 就是 Norman Ramsey 的 WEB。html

此 WEB 非彼 Web,它是文學編程工具。web

Donald Knuth 說:『選擇 WEB 做爲名字,部分由於它是英語中不多的幾個沒有用於計算機的三字詞語之一。但隨着時間流逝,我愈來愈喜好這個名字,由於我認爲最好把一個複雜的軟件確確實實地當作由簡單材料以精巧的方式拼出來的一張網。咱們經過理解複雜系統的各個簡單部分和這些部分與其直接鄰居的簡單關係來理解複雜系統自己。若是咱們用網的概念來表達程序,咱們就能用一種天然且圓滿地方式強調其結構上的屬性。』編程

語法

文學編程就是將人類的語言與機器的語言交織到一塊兒。segmentfault

@ 符號是某文本行的第一個字符,那麼 @ 以後的文本都是人類的語言(事實上是 TeX 語言)。bash

< 符號是某文本行的第一個字符,而且這個字符後面跟隨 <...>>= 這樣的字符,那麼這些字符以後的文本都是機器的語言(程序代碼)。... 是程序代碼的名字。工具

也能夠這麼來理解,將 <<...>>= 視爲機器語言的開始,將 @ 符號視爲機器語言的終止,這兩種符號之間的區域,是代碼塊,... 是代碼塊的名字。code

代碼塊能夠同名,noweb 會把同名的代碼塊按照它們出現的順序連到一塊兒。orm

在一個代碼塊中,可使用 <<...>> 來引入其餘代碼塊。htm

noweb 語法的具體示例,可參考『論文式編程』與『M4 說要有 lambda,就有了 lambda』中的示例。rem

程序代碼的抽取

noweb 程序的源文件以 .nw 爲後綴。

使用

$ notangle -Rfoo.c foo.nw > foo.c

能夠從 foo.nw 文件中抽取出程序代碼(這裏是 C 語言),將其輸出到 foo.c 文件之中。-Rfoo.c 表示從 foo.nw 中的 foo.c 處抽取代碼,這須要 foo.nw 中必須存在下面這樣的代碼塊:

<<foo.c>>=
... ... ...
... ... ...
@

程序文檔的生成

$ noweave -x foo.nw > foo.tex
$ xelatex foo
$ xelatex foo

之因此要執行兩次 xelatex 命令,是由於 foo.tex 中存在着許多交叉引用。

noweave 支持管道,所以你能夠根據本身的須要去修改 noweave 生成的文檔內容。例如,我寫了一個叫作 zhtex 的腳本,其內容以下:

#!/bin/bash

sed -e 's/\\documentclass{article}/\
\\documentclass[adobefonts]{ctexart}\
\\usepackage{amsmath}\
\\usepackage{graphicx, float}\
\\usepackage{cprotect}\
\\usepackage{booktabs}\
\\newtheorem{theorem}{定理}\
\\usepackage[top=2cm,bottom=2cm,left=2cm,right=2cm]{geometry}\n/g ; 
s/\\nwbegindocs{0}//g ; 
s/\\maketitle/\\maketitle\n\\nwbegindocs{0}/g'

我能夠將 zhtex 掛到 noweave 命令中:

$ noweave -x foo.nw | zhtex > foo.tex

也能夠生成 HTML 文檔(不支持數學公式與圖表,不過能夠在 noweave 管道中作一些 hack 來支持它們):

$ noweave -filter l2h -index -html foo.nw > foo.html

hack

要對 noweb 的管線進行 hack,可參考:https://www.cs.tufts.edu/~nr/noweb/extensibility.html

雖然 noweb 源文件主要是 TeX 格式文本,可是能夠寫轉換器,將 TeX 文本轉換成其餘的標記語言。

更詳細的指南

比本文更詳細可是內容更少(只有一頁)的 noweb 指南,見:https://www.cs.tufts.edu/~nr/noweb/onepage.ps

相關文章
相關標籤/搜索