現行TADでWord Wrappingを実現する理論体系
〈但し、これでは一時凌ぎにしかならない〉


Caution!
このページの内容は、現時点ではまだ小熊一人のアイデアです。坂村先生からも、TRON協会からも、なんらの承認/査閲を受けてはおりません。よって、最終的に破棄される可能性もあります。
くれぐれもそのことを忘れないで、この文章を読んで下さい。
1999.Oct.18
実は現時点で、この考えは破綻することが分かってしまいました。超漢字が実装されて、数千字単位で文字要素が増えてしまったら、これじゃ駄目なんだ……。


 まず最初に、TADの仕様書から、禁則付箋の記述を拔粋してみる。

4.6.5 禁則指定付箋:拡張レベル

行頭、行末の禁則処理の指定である。

    LEN:    〜
    SUBID:  8                -行頭禁則指定
    ATTR:   BYTE    kind     -行頭禁則タイプ
    [DATA:  CHAR    ch[]]    -行頭禁則対象文字
    LEN:    〜
    SUBID:  9                -行末禁則指定
    ATTR:   BYTE    kind     -行末禁則タイプ
    [DATA:  CHAR    ch[]]    -行末禁則対象文字
kind: XXXLKKKK
L:レベル
0:1重禁則
1:多重禁則
K:方式
0:禁則なし
1:追い出し禁則
2:追い込み禁則
3:ぶら下がり禁則
4〜:予約
15:その他(方式の規定なし)
追い出し:行末禁則の場合、禁則文字を次の行に追い出す。
行頭禁則の場合、前の行末文字を行頭に取り込む。
追い込み:行頭禁則の場合、禁則文字を前の行に追い込む。
行末禁則の場合、その次の文字を取り込む。
ぶら下がり:各行の行末に1文字分の禁則文字領域を設け、行頭禁則の場合、禁則文字を前の行の禁則文字領域に追い込む。
行末禁則の場合、その次の文字を禁則文字領域に取り込む。
ch[]:禁則対象文字の列、省略可能
禁則ありで省略された場合の禁則対象文字は処理系に依存する。
指定された場合は、指定文字のみ禁則対象とする。
http://www.personal-media.co.jp/btron/tad/fu2_4_6.htm#fu2_4.6.5

 これだけでは、現象面だけしか分からない。禁則とは何かをきちっと考えて理解しなければいけない。

 禁則とは何か。これは行折り返しを行うにあたって、折り返してはいけない文字間のことである。折り返しは文字と文字の間で行われるから、当然禁則は文字間の属性である(ここでいう文字とは、スクリプト層で指定され、フォント層から画像として取り出される表記処理上のひとかたまりのことである)。
 一つの文字は、直前、あるいは直後で折り返される可能性がある。しかし文字によっては直前、あるいは直後での折り返しが許されない文字がある。
 これが禁則文字である。

 行頭禁則文字=直での折り返しが禁止される文字
 行末禁則文字=直での折り返しが禁止される文字

 文字は、「直前折り返し=可/不可」「直後折り返し=可/不可」という属性を持っている、という見方が出来るのである。さらに、「追い出し」「追い込み」「ぶら下げ」のいずれかによって折り返し位置の次候補を順行して捜すのか遡行して捜すのか、その後の処理が規定されるが、今回についてはこれを省略する。
 直前と直後は両方とも有するので、ある文字が持つ折り返し情報の組み合わせは2×2=4通りである。

 文字間は当然二つの文字に挟まれているので、ある文字間について、直前の文字の「直後折り返し」と直後の文字の「直前折り返し」の二つの属性を参照する。組み合わせはこれまた2×2=4通りである。両方が「可」であるときのみ、その文字間で折り返すことができる。
 ある文字間が取りうる状態を下に表で示す。

直前
折り返し可折り返し不可
直後 折り返し可[1][2]
折り返し不可[3][4]
 なんの問題もなく折り返しができるのは[1]の場合だけである。それ以外の場合は、必ず禁則処理が発生し、折り返し位置を前後に動かさなければいけない。

 さて、禁則処理の理論的枠組みを掴んだところで、英文word wrappingに移ろう。
 Word wrappingとは、欧文において単語内での折り返しを禁じる禁則処理のことである。単語とは、大小アルファベットの羅列であり、一般的に空白によって区切られる。今回は単語をハイフンで区切って折り返すハイフネーションについては考えない。
 ここまで来れば、殆ど答えは見えているようなものだが、要するに、アルファベット―アルファベット間での折り返しを禁じれば、word wrappingが粗方完成である。
 問題は、上の表の[2]〜[4]のうち、word wrappingに適したものはどれであるかということである。
 空白で区切られた直後、つまり単語の先頭は、行の先頭にくることができる。よって、アルファベットの直前での折り返しは「可」である。[2]〜[4]の中で「直前折り返し=可」なのは[3]である。よって、word wrappingのためのアルファベットの禁則は「直前折り返し=可」かつ「直後折り返し=不可」であるということになる。

 「直前折り返し=不可」は即ち「行末禁則」であるので、禁則指定付箋で行末禁則文字列としてアルファベット26文字×大小2セットと数字を入れておけば、理論上はword wrappingが実現するはずである。


補遺

 上記のWord Wrapping方法について。
 複数のソースから、現行の基本文書エディタでは実現できなかったとの報告を頂いた。これについては、原因はどうやら基本文書エディタにあるようだが、現時点では確証はない。
 今後も、追試・傍証を続けていきたい。

補遺之二

 超漢字2では、本当に上記の方法で禁則とワードラッピングが実装されてしまった。いいのか、おい?