noweb 的用法

释名

noweb 就是 Norman Ramsey 的 WEB。

此 WEB 非彼 Web,它是文学编程工具。

Donald Knuth 说:『选择 WEB 作为名字,部分因为它是英语中很少的几个没有用于计算机的三字词语之一。但随着时间流逝,我越来越喜爱这个名字,因为我认为最好把一个复杂的软件确确实实地看成由简单材料以精巧的方式拼出来的一张网。我们通过理解复杂系统的各个简单部分和这些部分与其直接邻居的简单关系来理解复杂系统本身。如果我们用网的概念来表达程序,我们就能用一种自然且圆满地方式强调其结构上的属性。』

语法

文学编程就是将人类的语言与机器的语言交织到一起。

@ 符号是某文本行的第一个字符,那么 @ 之后的文本都是人类的语言(事实上是 TeX 语言)。

< 符号是某文本行的第一个字符,并且这个字符后面跟随 <...>>= 这样的字符,那么这些字符之后的文本都是机器的语言(程序代码)。... 是程序代码的名字。

也可以这么来理解,将 <<...>>= 视为机器语言的开始,将 @ 符号视为机器语言的终止,这两种符号之间的区域,是代码块,... 是代码块的名字。

代码块可以同名,noweb 会把同名的代码块按照它们出现的顺序连到一起。

在一个代码块中,可以使用 <<...>> 来引入其他代码块。

noweb 语法的具体示例,可参考『论文式编程』与『M4 说要有 lambda,就有了 lambda』中的示例。

程序代码的抽取

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

当在使用 `pip` 安装包时遇到 "No matching distribution found" 错误时,通常是因为在 PyPI (Python包索引) 中无法找到与您指定的包名完全匹配的可用版本。 这种情况下,您可以尝试以下几个步骤来解决问题: 1. 确认包名是否正确:请确保您输入的包名是正确的,并且大小写拼写与 PyPI 上的包名一致。有时候会因为包名错误导致找不到对应的包。 2. 更新 pip:在终端中执行 `pip install --upgrade pip` 命令,以确保您的 pip 工具是最新版本。有时旧版本的 pip 可能无法正确检索并安装某些包。 3. 检查包的名称和版本:如果您确定包名无误,但仍然找不到匹配的分发版本,可能是因为该包没有在 PyPI 上发布或者存在特定的版本限制。您可以查看包的官方文档或者代码仓库,了解其发布情况和支持的版本范围。 4. 使用其他源:尝试使用其他源来安装包,例如使用清华大学开源软件镜像站提供的镜像源或者使用其他第三方源。您可以使用 `pip install -i <镜像源地址> <包名>` 的方式指定使用特定的源进行安装。 5. 手动安装:如果以上步骤都没有解决问题,您可以尝试手动下载包的源码,并使用 `pip install` 命令进行本地安装。您可以从包的官方网站或者代码仓库中获取源码。 请注意,这些解决方法并不能保证一定能够解决问题,因为某些包可能确实不在 PyPI 上可用或者存在其他限制。如果问题仍然存在,您可以尝试联系包的开发者或者寻求其他替代方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值