2002/01/06 | |
KOBAYASHI Kenichi | |
plain2はプレーンテキストをそのまま見目よい TeX/HTML/roff形式に変換できる便利なツールである。しかし、 HTML形式の場合にはテーブルと図を出力するために LaTeXなどの他のツールを使っていったんGIF画像に変換してやらなければならないという問題があった。
そこで、plain2を改良してテーブルを直接HTMLで出力するようにした。 他にリンク(外部参照)などの便利な機能をいくつか拡張した。
これにより、図を使わない場合は LaTeX処理系他が不要になり、編集作業がすばやく快適に行なえるようになる。 GIF画像の読み込みが不要になるので、ページの読み込みも速くなる。
筆者のように、表をよく使う技術系文章を大量に書く人にとって、 この機能はとても便利である。
従来の HTML出力形式をそのまま出力するモードを用意したので、気兼ね無く従来の plain2を差し換えることができる。
ハイパーリンクのための機能を追加した。TeX形式や roff形式にも対応する。
今まではTeXやHTMLのマークアップをすると TeX専用のplain2文章やHTML専用のplain2文章になってしまった。これでは本来 TeXにもHTMLにも使い回せるはずのplain2の魅力が損なわれてしまう。 これを解決するために、出力形式別のマークアップ機能を追加した。
従来のHTML出力形式では、<A…>…</A> で囲まれるアンカーの範囲が"GO"や"(here)"となって見映えが悪かったので改善した。 また、改行の量や位置をプレーンテキストやTeX形式に極力近づけた。
従来の HTML出力形式には無かったフットノート機能を追加した。
TeXのmathモードのような上付き /下付き添え字をすべての出力形式で扱えるようにした。
従来はTeX(や他のツール)に頼っていたテーブルの描画を、 HTMLで直接行なうようにした。plain2のマニュアルから例を抜粋する。
鯵 あじ 100 鮃 ひらめ 200 鰤 ぶり 2000 鰹 かつお 800
鯵 あじ 100 鮃 ひらめ 200 鰤 ぶり 2000 鰹 かつお 800
------------------------- | ? | よみかた | |=======================| | 鯣 | するめ | |-------+---------------| | 鯡 | にしん | |-------+---------------| | 鯰 | なまず | |-------+---------------| | 鰡 | ぼら | -------------------------
? よみかた 鯣 するめ 鯡 にしん 鯰 なまず 鰡 ぼら
--------------------------------- |へん||つくり| 字 | よみかた | |===============================| | 金 || | 錫 | すず | |----|| 易 |------+-----------+ | || | 鯣 | するめ | | ||------+------+-----------+ | 魚 || 非 | 鯡 | にしん | | ||------+------+-----------+ | || | 鯰 | なまず | |----|| 念 |------+-----------+ | 手 || | 捻 | ひねる | |--------------------------------
へん つくり 字 よみかた 金
易
錫 すず
魚
鯣 するめ 非 鯡 にしん
念
鯰 なまず 手 捻 ひねる
例えば、データの並びを以下のようにそのまま書くだけで、 きれいなテーブルができるので、急いでいるときに有意義である。 例はダイスを1000回振ったときの分布。
目 回数 ==================== 1 156 2 153 3 171 4 175 5 175 6 170
目 | 回数 |
---|---|
1 2 3 4 5 6 | 156 153 171 175 175 170 |
各テーブルの<TABLE>タグには、tbl:0, tbl:1, ...という idが自動的に付けられるので、CSSやhrefの飛び先に指定できる。
plain2のHTML形式をスクリプトで加工して使っている人も多いだろう。 新しいHTML形式でもたいていはそのまま使えると思われるが、100%ではない。
そこで従来のHTML形式をそのまま出力する互換モードを用意した。 実行時に-htmlオプションの代りに-htmloldオプションを指定すると、 従来のHTML出力形式のままで出力する。以下にまとめを記す。
オプション | 効果 |
---|---|
-htmlonce | PICをそのまま出力 |
-htmlold | 古いHTML出力形式 |
-htmlold -htmlonce | 古いHTML出力形式での -htmlonce に相当 |
-htmlold -htmlonce -raw | 古いHTML出力形式での -htmlonce -raw に相当 |
絵を含んだplain2文章を編集する場合、編集時は -htmlonceオプションを使ってプレビューし、本番はplain2htmlを使って LeTeXかroffで絵を処理する、という使い方が便利である。 roff形式の方が処理が速く出力される絵の質が高いのでおすすめである (日本語化groffが必要)。
HTMLを使うからには、リンク(外部参照 )も扱えた方が便利である。そこでインラインヒント((h)) を追加した。
>> plain2ソース: >> ((h google http://www.google.com/intl/ja/))でサーチ!
は
>> HTML出力: >> googleでサーチ! >>  ̄ ̄ ̄
このように、最後の単語をURLとみなし、 それ以前の部分をアンカー文字列にする。単語の区切りは半角スペース。
>> TeX出力: >> google†でサーチ! >> ──── >> †http://www.google.com/intl/ja/
TeXやroffモードでは外部参照はURLをフットノートに出力する。
なお、 ((h…)) の中が1語の場合はアンカーにもURLにも使われる。
>> plain2ソース: >> ((h http://www.google.com/intl/ja/))でサーチ! >> >> HTML出力: >> http://www.google.com/intl/ja/でサーチ! >>  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ >> TeX出力: >> http://www.google.com/intl/ja/でサーチ!
いままではインラインヒント((r)) を使って特定の出力形式専用のマークアップをしていたが、これでは TeXのマークアップをした文章はHTMLでは使えなくなってしまう。そこで、 インラインヒントとして、((mh…)) 、 ((mt…)) 、 ((mr…)) を追加した。
出力形式 | ((mh…)) | ((mt…)) | ((mr…)) |
---|---|---|---|
HTML TeX roff | raw出力 出力無し 出力無し | 出力無し raw出力 出力無し | 出力無し 出力無し raw出力 |
>> 例 >> ((mh html))((mt tex))((mr roff)) >> >> HTML出力: >> <P> >> html >> </P> >> >> TeX出力: >> \par >> tex >> >> roff出力: >> .P >> roff
たとえば、今まで TeX用マークアップをした文章は((r を((mt に置換すればそのままHTML出力ができるようになる。逆もまた同じ。
また、ブロックヒント[[R… ]]Rについても同じことが言えるので、 マークアップ用のブロックヒントとして、[[MH…]]M、[[MT…]]M、 [[MR…]]Mを追加した。
出力形式 | [[MH…]]M | [[MT…]]M | [[MR…]]M |
---|---|---|---|
HTML TeX roff | raw出力 コメント コメント | コメント raw出力 コメント | コメント コメント raw出力 |
内部参照(TeXの\ref機能)を使うと、従来のHTML形式ではアンカーは "GO"に固定だった。これを、ラベル名をアンカー文字列として使うように変更した。
例えば、
>> plain2ソース: >> 図.((x人口の推移))を参照のこと。 >> >> TeX出力: >> 図.3を参照のこと。 >> >> HTML出力: >> 図.人口の推移を参照のこと。 >>  ̄ ̄ ̄ ̄ ̄
となる。
また、従来のHTMLモードでは参照先のアンカーは "(here)"という固定文字列が使われていたが、 これも参照先のキャプションがアンカーとして使われるようにした。
他に以下の改善を行った。
TeX モードなどでは使えるフットノート用のインラインヒント((f)) を扱えるようにした。
>> plain2ソース: >> フットノート((fここに置かれる))が使えるようになりました。 >> >> HTML出力: >> フットノート*1が使えるようになりました。 >> >> ───────────────────── >> *1 ここに置かれる >> ─────────────────────
実際の例はこれ*1 。
*1 フットノートの例
-hfl オプションを指定すると、 以下のようにページの最後にまとめて置かれるように変わる。 好みのスタイルを選んで欲しい。
>> HTML出力: >> フットノート*1が使えるようになりました。 >> ・ >> ・ >> ・ >> ───────────────────── >> *1 ここに置かれる
簡単な数式を書くときなど、 添え字は出力形式を気にしないで気軽に扱いたい。そこで、 添え字を簡単に書くためにインラインヒント(($…)) を追加した。
これはTeXのmathモードに似ている。 "(($" と "))"の間に囲まれた領域では、"_"(アンダーバー)と"^"(ハット) は特別な意味を持つ。
"_"の次の1文字は下付き文字になり、"^"の次の1文字は上付き文字になる。 また、"_{…} "というように"_"の後を中括弧で囲むと、 囲んだ領域全体が下付き文字になる。これは"^"の場合でも同じである。 TeXでの添え字と同じである。*2
*2 しかしながら、TeXのmathモードの他の機能は持たない。
この機能は、roff/TeX/HTMLの全ての形式で使える。ただし、 roff形式だけは文字が下付きや上付きにならずに普通の文字と同じく表示される。 *3
*3 理由は、 筆者がroff形式をよく知らない上に、めったに使わないためである。
簡単な例を示す。
集合 (($ S_k = {a_0^2, a_1^2, ... a_{n-1}^2})) のうち、
集合 Sk = {a02, a12, ... an-12} のうち、
LaTeXのロゴもどき = (($ L^AT_EX ))
LaTeXのロゴもどき = LATEX
以下のように、ヘッダ部とボディ部をきちんと区別する構造となった。
<HTML> <HEAD> <META 文字コード指定> <TITLE>タイトル<TITLE> <META 著者> </HEAD> <BODY> <H1>タイトル</H1> ・ ・ ・ </BODY> </HTML>
このとき、ヘッダ部のタイトル、文字コード、著者は自動的に設定される。 ユーザ定義ファイルのTITLEマクロは、 ボディ部でタイトルを表現するためにのみ使われる。
-nopre (プリアンブル無し)オプション を指定すると、 <BODY>以前と</BODY>以後が取り払われて以下のように出力される。
<H1>タイトル</H1> ・ ・ ・
HTML出力形式で標準で使われる出力フォーマットを示す。 これらは -f オプションでユーザが再定義可能である。
機能名 | 定義 |
---|---|
DOC_BEGIN DOC_END PLAIN_BEGIN PLAIN_END EXAM_BEGIN EXAM_END APDX_BEGIN APPENDIX BLANK PAGE NEWLINE CENTER_BEGIN CENTER_END RIGHT_BEGIN RIGHT_END INDENT INDENT0 FOOTN_BEGIN FOOTN_END REFER_BEGIN REFER_END BOLD_BEGIN BOLD_END INDEX_BEGIN INDEX_END SECTION_1 SECTION_2 SECTION_3 SECTION_4 SECTION_5 SECTION SETSEC_1 SETSEC_2 SETSEC_3 SETSEC_4 SETSEC_5 TITLE | "<HTML>\n<HEAD>\n" "</BODY>\n</HTML>\n" "<P>\n" "</P>\n" "<PRE>\n" "</PRE>\n" "<!-- appendix -->\n" "\n<H2><A name=\"@1\">@1</A></H2>\n" "<BR>\n" "\n<HR>\n" "<BR>\n" "<DIV align=\"center\">\n" "</DIV>\n" "<DIV align=\"right\">\n" "</DIV>\n" "<BLOCKQUOTE>\n" "</BLOCKQUOTE>\n" "<SMALL>" "</SMALL>" "<A href=\"#" "\">" "<B>" "</B>" "<A name=\"" "\">" "\n<H2><A name=\"@1\">@1</A></H2>\n" "\n<H3><A name=\"@1\">@1</A></H3>\n" "\n<H4>@1</H4>\n" "\n<H5>@1</H5>\n" "\n<H6>@1</H6>\n" "" "" "" "" "" "" "<H1>&1</H1>\n<TABLE width=\"100%\">\n <TR><TD>&3</TD><TD align=\"right\">&2</TD></TR>\n <TR><TD>&4 &6</TD><TD align=\"right\">&5</TD></TR>\n <TR><TD>&7</TD></TR>\n</TABLE>\n<HR>\n" |
plain2で作成されたHTMLファイルにインデックスを付ける Perlスクリプトを作成した。以下の機能を持つ。
使い方はp2hindexのヘルプを参照のこと。
plain2 でHTML形式で出力したファイルを foo.html とすると、
p2hindex foo.html
とすれば、foo.html に上書きしてインデックスが付く。
p2hindex -t -m foo.html
とすれば、foo.html に上書きして、 テーブル型のインデックスとタイムスタンプを付ける。
p2hindex -f -w 30% -fcss p2.css foo.html
とすれば、foo.html に上書きして、フレーム型のインデックスを付ける。 インデックスのフレームは全体の30%の幅で、ファイル "p2.css"をインデックスフレームのスタイルシートに使う。
以下に、ヘルプで説明しきれなかったオプションの解説を記す。
たとえば "-f 1000 -t 300" と指定すると、1000行以上のHTMLファイルではフレームインデックスが作られ、300行以上1000行未満のHTMLファイルではテーブルインデックスが作られ、300行未満のHTMLファイルではインデックスは作られない。
-fオプションでは、インデックスをフレームに作るため、 元のHTMLファイルがfoo.htmlという名前の場合、foo_i.htmlと foo_b.htmlというファイルを新たに作る*4 。foo.htmlがフレームセットとなり、 foo_i.htmlがインデックスで、foo_b.htmlは本文となる。
*4 この"_i"と"_b"という接尾辞は-fisオプションと -fbsオプションで指定できる。
環境変数 P2HINDEX にコマンドラインに渡すオプションをあらかじめ指定しておくことができる。 P2HINDEX の指定とコマンドラインオプションの指定が衝突する場合は、 コマンドラインオプションが優先される。
HTMLファイルに行頭が"<!-- include file-name -->"で始まる行がある場合、 その箇所に file-name で指定したファイルが挿入される。 plain2でこれを出力するには、以下のように書く。
[[MH <!-- include file-name --> ]]M
また、 以下のように file-name の後に +q の2文字をつけると、 インクルードされる部分を<BLOCKQUOTE class="inlcude">タグで囲む。
[[MH <!-- include file-name +q --> ]]M
HTMLファイルに行頭が"<!-- no-toc -->"で始まる行がある場合、 このファイルにはインデックスは付加されない。
p2hindexはplain2が出力したHTMLファイルを整形するツールであるが、 それ以外のHTMLファイルにも使い方に気をつければ流用できる。
知念@NAISTさんのパッチにplain2htmlというツールが含まれている。 テーブルや図をHTMLで使えるようにLaTeXや groffを使って画像を生成することにより、HTML文章を生成する plain2のフロントエンドである。
HTMLテーブル拡張を行なっても、 図はやはりHTMLでは出力できないため、テキスト線画で手早く絵を描きたい場合には plain2htmlは役に立つ。
このplain2htmlを修正した。変更点は以下の通り。
*5 このオプションを使うと、 コマンドライン上、plain2と見かけが同じになる。
plain2html の動作に必要なものは以下の通り
*6 ImageMagickは gifを圧縮しないものがあるので注意すること