[ Home > ソフトウェア > mcweave ]

mcweave ― 似非文芸的プログラミングのすすめ

mcweave は C のプリティ・プリンタ (整形印刷プログラム) であり、 CWEB のプロセッサである cweave をバックエンドとして使用している。 これは私自身の必要を満たすためにでっちあげたものであり、 他の人が気に入るかどうかは多分に疑問ではある。

主な特徴は:

mcweave を用いると、ソースを C コンパイラで直接コンパイルできる (CWEB のような前処理を必要としない) 形に保ったままで、 プログラムを読みやすく (読みにくいと言う人もいるが) 印刷し、 またコメントに数式や表などを入れられるようになる。

次に、mcweave による出力のイメージを示しておく:

[ Sample Image ]

環境

mcweave を使用するためには、以下の環境が必要である。

インストール

  1. mcweave をパスの通ったディレクトリ (例えば /usr/local/bin) にコピーし、 実行可能ビットをセットする。 もし Perl が /usr/bin/perl 以外であれば、 それに応じて最初の行の“#!/usr/bin/perl”を書き換える。

  2. mcwebmac.tex を TeX が見付けられる場所にコピーする。

使用方法

mcweave の実行

mcweave foo.c
foo.c をタイプセットし、 出力として texput.dvi を生成する。 この出力は通常の DVI ファイルであり、 xdvidvi2ps などで扱うことができる。

mcweave -k foo.c
foo.c をタイプセットし、 出力として texput.webtexput.textexput.dvi を含む、 いくつかの texput.* ファイルを生成する。 これは、処理 (特に TeX) の途中で 不可解なエラーが出る場合などに有用かも知れない。

mcweave -o bar.dvi foo.c
foo.c をタイプセットし、 出力として bar.dvi を生成する。

mcweave -k -o bar.tex foo.c
foo.c から、 TeX ファイル bar.tex、 及び他のいくつかの bar.* ファイルを生成する。 出力された TeX ファイルは plain TeX で処理することができる。 -k オプションを指定しなくても TeX ファイルは生成されるが、 その場合には bar.idx などのファイルが消されてしまうために bar.tex を TeX にかけられなくなる可能性がある。

mcweave -o bar.web foo.c
foo.c から、 CWEB ファイル bar.web を生成する。 出力された CWEB ファイルは、 cweave で (あるいは ctangle でも) 処理することができる。

ルール

基本的な規則は、以下のようなものです:


補足

経緯

私はかなり昔からプログラムを読みやすく出力することに関心を持っており、 何年かのあいだは自分で書いたプリティ・プリンタを使用してもいたが、 とても満足のいくものではなかった。

その後、Knuth の Literate Programming にインスパイアされ、 また実際に TeX を使える環境を手に入れることができたため、 これを用いてより良い出力を得ようと考えるのは自然なことであった。 当時は主に C を使用しており、 また TeX と同時に CWEB を入手していたので、 単に CWEB で書くようにすることもできたのではあるが、 そこまで思い切ることはできなかったため、 出力に際して cweave をバックエンドとして使用する方法を取ることにし、 そのコマンドの名前を mcweave とした。

ちなみに、mcweave の最初のバージョン (その後、現在に至るまで何の変更もせずに使用し続けている) は、1992年に sh と awk によるスクリプトとして書いた。 また、当時の cweave (Revision 1.1) には 日本語が通らないなどのいくつかの不都合があったため、 cweave にも非常に不完全なパッチ (テキスト部では日本語が使えるが、コード部では使えない) を当てて使用していた。

このスクリプトはあまりにも汚いものであり、 また CWEB Revision 1.1 の (やや不自然な) 挙動を制御するために 出力に奇妙な指示を挿入するようにしていたため、 今回、これを現在の最新版である CWEB Revisison 3.5 に合わせると同時に、 全面的に Perl で書き直したバージョンをでっちあげた。

参考文献


by T.Sato, 2000/5/14