plain2のHTMLテーブル拡張

2002/01/06
KOBAYASHI Kenichi


plain2のHTMLテーブル拡張について

plain2はプレーンテキストをそのまま見目よい TeX/HTML/roff形式に変換できる便利なツールである。しかし、 HTML形式の場合にはテーブルと図を出力するために LaTeXなどの他のツールを使っていったんGIF画像に変換してやらなければならないという問題があった。

そこで、plain2を改良してテーブルを直接HTMLで出力するようにした。 他にリンク(外部参照)などの便利な機能をいくつか拡張した。


拡張機能

その他のツール

拡張機能の詳細

テーブルのHTMLによる描画

従来はTeX(や他のツール)に頼っていたテーブルの描画を、 HTMLで直接行なうようにした。plain2のマニュアルから例を抜粋する。

例1 枠のないテーブル

      鯵      あじ            100
      鮃      ひらめ          200
      鰤      ぶり           2000
      鰹      かつお          800

あじ 100
ひらめ 200
ぶり 2000
かつお 800

例2 枠のあるテーブル

      -------------------------
      |  ?   |  よみかた     |
      |=======================|
      |  鯣   |  するめ       |
      |-------+---------------|
      |  鯡   |  にしん       |
      |-------+---------------|
      |  鯰   |  なまず       |
      |-------+---------------|
      |  鰡   |  ぼら         |
      -------------------------

よみかた
するめ
にしん
なまず
ぼら

例3 複雑なテーブル

      ---------------------------------
      |へん||つくり|  字  |  よみかた |
      |===============================|
      | 金 ||      |  錫  |  すず     |
      |----||  易  |------+-----------+
      |    ||      |  鯣  |  するめ   |
      |    ||------+------+-----------+
      | 魚 ||  非  |  鯡  |  にしん   |
      |    ||------+------+-----------+
      |    ||      |  鯰  |  なまず   |
      |----||  念  |------+-----------+
      | 手 ||      |  捻  |  ひねる   |
      |--------------------------------

へんつくりよみかた


 
すず




 
するめ
にしん


 
なまず
ひねる


例4 お手軽にテーブル

例えば、データの並びを以下のようにそのまま書くだけで、 きれいなテーブルができるので、急いでいるときに有意義である。 例はダイスを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の飛び先に指定できる。


従来のHTML出力との互換性

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形式をよく知らない上に、めったに使わないためである。

簡単な例を示す。

例1:
 集合 (($ S_k = {a_0^2, a_1^2, ... a_{n-1}^2})) のうち、

集合 Sk = {a02, a12, ... an-12} のうち、

例2:
 LaTeXのロゴもどき = (($ L^AT_EX ))

LaTeXのロゴもどき = LATEX


起動時オプション

-tstyle="css":
HTMLモードで-tstyleオプションを指定すると、CSSファイルの指定になり、 ヘッダにCSSファイル"css"を含める<LINK>タグを追加する。

-htmlonce:
HTMLモードで図(文字画)をそのまま出力する。

-htmlold:
昔のHTML形式で出力する。拡張機能は無効になる。

-hfl:
フットノートをページの最後にまとめて出力する。この場合、 フットマークとフットノートテキストの間が離れてしまうのでハイパーリンクで結ぶ。


ヘッダ

以下のように、ヘッダ部とボディ部をきちんと区別する構造となった。

<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"

バグ修正

Tips

ツール

p2hindex

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"をインデックスフレームのスタイルシートに使う。

オプション説明

以下に、ヘルプで説明しきれなかったオプションの解説を記す。

-i, -f, -t:
インデックスのスタイルを決める。 何も指定しないとリストインデックスになる。 各オプションには追加の引数として整数値<n>を与えられる。これを指定するとp2hindexはHTMLファイルが<n>行以上の場合のみインデックスを付加する、という制御を行う。これは、複数のHTMLファイルをまとめて変換する際に、小さいファイルにはインデックスを付けたくない、という場合に使う。

たとえば "-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は本文となる。

-w:
フレームインデックスやテーブルインデックスの幅を決める。引数は HTMLのwidth属性の引数に使われるものなので、ピクセル数や%などで指定できる。

-l:
インデックスを作る対象の<H?>タグを指定する。通常は plain2の最高レベルのセクションは<H2>タグなので、デフォルトでは <H2><H3>をインデックス作成の対象にしている。例えば、 <H2>〜<H5>を指定する場合は"2-5"を指定する。

-k:
リストインデックスやテーブルインデックスの出現位置を決める。 デフォルトまたは-kオプションの引数に""を指定した場合、HTMLファイルの行頭が "<!--toc -->"で始まる最初の行にインデックスを作成する。 さもなくば、"h[1-9],2"というように文字列と数字を','で区切って指定する。 これにより、文字列で指定される正規表現を持つタグが現れる何番目の直前にインデックスを置くかを指定することができる。例えば"h[1-9],2"ならば、デフォルトではタイトル(<H1>)の後、最初のセクション(<H2>)の前にインデックスが作られる。

-nof:
フレームインデックスの時、フレーム非対応ブラウザのために<NOFRAMES>タグと本文のコピーを作成する。これを指定しない場合(デフォルト)は本文への簡単なリンクを張るのみ。

-mfmt:
タイムスタンプの書式を指定する。書式は Cの関数のstrftime()と同じである。このオプションを指定すると、 -mオプションも同時に有効になる。デフォルトの書式は "Last modified at %c" である。 これを -mfmt "Last change %Y%m%d" とすると、 タイムスタンプは例えば"Last change 2002/01/06"となる。


*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ファイルにも使い方に気をつければ流用できる。

plain2html

知念@NAISTさんのパッチにplain2htmlというツールが含まれている。 テーブルや図をHTMLで使えるようにLaTeXや groffを使って画像を生成することにより、HTML文章を生成する plain2のフロントエンドである。

HTMLテーブル拡張を行なっても、 図はやはりHTMLでは出力できないため、テキスト線画で手早く絵を描きたい場合には plain2htmlは役に立つ。

このplain2htmlを修正した。変更点は以下の通り。


*5 このオプションを使うと、 コマンドライン上、plain2と見かけが同じになる。

plain2html の動作に必要なものは以下の通り


*6 ImageMagickは gifを圧縮しないものがあるので注意すること


Last modified at Sun Jan 06 13:01:51 2002