Illustratorでテキストボックスの高さを行末に揃えるJSX【XDっぽい自動調整機能】

AI活用

Illustratorでエリア内文字を使っていると、テキストボックスの高さを文章の行末にぴったり揃えたい場面があります。

たとえば、デザインカンプを作っているときに、

  • テキストボックスの下に余白が残る
  • 行末に合わせてボックスの高さを整えたい
  • 複数のテキストボックスを一括で揃えたい
  • XDのように、テキスト量に合わせて高さを調整したい

ということがあります。

Adobe XDにはテキストボックスの高さを内容に合わせやすい機能がありますが、Illustratorでは同じ感覚で扱えず、地味に手間がかかります。

そこで今回は、Illustratorのエリア内文字の高さを、実際の文字の行末に合わせて自動調整するJSXを作成しました。

Illustratorでほしい、かゆいところに手が届く機能

IllustratorでWebデザインやバナー、紙面デザインを作っていると、テキストボックスの余白調整は意外と面倒です。

特にエリア内文字の場合、文章量に合わせてボックスの高さを整えたいだけなのに、毎回手作業で下端を調整する必要があります。

少量ならまだ良いのですが、複数のテキストボックスがある場合は、かなり地味な作業になります。

今回のJSXでは、選択したエリア内文字に対して、実際に表示されている文字の下端を取得し、その位置に合わせてテキストボックスの高さを自動で調整します。

このJSXでできること

このスクリプトでは、以下の処理ができます。

  • エリア内文字のテキストボックスの高さを自動調整
  • 実際の文字の下端に合わせて高さを変更
  • 複数のテキストボックスをまとめて処理
  • 行末が隠れないように下余白を追加
  • ポイント文字や通常オブジェクトはスキップ

対象は、Illustratorのエリア内文字のみです。

ポイント文字は対象外です。

JSXコード

/*
  テキストボックスの高さを行末に揃える.jsx
  修正版:行末が隠れないように下余白を追加

  対象:
  - エリア内文字 TextType.AREATEXT のみ
  - 複数選択可
*/

(function () {
    if (app.documents.length === 0) {
        alert("ドキュメントが開かれていません。");
        return;
    }

    var doc = app.activeDocument;
    var sel = doc.selection;

    if (!sel || sel.length === 0) {
        alert("エリア内文字のテキストボックスを選択してください。");
        return;
    }

    var changed = 0;
    var skipped = 0;

    // 行末下に残す余白。
    // 行末が隠れる場合は 3〜6 に増やしてください。
    // 単位は pt です。
    var bottomPadding = 3;

    for (var i = 0; i < sel.length; i++) {
        var tf = sel[i];

        if (!isAreaText(tf)) {
            skipped++;
            continue;
        }

        try {
            fitAreaTextHeight(tf, bottomPadding);
            changed++;
        } catch (e) {
            skipped++;
        }
    }

    alert("完了しました。\n変更:" + changed + "件\nスキップ:" + skipped + "件");

    function isAreaText(item) {
        return item &&
            item.typename === "TextFrame" &&
            item.kind === TextType.AREATEXT;
    }

    function fitAreaTextHeight(tf, padding) {
        if (!tf.contents || tf.contents.length === 0) {
            return;
        }

        var originalTop = tf.top;
        var originalLeft = tf.left;
        var originalWidth = tf.textPath.width;

        // 実際に表示されている文字の下端を取得するために複製してアウトライン化
        var dup = tf.duplicate();
        dup.selected = false;

        var outlined = dup.createOutline();
        var gb = outlined.geometricBounds;
        // geometricBounds = [left, top, right, bottom]
        var textBottom = gb[3];

        outlined.remove();

        // テキストボックス上端から、実際の文字下端までの距離 + 余白
        var newHeight = originalTop - textBottom + padding;

        if (newHeight <= 0) {
            return;
        }

        // textPath の高さだけを変更することで、文字自体の変形を避ける
        tf.textPath.height = newHeight;

        // 位置と幅を戻す
        tf.left = originalLeft;
        tf.top = originalTop;
        tf.textPath.width = originalWidth;
    }
})();

使い方

まず、上記のコードをテキストエディタに貼り付けます。

ファイル名は、たとえば以下のようにします。

テキストボックスの高さを行末に揃える.jsx

保存後、Illustratorで対象のエリア内文字を選択します。

その状態で、Illustratorのメニューから以下を実行します。

ファイル > スクリプト > その他のスクリプト

作成したJSXファイルを選択すると、処理が実行されます。

処理が終わると、変更件数とスキップ件数がアラートで表示されます。

処理対象はエリア内文字のみ

このJSXは、Illustratorのエリア内文字だけを対象にしています。

以下のようなものは処理されません。

  • ポイント文字
  • 図形
  • 画像
  • グループ化されたオブジェクト
  • 空のテキストボックス

選択した中に対象外のオブジェクトが含まれていても、スクリプトは停止せず、スキップ件数としてカウントされます。

なぜアウトライン化しているのか

このJSXでは、テキストフレームを一度複製し、その複製をアウトライン化しています。

理由は、テキストボックス自体の高さではなく、実際に表示されている文字の下端を取得したいからです。

Illustratorのテキストボックスには、文字が存在しない余白部分も含まれます。

そのため、テキストボックスのサイズだけを見ても、実際の行末位置は正確に判断できません。

そこで、複製したテキストをアウトライン化し、アウトライン化されたオブジェクトの geometricBounds を取得しています。

var outlined = dup.createOutline();
var gb = outlined.geometricBounds;
var textBottom = gb[3];

geometricBounds は、オブジェクトの境界情報を取得するための値です。

このスクリプトでは、下端の値である gb[3] を使って、文字の下端位置を判断しています。

下余白を追加している理由

このJSXでは、文字の下端にぴったり合わせるのではなく、少しだけ下余白を追加しています。

var bottomPadding = 3;

これは、行末がテキストボックスに隠れてしまうのを防ぐためです。

フォントや行間、文字サイズによっては、完全にぴったり合わせると下端が少し詰まって見えたり、文字の一部が隠れる場合があります。

そのため、初期値では 3pt の余白を追加しています。

もし行末が隠れる場合は、以下の数値を 3〜6 程度に増やすと調整しやすいです。

var bottomPadding = 3;

位置と幅を戻している理由

テキストボックスの高さを変更すると、環境や状態によって位置や幅に影響が出る可能性があります。

そのため、処理前に以下の値を保存しています。

var originalTop = tf.top;
var originalLeft = tf.left;
var originalWidth = tf.textPath.width;

そして、高さを変更したあとに、位置と幅を戻しています。

tf.left = originalLeft;
tf.top = originalTop;
tf.textPath.width = originalWidth;

これにより、テキストボックスの位置や横幅を維持したまま、高さだけを調整できます。

複数選択にも対応

このJSXは、複数のテキストボックスを選択した状態でも実行できます。

選択されたオブジェクトを順番に確認し、エリア内文字であれば高さを調整します。

for (var i = 0; i < sel.length; i++) {
    var tf = sel[i];

    if (!isAreaText(tf)) {
        skipped++;
        continue;
    }

    try {
        fitAreaTextHeight(tf, bottomPadding);
        changed++;
    } catch (e) {
        skipped++;
    }
}

対象外のオブジェクトや、処理できなかったオブジェクトはスキップされます。

最後に、変更した件数とスキップした件数が表示されます。

注意点

このJSXは便利ですが、いくつか注意点があります。

まず、対象はエリア内文字のみです。

ポイント文字には対応していません。

また、アウトライン化した複製を使って文字の下端を取得しているため、特殊なテキスト表現や複雑なアピアランスを使っている場合は、想定通りの高さにならない可能性があります。

元のテキスト自体をアウトライン化するわけではなく、複製したものをアウトライン化して削除しているため、元データの文字編集状態は維持されます。

ただし、大量のテキストを一括処理する場合は、念のためファイルを保存してから実行するのがおすすめです。

まとめ

Illustratorでエリア内文字を使っていると、テキストボックスの高さを行末に揃える作業が地味に発生します。

XDのように、テキスト量に合わせて自然に高さを調整できると便利ですが、Illustratorでは手作業になることが多いです。

今回のJSXを使うと、選択したエリア内文字の高さを、実際の文字の下端に合わせて自動調整できます。

複数選択にも対応しているので、デザイン作業中の細かい整列や余白調整を効率化したいときに便利です。

Illustratorで「こういう小さい機能がほしい」と感じている方は、ぜひ試してみてください。

それとこのイラレ職人コロさんのイラレの技はとても参考になります

コメント

タイトルとURLをコピーしました