Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

データベースの生成スクリプト #27

Open
aminophen opened this issue Nov 1, 2017 · 7 comments
Open

データベースの生成スクリプト #27

aminophen opened this issue Nov 1, 2017 · 7 comments

Comments

@aminophen
Copy link
Member

データベースをいちいち作るのがめんどくさくなってきたので,「スクリプトを走らせると,見つかる全ての CJK フォントに対するデータベースを作る」というようなことができないか?と考え始めています。

必要な処理は

  • [1] cjk-gs-integrate のサーチ対象になるディレクトリにある全フォントのうち
  • [2] 日本語・中国語・韓国語に使えるフォントに絞り,(このとき Class を得る)
  • [3] それが OTF/OTC/TTF/TTC のどれかを判定し
  • [4] PSName を(及びコレクションの場合は index も)出力する

ということになると思いますが,何か良い案はないでしょうか?

(さすがに Provides を自動生成するのは無理そうなので,それは手動になるでしょう。)


最初に思いついたのは fontconfig ですが

  • fc-list すれば [1] は一部実現できそう(ただし,TEXMF ツリーを探すために別途設定が必要なはず)
  • fc-query などを使えば [3] や [4] はできるかも
    • OTC/TTC の判定は fontformat=CFFfontformat=TrueType かでわかる。
    • PSName と index はそれぞれ postscriptnameid でわかる。

という感じです。[2] のやり方がわからないのと,[1] の「fontconfig に TEXMF ツリーも探させるやり方」がわかれば進むかもしれません。

他のやり方があれば提案していただけると助かります。LuaTeX あるいは XeTeX でこのような処理ができれば better だと思うので,そういうのがあればありがたいです。

@trueroad
Copy link
Member

trueroad commented Nov 9, 2019

[1] で一番手っ取り早いのは fontconfig の設定にディレクトリを追加してしまう(09-texlive.conf のように)だと思いますが、それをせずに実現したいということでしょうか。
スクリプトではできないかもしれませんが fontconfig の API に FcConfigAppFontAddDir () というのがあって、自前のフォントディレクトリを追加することができます。
https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcconfigappfontadddir.html
LilyPond はこれを使って自分がもっている音符フォントのディレクトリを追加しています。(音符フォントは他のアプリでは使いでが無いでしょうから、こうして他のアプリから見えないけど、自分は fontconfig 経由で使えるようにしているのだと思っています。)

@trueroad
Copy link
Member

trueroad commented Nov 9, 2019

[2] ですが、 fontconfig の API で
FcFreeTypeCharSet ()
https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcfreetypecharset.html
を使えば、そのフォントが持っている Unicode の範囲が得られるので、それで判定する、とかかなぁと思います。源ノフォントはCJK全部入り、という結果になるのだと思います。

@aminophen
Copy link
Member Author

aminophen commented Nov 9, 2019

issue を建ててから時間が経って放置していました。コメントありがとうございます。

いま私のところでは,tools ディレクトリに置いてある fontlist_mac.sh および fontquery.sh というスクリプトを使っています。ただし,

  • [1] は fontlist_mac.sh を使用 …
    • 真面目に考えず,macOS のフォントディレクトリだけをハードコードして du で一覧化。
    • TEXMF 以下に CJK フォントが増えることはほぼ無いので無視できる。
  • [2] は3段階 …
    • ① 上記 du で出力されたファイル一覧のうち,ファイルサイズが大きいものを恣意的に選んで数を絞った後で,
    • ② fontquery.sh を使用;つまり fontconfig の fc-query コマンドで lang を見て,
    • ③ たまに lang が嘘をつく(簡体字 GB = zh-cn と繁体字 CNS = zh-tw が滅茶苦茶な場合がある)のを見破る
  • [3][4] は fontquery.sh を使用 …
    • fontformat を見れば OpenType と TrueType を区別でき,postscriptname がそのまま PSName になる

という風に,結局まだ手作業が多いままです。

@aminophen
Copy link
Member Author

fontconfig に頼らない手段があれば better で,いま有力なのは texlua スクリプトです。database/ ディレクトリに zrlistttc.lua が置かれていますが,これを使えば [3] OTF/TTF/TTC/OTC の区別と [4] PSName の取得は出来ています。あとは [1] と [2] の処理が出来るようになればいいな,と思っているところです。

@trueroad
Copy link
Member

trueroad commented Nov 9, 2019

[1] については、

  • サーチ対象ディレクトリは環境によって異なる
  • 誰も正解を知らない
    • 未知の新しい環境などではどうなっているか不明

ということだとすると、現在お使いのような、候補になりうるディレクトリを列挙したデータベースを作っておく方法ぐらいしかないとおもいます。TEXMF については kpsewhich --var-value=TEXMF の出力を取り込んで使うとかでいいんでしょうけども…。もし、fontconfigなら正解を知っている、ということであれば、 fc-cache -v の出力を取り込むなどの方法が取れると思います。

texlua で外部コマンド実行して、その標準出力をパースする、とかができるのであれば、一応 texlua スクリプトでもできる、と言っていいかどうか微妙ですかね。。。 luatex は fontconfig を使っていると思うので、 texlua があるのなら fontconfig もあるんだろうと想像しています。 texlua から fontconfig の API が呼び出せればもっといいんですが。

[2] については、「見破る」のを自動化するのはかなり困難ですよね。。。fc-query の lang が何を元にして表示してるものなのかよくわからなので何とも言えませんが。。。

@aminophen
Copy link
Member Author

候補になりうるディレクトリを列挙したデータベースを作っておく方法ぐらいしかない

やっぱりそうですかね…。fontconfig が正解を知っているかどうかもよくわかりません(少なくとも macOS では fontconfig が標準装備されていないし,システムフォントと無関係のはずです)。

texlua で外部コマンド実行して、その標準出力をパースする

これは想定内でした。今考えたのですが,例えば

  • 探索対象とするディレクトリをハードコードしておいて,それぞれ ls -R する
  • その中の .otf/.ttf/.ttc だけを grep して,フォントファイル名のリストを作る
  • texlua の標準機能でファイルサイズを計測して,CJK っぽい大きな物だけに絞る

とすれば,[1] と [2] の途中まで出来るような気がしますね。

luatex は fontconfig を使っていると思う

LuaTeX は fontconfig を使っていません。luaotfload や context の texlua スクリプトが独自にフォントを頑張ってパースしています。

fc-query の lang が何を元にして表示してるものなのか

これさえわかれば,それと同じようなことを texlua で実装すればいいので,「見破る」はさすがに無理でも,全部手作業よりは幾分ラクになると思います。

@trueroad
Copy link
Member

trueroad commented Nov 9, 2019

候補になりうるディレクトリを列挙したデータベースを作っておく方法ぐらいしかない

やっぱりそうですかね…。fontconfig が正解を知っているかどうかもよくわかりません(少なくとも macOS では fontconfig が標準装備されていないし,システムフォントと無関係のはずです)。

Windows だとシステムフォントのフォルダ名を取得するAPIがあったように記憶しています(とはいえ大抵は C:\Windows\Fonts で決まりだし、決め打ちしたくないなら %WINDIR%\Fonts とかで済むので、いちいち API で取得しない場合が多いとは思います…)。 Linux なら fontconfig がすべてで、fontconfig の API を使えばフォントのディレクトリが得られると思います。 macOS にはその手の API はないのでしょうか。

探索対象とするディレクトリをハードコードしておいて,それぞれ ls -R する

全ディレクトリを探索対象にしてしまう、という荒業もあるかもしれませんね…。

その中の .otf/.ttf/.ttc だけを grep して,フォントファイル名のリストを作る
texlua の標準機能でファイルサイズを計測して,CJK っぽい大きな物だけに絞る

.otf ならば手抜きして、AdobeJapan1 という文字列が存在すれば AJ1 なので日本語フォント、 AdobeGB1 という文字列が存在すれば Adobe-GB1 なので簡体字フォント、AdobeIdentity という文字列が存在すれば AI0 フォント、というような判定も一応可能です。 .ttc でも中身が CFF で、文字コレクションが異なるフォントを一つにまとめることは無いとみなせる、なら同じ方法で判定できます。もちろんホントはちゃんとパースする必要があります…。

LuaTeX は fontconfig を使っていません。luaotfload や context の texlua スクリプトが独自にフォントを頑張ってパースしています。

それは知りませんでした。ということは texlua でフォントファイルをパースすることは可能だし、実際に動作しているコードもある、ということですよね。うまく再利用できれば CFF なら上記の方法(CFF テーブルの文字コレクションを見る)で判定できると思います。 TrueType だと文字コレクション関係ないのでもうひと手間必要になると思いますが。

fc-query の lang が何を元にして表示してるものなのか

これさえわかれば,それと同じようなことを texlua で実装すればいいので,「見破る」はさすがに無理でも,全部手作業よりは幾分ラクになると思います。

ちょっと調べてみましたが、単純に各言語毎に揃っているべき Unicode のリストを持っているだけみたいです。
https://gitlab.freedesktop.org/fontconfig/fontconfig/tree/master/fc-lang
TrueType ならフォントが持っている Unicode の範囲を取り出して、こういったリストを使って判定するしかないかなと思います。

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

No branches or pull requests

2 participants