Skip to content

Instantly share code, notes, and snippets.

@aminophen
Last active December 23, 2020 15:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aminophen/2c093a4a2d42ed527653f0cd25e753ba to your computer and use it in GitHub Desktop.
Save aminophen/2c093a4a2d42ed527653f0cd25e753ba to your computer and use it in GitHub Desktop.
cjk-gs-integrate の仕様 (2016/12/03 03:10)

cjk-gs-integrate.pl のデータベースと symlink / snippet 作成の仕様

拡張子 otf のファイルの場合

データベースのかきかた:

  • 【必須】Name エントリには「TEXMFLOCAL に作りたい symlink 名(dvipdfmx 用 map などにある名称)」を書く。
  • PSName エントリは、Name エントリの内容と実フォントの PostScript Name が異なる場合に書く。
  • 【必須】Class エントリは Adobe-ナントカ1-[Supplement] の「ナントカ」を書く(Japan / GB / CNS / Korea)。
  • Provides エントリは、当該の実フォントを代表的な PostScript 標準フォントへのエイリアスに採用したい場合に書く。
    • 複数の実フォントに対して同じエイリアスが考えられる場合は、Provides(数値) と書いておくと、数値の小さいものが優先される。
  • 【必須】Filename エントリは候補となるファイル名を書く。
    • ファイル名が複数ありうる場合は Filename(数値) と書いて列挙しておくと、数値の小さいものが優先される。

symlink / snippet のつくりかた:

  • Name / Class / Filename が最低限そろっていることを確認して処理開始。
  • フォントデータベースをパースし、内部的に一旦保存する。
    • 個別フォントのインデックスは PSName エントリ(なければ Name エントリを流用)
      • 以下これは realfontname と呼ばれる
    • 特定のフォントに対しては、以下の項目を取得する:
      • origname = Name エントリ(つまり TEXMFLOCAL に作りたい symlink 名)
      • class = Class エントリ
      • files = Filename すべて
      • provides = Provides すべて
  • files のリストをすべて kpathsea で探索
    • 内部的にデータベースに追記
      • target = 見つかった実ファイルの場所
  • 見つかったファイルに対して実際の処理
    • gs の Resource/CIDFont に symlink を張る (realfontname => target)
    • gs の Resource/Font に realfontname-encoding というファイル名の snippet を多数作成
      • 中身は realfontname と encoding を使って書かれる
    • 当該フォントが最優先の provides ならば、gs の Resource/Font にエイリアス用 snippet も作成
      • 中身は realfontname と encoding を使って書かれる
    • TEXMFLOCAL に symlink を張る (origname.otf => target)

拡張子 ttc/ttf のファイルの場合

データベースのかきかた:

  • 【必須】Name エントリには実フォントの PostScript Name を書く。
    • このため PSName エントリはそもそも要らないし使われない。
  • 【必須】Class エントリは Adobe-ナントカ1-[Supplement] の「ナントカ」を書く(Japan / GB / CNS / Korea)。
  • Provides エントリは、当該の実フォントを代表的な PostScript 標準フォントへのエイリアスに採用したい場合に書く。
    • 複数の実フォントに対して同じエイリアスが考えられる場合は、Provides(数値) と書いておくと、数値の小さいものが優先される。
  • 【必須】Filename エントリは候補となるファイル名を書く。
    • ファイル名が複数ありうる場合は Filename(数値) と書いて列挙しておくと、数値の小さいものが優先される。
    • 最も小さい数値を持つファイル名がそのまま TEXMFLOCAL の symlink 名に採用される。
      • したがって、TEXMFLOCAL に PostScript Name な symlink を作りたい場合は敢えて最小の値を与えて登録しておく。

symlink / snippet のつくりかた:

  • Name / Class / Filename が最低限そろっていることを確認して処理開始。
  • フォントデータベースをパースし、内部的に一旦保存する。
    • 個別フォントのインデックスは(そもそも PSName エントリがないので)自動的に Name エントリ
      • 以下これは realfontname と呼ばれる
    • 特定のフォントに対しては、以下の項目を取得する:
      • origname = Name エントリ(つまり PostScript Name)
      • class = Class エントリ
      • files = Filename すべて
      • provides = Provides すべて
      • ttfname = 最小の数値を持つ Filename エントリ(拡張子 .ttf 込み)
  • files のリストをすべて kpathsea で探索
    • 内部的にデータベースに追記
      • target = 見つかった実ファイルの場所
  • 見つかったファイルに対して実際の処理
    • gs の Resource/CIDSubst に symlink を張る (ttfname => target)
    • gs の Resource/Font に realfontname-encoding というファイル名の snippet を多数作成
      • 中身は realfontname と encoding を使って書かれる
    • 当該フォントが最優先の provides ならば、gs の Resource/Font にエイリアス用 snippet も作成
      • 中身は realfontname と encoding を使って書かれる
    • TEXMFLOCAL に symlink を張る (ttfname => target)
@aminophen
Copy link
Author

aminophen commented Dec 9, 2016

より詳しく具体例で上の問題を説明する。


cjk-gs-integrate の database を parse するコードを、全体的に書き直しました。今までのコードには、以下の問題がありました。

[1] OTC と TTC が区別できない。たとえば、database が以下の内容だとします。

Name: HiraMinProN-W3
Class: Japan
Provides(30): Ryumin-Light
Provides(30): RyuminPro-Light
Filename(20): ヒラギノ明朝 ProN W3.otf
Filename(19): ヒラギノ明朝 ProN W3.otf
Filename(10): HiraMinProN-W3.otf
Filename(30): ヒラギノ明朝 ProN W3.ttc(0)
Filename(29): ヒラギノ明朝 ProN W3.ttc(0)
Filename(28): HiraginoSerif-W3.ttc(0)

Name: IPAexMincho
Class: Japan
Provides(100): Ryumin-Light
Provides(100): RyuminPro-Light
Provides(100): FutoMinA101-Bold
Provides(100): FutoMinA101Pro-Bold
Filename(20): ipaexm.ttf

スクリプトを OS X Yosemite で実行すると、コンピュータから「ヒラギノ明朝 ProN W3.otf」と「ipaexm.ttf」が見つかります。この場合、Ryumin-Light の alias は「HiraMinProN-W3」になるので gs は ok です。

しかし、スクリプトを OS X El Capitan で実行すると、コンピュータから「ヒラギノ明朝 ProN W3.ttc」と「ipaexm.ttf」が見つかります。この場合、Ryumin-Light の alias は「HiraginoSerif-W3.ttc」になりますが、gs は OpenType Collection (OTC) を使えないのでよくないです。だから、OTC の場合は alias を決めるときに無視するほうがよいです。

[2] symlink が .ttc → .ttf に張られる場合がある。たとえば、database が下のようになっているとき

Name: YuGothic-Regular
Class: Japan
Provides(60): GothicBBB-Medium
Provides(60): GothicBBBPro-Medium
Filename(20): yugothic.ttf
#Filename(10): YuGothic-Regular.ttf
Filename(30): YuGothR.ttc(0)

コンピュータに YuGothR.ttc だけが見つかると、symlink は yugothic.ttf => YuGothR.ttc になります。このような TTF → TTC の symlink ができるのはよくないです。


この問題を解決するために、スクリプトを書き直しました。

[1] database の Filename: entry を廃止(backward compatibility のため、database を parse する関数は Filename: entry を解釈できるように残す)。新しく OTFname: OTCname: TTCname: TTFname: のどれかを使う。

[2] priority number で symlink を決めるとき、TTF / TTC / OTC の名前を別々に save する。複数見つかったら、その中でいちばん小さな priority number の type で決められた symlink の名前を使う。

[3] OTC フォントの場合は、gs の Resource に何も作らない(単にスキップする)。alias を決めるときもスキップする。

@aminophen
Copy link
Author

2016年に書いたときの状況からかなり変化したので:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment