そう、実は重大な欠陥があったのです

InD-Boardの方でバラしちゃいましたけれど、[文字に囲み罫を設定する]スクリプトには重大な欠陥があります。それは欧文を全く考慮していないこと。完全に抜けてます。

それはソースの一番下を見てもらえば分かるんですが、下線と打ち消し線のオフセット位置を計算するために、選択された文字列(の一番最初の文字)に使用されているフォントのベースラインを取得しています。

//フォントのベースラインを取得する関数
function fontbaseline ( myFont, doc ) {
    txf = doc.textFrames.add();
    txf.strokeWeight = 0;
    txf.geometricBounds = [0, 0, 100, 100];
    with (txf.textFramePreferences) {
        textColumnCount = 1;
        insetSpacing = [0, 0, 0, 0];
        firstBaselineOffset = 1296386159; //FirstBaseline.EmboxHeight
        ignoreWrap = true;
    }
    with (txf.parentStory) {
        storyPreferences.frameType = 1417176692; //FrameTypes.textFrameType
        storyPreferences.storyOrientation = 1752134266; //StoryHorizontalOrVertical.horizontal
        gridAlignment = 1852796517; //GridAlignment.NONE
        baselineShift = 0;
        gridGyoudori = 0;
        contents = "あ";
        appliedFont = myFont;
        pointSize = 100;
    }
    blp = txf.lines[0].baseline / 100;
    txf.remove();
    return blp;
}

何をやっているかというと、左上を原点に合わせた100pt×100ptのテキストフレームを作成して、そこに100ptの大きさの文字を打ち込み、フォントを指定しています。そうして得られたベースラインの値を元に、下線と打ち消し線のオフセット位置を計算している訳です。

で、ここで問題なのがテキストフレームに打ち込む文字。このソースでは「あ」と入力していますが、この文字は、囲み罫を設定しようとしている文字に使われているフォントを使用して正しく表示されなければなりません。そうでなければ間違ったベースラインの値を返して来るので、結果、下線と打ち消し線の位置がずれます。
そこを「あ」にしているから、(欧文などの)「あ」の文字を含まないフォントでは正しく設定できない訳です。

で、どうするか。一番簡単なのが「あ」を別の文字に変えてしまう方法。ただし、もしも仮名しか持たないフォントが存在したら? で、次の策として、選択されている1文字目の文字を取得してそれを入力する方法。でも、もしもその文字が制御文字だったら? あるいは、Wのように、全角幅を超える長さの文字で、あふれてしまう場合の対応方法は? で、その次の方法として、文字を入力するのではなく、属性も含めた状態のものをコピーして持って来る方法。でも、この場合でもあふれの問題があるし、さらに、変形が掛かっていた場合の対応、文字サイズの変更、ベースラインシフト、割注などあらゆる属性をどうするかということで、非常に対応が難しいのです。

てなわけで、かな文字以外だと考えることが多くて大変なのです。だからこのまんま。欧文を扱う場合にはソースを変更して使ってくださいな。

『そう、実は重大な欠陥があったのです』へのコメント

  1. 名前:いき 投稿日:2009/04/15(水) 10:50:59 ID:f872aa859 返信

    大丈夫です(^^)
    このくらいは、ユーザー側の運用でやらせちゃいましょう^^
    すでに、お~まちさんを始めとするスクリプターの布教活動によって、DTPでスクリプトを使う人たちの裾野は広がっていますので。

  2. 名前:お~まち 投稿日:2009/04/15(水) 21:49:00 ID:57d343539 返信

    フォローありがとうございます。そうしましょう(^^)
    ついでに。作成するテキストフレームの大きさを100pt×200ptにしたら?
    と思われた方、わたし的にはこれは却下です。2倍角以上の文字幅を持つフォントがないという保証はありませんので。可能性があるとしたら装飾用に使う記号フォント。てゆうか、SING外字を使われたらどんなことをしてもそこでおしまいなんですけどね。