単一行の2Dポイントテキストで揃えと位置を補正する
対象は、親のない2Dポイントテキストを1行で入力した練習レイヤーです。
位置の数値を固定する方法ではなく、揃え変更で動いた文字の矩形を補うように位置を変更します。
別名保存した練習コンポで、クリックして横書きの「AB」を入力し、左揃え・位置300,200・スケール100%・回転0度にします。
レイヤーを選択し、下のコードをalign-text.jsxとしてUTF-8で保存して「ファイル」→「スクリプト」→「スクリプトファイルを実行」から実行します。
初期設定は中央揃えで、変更前後の文字の左上がコンポ内で同じ位置にあるか確認します。
(function () {
var TARGET = ParagraphJustification.CENTER_JUSTIFY;
var comp = app.project && app.project.activeItem;
if (!(comp instanceof CompItem)) { alert("Open a composition."); return; }
var layers = comp.selectedLayers, targets = [], i;
if (!layers.length || layers.length > 20) { alert("Select 1 to 20 practice text layers."); return; }
function staticProp(prop) { return prop && !prop.numKeys && prop.expression === ""; }
for (i = 0; i < layers.length; i++) {
var layer = layers[i];
if (!(layer instanceof TextLayer) || layer.locked || layer.threeDLayer || layer.parent ||
layer.autoOrient !== AutoOrientType.NO_AUTO_ORIENT) {
alert("Use unlocked, unparented 2D text with auto-orient disabled."); return;
}
var text = layer.property("ADBE Text Properties"), source = text.property("ADBE Text Document");
var transform = layer.property("ADBE Transform Group");
var pos = transform.property("ADBE Position"), scale = transform.property("ADBE Scale");
var rot = transform.property("ADBE Rotate Z"), anchor = transform.property("ADBE Anchor Point");
var doc = source.value;
if (!staticProp(source) || !staticProp(pos) || !staticProp(scale) || !staticProp(rot) ||
!staticProp(anchor) || pos.dimensionsSeparated || !doc.pointText || /[\r\n]/.test(doc.text) ||
!doc.text.length || text.property("ADBE Text Animators").numProperties) {
alert("Use single-line point text without keys, expressions, separated position or text animators."); return;
}
targets.push({layer:layer, source:source, pos:pos, before:layer.sourceRectAtTime(comp.time, false),
scale:scale.value, rotation:rot.value, position:pos.value, oldDoc:source.value});
}
app.beginUndoGroup("Change text alignment and compensate position");
try {
for (i = 0; i < targets.length; i++) {
var t = targets[i], doc = t.source.value;
doc.justification = TARGET; t.source.setValue(doc);
var after = t.layer.sourceRectAtTime(comp.time, false);
var dx = (t.before.left - after.left) * t.scale[0] / 100;
var dy = (t.before.top - after.top) * t.scale[1] / 100;
var angle = t.rotation * Math.PI / 180;
var x = t.position[0] + dx * Math.cos(angle) - dy * Math.sin(angle);
var y = t.position[1] + dx * Math.sin(angle) + dy * Math.cos(angle);
if (!isFinite(x) || !isFinite(y)) { throw new Error("Invalid bounds or position."); }
t.pos.setValue([x, y]);
}
} catch (error) {
alert("Stopped. Some text may have changed. Undo or reopen your practice copy.\n" + error);
} finally { app.endUndoGroup(); }
}());
sourceRectAtTimeで変更前後の矩形を読み、ローカル座標の差へX/Yスケールと回転を適用して位置に加えます。
例えば矩形のleftが0から−50へ変わり、スケール100%・回転0度なら、位置Xの補正量は+50です。
同じ差でXスケール200%なら+100、回転90度ならY方向へ+100の補正になる数値例です。
実際の矩形幅は文字・フォント・書式で変わるため、例の50をコードに固定していません。
右揃えはTARGETをParagraphJustification.RIGHT_JUSTIFY、左揃えはParagraphJustification.LEFT_JUSTIFYへ変更して使います。
段落テキスト、改行を含む文字、3D、親付き、自動方向、テキストアニメーター、位置の次元分割、対象のキーや既存式があると書き込み前に停止します。
位置・スケール・回転・アンカーポイント・ソーステキストは静的な値を使い、アニメーションを含む作品へそのまま適用しないでください。
輪郭や影などの効果を含む描画ピクセルの一致、縦組みや複雑な混在書式は未検証なので、単純な練習文字で確認します。
途中停止で揃えだけ変わった場合も、Ctrl+Z/Command+Zを1回実行して揃え・位置の両方を照合するか、練習コピーを開き直します。
2026年10月14日、Windows 11 Pro(OSビルド26200)・After Effects 26.5(26.5×89、Build 89)で、以下のABの揃え変更・PNG出力・取り消しを確認しました。
| 入力・条件 | 操作・結果 | 確認する点 |
|---|---|---|
| 1行・2D・親なし | 矩形差を位置で補正 | 文字の見た目と座標を照合 |
| Xスケール200%・回転90度 | 差50をYへ100補正 | 数値例は実機撮影ではない |
| キー・式・3D・段落 | 処理を開始しない | 対象条件を確認 |
参照:コミュニティ管理のsourceRectAtTimeとTextDocument。
資料確認日:2026年10月3日。
旧記事の途切れたfor文と、スケール・回転を考慮しない固定補正を置き換えました。
旧実装の参考コードはGitHubに残っていますが、本稿の修正版とは内容が異なります。
Windowsで揃え変更前後を比較
960×540、30fps、2秒のコンポに、Yu Gothic Bold・80px・白塗りの「AB」を入力しました。単一行の横書きポイントテキストで、親・キー・式・アニメーター・輪郭・影はありません。アンカーポイント0,0、位置300,200、スケール100%、回転0度から始めます。
左揃えの文字矩形はleft=1.8359375、幅105.7421875でした。本文の中央揃えコードを実行すると、leftは−53.96484375になり、位置Xは300から355.80078125へ補正されました。位置Yは200のままです。画面上のABは同じ場所にあり、変更前後のPNGの全画素も一致しました。


見た目を保つために位置の数値が変わるので、Xが300のままかどうかで成否を判定しないでください。また、このフォントでの補正量は55.80078125でした。文字幅の半分を固定値として足すのではなく、コードが取得した変更前後のleft差を使います。
中央揃えへの変更直後にCtrl+Zを1回実行すると、左揃え・位置300,200へ戻りました。続いてXYスケールを200%、回転を90度にした同じ文字でも確認しました。左揃えから中央揃えでは位置300,311.6015625、さらにTARGETをRIGHT_JUSTIFYへ変更して右揃えにすると300,423.203125になりました。3つの揃えでPNGの全画素は一致しています。
親のある文字では、Use unlocked, unparented 2D text with auto-orient disabled.というメッセージで止まりました。このケースでは実行前後の位置と右揃え設定は変わりませんでした。作品の親子関係を外して試す前に、親のない練習レイヤーで手順を確認してください。
PNGの一致は、上記の単純なABと2つのスケール・回転条件での結果です。他フォント、縦組み、混在書式、輪郭・影、多数の選択レイヤー、すべての入力拒否条件、途中例外、Mac・他バージョンは未検証です。文字や効果を追加した作品全般での一致を保証する結果ではありません。
文字の揃えを設定する機能はAdobe公式の段落パネル資料でも確認できます。本稿のコードは、その揃え変更に位置補正を組み合わせています。
関連記事
対象の異なる操作は、以下の記事で確認できます。





