<2m>SedWord 貧文書入門</2m>

                              <1.2m>2011年6月27日  
                              <1.2m>@kabipanotoko

SedWord は、sed で組版を実現する仕組みである。これは、原稿のテキストファイルをポスト
スクリプトファイルに変換するための、いくつかの   sed  スクリプトから成り立っている。
LaTeX 環境を構築するのが困難な状態にある人、手持ちのコンピュータの troff で日本語が使
えない人、sed のファン、そして特に<g>冗談が好きな人</g>に向いている。

<2lc><1.1g>基礎 sedword.sed</2lc>
sedword.sed は SedWord の基礎となるスクリプトである。

  <2lc>sed -nf sedword.sed text.txt > postscript.ps</2lc>
のように使い、テキストをポストスクリプトファイルに変換する(<0.9m>-n オプションを忘れないよ
<0.9m>うに</0.9m>)。  troff と同じで、プリアンブルは必要ないし、文中に命令を埋め込む必要もない。
sedword.sed は勝手に行の折り返しをしないから、長い行はあらかじめテキストエディタを使
って折り返しておく必要がある。ホワイトスペースはそのままホワイトスペースとして出力さ
れる。

用紙サイズ、上・左マージン、文字の大きさと行間、1 ページの行数、本文が明朝体かゴシッ
ク体かをデフォルト値から変更するには、sedword.sed をエディタで開き、必要な部分を書き
換える。1 ページの行数を除けば、すべてはポストスクリプトのプロローグ部分の変数定義を
変えることによって実現する。ページサイズは、Postscript 用と DSC 用とで二箇所に同じ数
字を書き込まなくてはならない。

デフォルトの設定は以下の通り。
・用紙サイズ            595 x 841 ポイント(A4 ポートレート)
・上マージン           100 ポイント
・左マージン            80 ポイント
・標準文字サイズ         10 ポイント
・標準フォント          /Ryumin-Light-UniJIS-UTF8-H  (デフォルト)
                 /GothicBBB-Medium-UniJIS-UTF8-H 
・行送り(行間+文字サイズ)   標準文字サイズの 1.5 倍
・1 ページの行数         45 行

<0.9m>用紙サイズや行送りは 1 ページの行数に影響を及ぼさない。1 ページの行数を N 行に設定し
<0.9m>たい場合は、sedword.sed  中で # <---  lines_per_page -  1 というコメントのある行に、
<0.9m>N-1 を指定する。

<-0.5L><1.1g>文字の装飾 emph.sed<+0.5L>
いくらか装飾的な機能を盛り込みたいという欲求に屈して、私はいくつかの簡単なタグを定義
した。これは、sedword.sed とは別の sed スクリプト emph.sed によって実現する。たとえば
<<nil>g></<nil>g>は文字をゴシック体にするためのタグである。入力テキスト中に書かれたこのタグは、
sedword.sed によっては一切解釈されることなく、さりとて無視されることもなく、ただのテ
キストとして扱われる。そして、出来上がったポストスクリプトファイルに対して emph.sed を
実行すると、ここではじめてタグがゴシック体を指定するポストスクリプトの命令に書き換え
られる。「一般」→「特殊」の順にスクリプトを適用していくわけである。

  <2lc>sed -nf sedword.sed text.txt | sed -f emph.sed > postscript.ps</2lc>
タグをエスケープして文字通り出力したいなら<<<nil>nil>g><<<nil>nil>/g>のように書く。<<nil>nil> という
タグは、印刷に何の影響もおよぼさない。しかし、これを他のタグの内部に挟み込んでおくと、
タグの機能がキャンセルされ、文字通りに印刷される。     <<nil>nil>    と印刷したいならば、
<<<nil>nil>nil> と書けばよい。なお、定義されていないいタグは、エスケープしないでもそのまま
文字の通りに印刷される。そして、これは大事なことだが、いかなるタグも一行の中に書かな
くてはならない。

<g>ゴシック</g> 上に触れた通り、文字をゴシックにするには、<g<nil>></g<nil>> で囲む。ただし、この命令
は行をまたぐことができないので、もし複数行をゴシックにしたいのなら、一行の字数を整形
した後、タグをテキスト各行に書かなくてはならない。なお、終了タグを省略すると、ゴシッ
ク化の効果は行末で終了する。

<1.2m>大きな文字</1.2m>と<0.8m>小さな文字</0.8m> <<g>N</g>m<nil>></<g>N</g>m<nil>> で囲むと、デフォルトフォントサイズの N 倍の大きさの
明朝体の文字になる。<g>N</g> がとる値は、0 より大きな小数。<<g>N</g>g<nil>></<g>N</g>g<nil>> は、このゴシック版。こ
れらのタグの効果は、終了タグがあるか、行末に達するまでである。効果が行をまたぐことは
ない。

<2lc>行送りの調整</2lc> 左の文字は、 2 行ぶんの広さのちょうど真ん中にくるように配置されている。
<2lc<nil>></2lc<nil>> というタグを使うと、組版の指定でしばしば「2 行センター」と書かれてあった
ときのような処理ができる。これらはそれぞれ <<nil>-0.5L> (0.5 行ツメ) <<nil>+0.5L> (0.5 行ア
ケ)の別名である。これらはカレントポイントを行送りの半分だけ上方に移動し、またカレン
トポイントを同じだけ下方に移動するものである。

<2lc><1.1g>図の貼りつけ embedeps.sed</2lc>
eps ファイルを挿入するには、ファイル名を、挿入したい場所で、
<<nil>eps filename.eps> 
と書いておく。タグは一行に書かなければならない。すると、図の下端が、行のベースライン
と一致するよう印刷される。

                    <2lc><eps eq.eps></2lc>
上の図は、latex eq.tex; dvips.nonja eq.dvi; ps2eps eq.ps として作成した eps ファイル
を埋め込んだものである。

eps を埋め込んだ場合の処理は、例によって、先に sedword.sed を実行し、できたポストスク
リプトファイルを embedeps.sed に通す。

  <2lc>sed -nf sedword.sed text.txt | sed -f embedeps.sed > postscript.ps</2lc>
さて、eps の挿入は、タグ一つだけで行われる。これは、レイアウト上意味深長である。とい
うのは、タグはレイアウトのときに場所をとらない、という原則がここでも発揮されるからで
ある。つまり、タグをそのまま文中に埋め込むと、以下のようなことになる。

  <2lc>この後に埋め込むよ<eps eq.eps>埋め込んだよ</2lc>
これが「タグは場所をとらない」の意味である。画像は文字として挿入されるわけではない。
したがって、埋め込まれるべき場所をあらかじめホワイトスペースを使って空けておく必要が
ある。

  <2lc>この後に埋め込むよ <eps eq.eps>     埋め込んだよ</2lc>
上の例は、入力テキストファイルにおいて、
「この後に埋め込むよ <<nil>eps eq.eps>     埋め込んだよ」
となっている。

なお、embedeps.sed  は、GNU sed の  e コマンドを用いて、子プロセスから  cat を起動し
eps ファイルの内容を取得するので、GNU sed 以外の sed では動かない。

<2lc><1.1g>数式そのものを原稿に書く embedtroff.sed</2lc>
数式をドキュメントそのものに書き込めば、編集作業が大幅に向上する。embedtroff.sed を使
うと、troff の eqn 書式で書いた数式が組版される。たとえば、

  <2lc><<nil>troff sum from n=1 to 5 = 15></2lc>
のように書き

  <2lc>sed -nf sedword.sed text.txt | sed -nf embedtroff.sed > postscript.ps</2lc>
のように処理すると、

  <troff sum from n=1 to 5 = 15>
のように出力される(<0.9m>-n オプションを忘れないように</0.9m>)。embedtroff.sed は、GNU sed の e
コマンドを使って、子プロセスから eqn, groff, および ps2pdf を起動し、その結果を取り込
んでいる。したがって、GNU sed 以外の sed では動かない。

<2lc><1.1g>ヘッダとページ番号</2lc>
ヘッダを印刷するためのタグは定義されていない。そのかわり、header.sed というスクリプト
が用意されている。sedword.sed で作成されたポストスクリプト書類をこれを通すとヘッダが
つけ加えられる。

  <2lc>sed -nf sedword.sed text.txt | header.sed > postscript.ps</2lc>
ヘッダに書き込む文字は、header.sed をエディタで編集しなくてはならない。
デフォルトでは、「Page 1」とか「Page 99」とかいう文字列が、1 ページ目を除いて書類の右
肩につけ加えられる。「右肩」というのを正確に言うなら、本文最初の行より 3 行上で、日本
語の文字 42 文字目左端の位置にヘッダの左端を合わせるということである。また、デフォル
トではヘッダのフォントサイズは、本文のデフォルトフォントサイズの 0.9 倍で、書体はゴシ
ック。これらの設定は、header.sed を編集して変えることができる。

<2lc><1.1g>環境</2lc>
SedWord は、UTF-8 で入力がなされることを想定しているが、これはデフォルトのフォント名
に UniJIS-UTF8 というのがついているというだけの話である。sedword.sed では、デフォルト
のフォントは、明朝では          /Ryumin-Light-UniJIS-UTF8-H         で、ゴシックでは
/GothicBBB-Medium-UniJIS-UTF8-H になっている。多くの環境で、これらのフォントは手持ち
の別のフォントに置き換えられてラスタライズされる。

<2lc><1.1g>おまけ</2lc>
タグの長さを計算に入れずに fill するための Emacs 用のコマンドを、やっつけで書いてみた。
もっと素敵なやり方があるはずだ。

(defun sedword-fill-paragrah ()
(interactive)
(save-excursion
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "<[^<>]+>" nil t)
      (put-text-property (match-beginning 0) (match-end 0) 'invisible t)))
    (mark-paragraph)
  (fill-region (region-beginning) (region-end) 1)
  (remove-text-properties 1 (point-max) '(invisible nil))))