InDesignの合成フォントの挙動と名前を変更するスクリプト

2024年03月28日

以前、合成フォント内のフォントを置き換えるスクリプトを作ったんですが、今回はフォント名を変えるスクリプトです。きっかけはこちらです。

合成フォント名InDesignの操作画面からは変更できないんですよね。理由は合成フォントの仕組みにあります。

合成フォント作成時の挙動

アプリケーションデフォルト(ドキュメントを何も開いていない状態)で作成した合成フォントは環境設定ファイル(「InDesign Defaults」ファイル)内に保存されます。このファイルは次のフォルダにあります。

Windowsの場合
C:\Users\[UserName]\AppData\Roaming\Adobe\InDesign\[Version]\ja_JP\
Macの場合
/Users/[UserName]/Library/Preferences/Adobe InDesign/[Version]/ja_JP/

さらに、同じ階層にある「AdobeFntComposite.lst」ファイルにも保存されます。このファイルはテキストファイルで、合成フォントがない状態では次のようになっています。

%!Adobe-FontList 1.23
%Locale:0x411

ここで「デフォルトのコピー」という名前の合成フォントを作成すると、次のように記述が追加されます。なお、エンコードUTF-8です。

%!Adobe-FontList 1.23
%Locale:0x411

%BeginFont
Handler:DirectoryHandler
FontType:Rearranged
FontName:ATC-30c730d530a930eb30c8306e30b330d430fc
FamilyName:<30C7><30D5><30A9><30EB><30C8><306E><30B3><30D4><30FC>
FullName:<30C7><30D5><30A9><30EB><30C8><306E><30B3><30D4><30FC>
MenuName:デフォルトのコピー
StyleBits:0
FamilyNameNative:デフォルトのコピー
StyleNameNative:
FullNameNative:デフォルトのコピー
OutlineFileName:C:\Users\CS5\AppData\Roaming\Adobe\InDesign\Version 18.0-J\ja_JP\CompositeFont\デフォルトのコピー
DataFormat:sfntData
ComponentFont:KozMinPr6N-Regular-UniJIS-UTF16-H
ComponentFont:KozMinPr6N-Regular-UniJIS-UTF16-H
ComponentFont:KozMinPr6N-Regular-UniJIS-UTF16-H
ComponentFont:KozMinPr6N-Regular-UniJIS-UTF16-H
ComponentFont:MinionPro-Regular-UniJIS-UTF16-H
ComponentFont:MinionPro-Regular-UniJIS-UTF16-H
hasSVG:no
VariableFontType:NonVariableFont
FileLength:6967
FileModTime:1711533082
WeightClass:400
WidthClass:5
AngleClass:0
%EndFont

そして、環境設定やこのファイルと同じ階層にある「CompositeFont」フォルダ内に「デフォルトのコピー」というファイルが作成されます。作成されたファイルはフォントファイルと思われます(以下、このブログではこのファイルをフォントファイルと記述します。正しくないかもしれませんが、名前がないと説明しづらいので)。バイナリ形式ですが、大部分読めますので興味のある方は解析してみてください。

AdobeFntComposite.lst」ファイル内の「OutlineFileName:」の記述がフォントファイルのフルパスですね。

このことかInDesignの合成フォントは、一旦フォントファイルを作成し、それを読み込んでいると思われます。そうすることで他にインストールされているフォントと同じ扱いをすることできるのかな。

最初に引用しX(Twitter)のポストですが、そこの続きにものかのさんと合成フォント名の使用文字制限について話をしています。実は合成フォント名には使えない文字というのがあります。それが次の文字です。

" % & ( ) * . / : < > ? [ \ ] _ { | }

ここまでの挙動を見ると次の理由で文字が制限されていると考えられます。

PostScript名の制限

フォント名に使用できない文字。次の文字が該当します。

[ ] ( ) { } < > / %
Windowsのファイルシステムによる制限

ファイル名やフォルダ名に使用できない文字。次の文字が該当します。

\ / : * ? " < > |

Macのファイルシステムの制限は「:」だけなのWindowsのファイルシステムの制限に含まれます。

&」と「.」と「_」はこれには含まれていません。何か理由があるのだろうと思いますが、思いつきません。

また、Windowsの場合は次のファイル名を使用することができません(大文字と小文字を区別しない)。

AUX COM0 ~ COM9 CON LPT0 ~ LPT9 NUL PRN

合成フォント名に使用しようとすると入力・保存はできます。

しかし、[OK]ボタンをクリックして閉じようとすると次のメッセージが出て保存できません。

このとき「AdobeFntComposite.lst」には次の内容が書き込まれています。

%BeginFont
Handler:DirectoryHandler
FontType:Invalid
OutlineFileName:C:\Users\CS5\AppData\Roaming\Adobe\InDesign\Version 18.0-J\ja_JP\CompositeFont\dummyFont
FileModTime:1711534836
%EndFont

すなわち、一旦「dummyFont」というフォント名で書きこまれて完了しなかった、ということですね。

Macの場合はこのファイル名の制限を受けないので作成できるはずですが、データのやり取りが発生する環境であれば使用してはいけませんね。(まあ、合成フォントの内容がわからないし、用途を示すものでもないので、使う人はまずいないと思いますが)

あと、Macの場合、フォントファイル名NFC正規化の影響を受けるわけですが、その辺はうまくやっているようです(多OS側でやっている気がする)。

InDesignを終了すると、「CompositeFont」フォルダ内のファイルはすべて削除されます。しかし、環境設定ファイル内の記述、「AdobeFntComposite.lst」内の記述は残ります。

作成した合成フォントを削除すると、合成フォントのダイアログを閉じた瞬間にフォントファイルが削除されます。しかし、環境設定ファイル内の記述と「AdobeFntComposite.lst」内の記述は残ったままになっています(InDesign 2023 Ver.18.3で確認)。

実は「AdobeFntComposite.lst」ファイルはどんどん合成フォントの記述が増えていくだけで、記述が削除されることはありません。合成フォントを構成するフォントを変更すると、その部分は書き換えられます。このファイルは削除してInDesignの起動時に勝手に作成されますので、不調を感じたら削除しても構わないと思います。たぶん関係ないと思いますが。

以上、アプリケーションデフォルトの合成フォントの挙動でした。


続いてドキュメント内の合成フォントの挙動ですが、基本的にアプリケーションの場合と同じです。

ドキュメントを開いた状態で合成フォントを作成するとドキュメント内に情報が書き込まれます。「AdobeFntComposite.lst」に情報が追加され、「CompositeFont」フォルダ内にフォントファイルが作成されます。

ドキュメントを閉じるとフォントファイルは削除されますが、「AdobeFntComposite.lst」内の記述は残ります。ドキュメントを開くとまたフォントファイルが作成されます。合成フォントを削除するとフォントファイルは削除されます。ドキュメント内の記述はどうなっているのかは分かりません。どのような形で書き込まれているか分からないからです。「AdobeFntComposite.lst」内の記述は残ったままです。環境設定ファイルには書き込まれていないようです。

では、ドキュメントとアプリケーションで合成フォント名がかぶったらどうなるのか。試してみました。

まずドキュメントで「abcdeCompFont」という合成フォントを作ります。中身は適当にいじります。このドキュメントを保存して閉じます。続いてドキュメントを開いていない状態で同じ名前の合成フォントを作ります。中身はデフォルトのままにしました。これで名称が同じで内容が異なる2つの合成フォントができたわけです。

この状態で、保存していたドキュメントを開きます。合成フォント名が競合しますね。

このように名称変更が行われます。

実は合成フォント名にはもうひとつ制限があります。それは、合成フォント名の長さ28文字までということです。これが何に由来するか分かりませんが、28文字の合成フォント名が競合すると、文字が追加されるのではなく末尾が変更されます。

以上のように合成フォント名というのは、色々制約があるのでうかつに名称変更すると危険だということがわかります。そのためあえて名称変更の機能を付けていないのではないかと考えられます。

ところが、スクリプトでは特別なことをしなくても名称を変更できてしまいます。これInDesignには割とあることで、実は内部では機能制限せず、操作画面で機能制限をかけているパターンです。一種のバグと言えなくもないですね。

そんなわけで、合成フォント名を変更するスクリプトです。今回はドキュメントに含まれる合成フォントのみを対象にしました。アプリケーションデフォルトの合成フォントはその必要がないだろうという判断です。


改良版のスクリプトを公開しましたので、こちらで公開していたスクリプトは公開を停止しました。今後修正等があった場合は新しいページの方で更新していきます。