[ Home
  > ソフトウェア
  > mcweave ]
mcweave ― 似非文芸的プログラミングのすすめ
mcweave は C のプリティ・プリンタ (整形印刷プログラム) であり、
CWEB のプロセッサである cweave をバックエンドとして使用している。
これは私自身の必要を満たすためにでっちあげたものであり、
他の人が気に入るかどうかは多分に疑問ではある。
主な特徴は:
- 入力となる C のソースはそのままコンパイラにかけられる
- C のコードのフォントは自動的に (例えば、通常の識別子はイタリック、
予約語はボールド、文字列リテラルはタイプライタ) 切り替えられる
- インデントは自動的に付けられる (失敗することも...)
- 識別子や文字列リテラルの索引が自動的に出力される
- コメントの中では TeX のコマンドを使用できる
- コメントの中に C のコードの断片を含めることもできる
mcweave を用いると、ソースを C コンパイラで直接コンパイルできる 
(CWEB のような前処理を必要としない) 形に保ったままで、
プログラムを読みやすく (読みにくいと言う人もいるが) 印刷し、
またコメントに数式や表などを入れられるようになる。
次に、mcweave による出力のイメージを示しておく:
![[ Sample Image ]](mcweave-out.gif) 
環境
mcweave を使用するためには、以下の環境が必要である。
- UNIX 風のオペレーティング・システム
- Perl 5.x
- CWEB (version 3.5、あるいはそれ以降のものが望ましい)
- plain TeX、及び関連するソフトウェア
インストール
- mcweave をパスの通ったディレクトリ 
(例えば /usr/local/bin) にコピーし、
実行可能ビットをセットする。
もし Perl が /usr/bin/perl 以外であれば、
それに応じて最初の行の“#!/usr/bin/perl”を書き換える。
 
- mcwebmac.tex を 
TeX が見付けられる場所にコピーする。
使用方法
mcweave の実行
- mcweave foo.c
- foo.c をタイプセットし、
出力として texput.dvi を生成する。
この出力は通常の DVI ファイルであり、
xdvi や dvi2ps などで扱うことができる。
 
- mcweave -k foo.c
- foo.c をタイプセットし、
出力として texput.web、texput.tex、
texput.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 でも) 処理することができる。
ルール
基本的な規則は、以下のようなものです:
- “Title: Typesetting a C Program”のような行が含まれていると、
それはタイトルとして用いられる。
 
- “/*”が行の頭から書かれている場合には、
それは新しいセクションの開始として扱われる。
 
- コメントの内側は TeX によって処理される。
従って、“_”、“%”、“$”などの文字を
そのまま書くことはできない。
 
- コメントの一部を“|”で囲むと、
その部分は C のコードの断片として処理される。
 
- C のコードは cweave によって解析され、
フォントやインデントなどは自動的に決定される。
(しかし、解析に失敗することもあり、
そのような場合には細工が必要となるかも知れない。)
補足
経緯
私はかなり昔からプログラムを読みやすく出力することに関心を持っており、
何年かのあいだは自分で書いたプリティ・プリンタを使用してもいたが、
とても満足のいくものではなかった。
その後、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 で書き直したバージョンをでっちあげた。
参考文献
- 「Weaving a Program - Literate Programming in Web」,
  W.Sewell,
  Van Nostrand Reinhold,
  1989
 
- 「The CWEB System of Structured Documentation」,
  D.E.Knuth & S.Levy,
  Addison-Wesley,
  1994
 
- 「文芸的プログラミング」,
  D.E.Knuth, 有澤誠 訳,
  アスキー出版局,
  1994
 
- 「クヌース先生の ドキュメント纂法」,
  D.E.Knuth et al., 有澤誠 訳,
  共立出版,
  1989
 
- 「クヌース先生の プログラム論」,
  有澤誠 編,
  共立出版,
  1991
 
- 「TeX ブック」,
  D.E.Knuth, 斎藤信男 監訳,
  アスキー出版局,
  1986
by T.Sato, 2000/5/14