texjporg / cjk-gs-support

Scripts to ease the use of CJK fonts with Ghostscript
32 stars 10 forks source link

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

Open aminophen opened 7 years ago

aminophen commented 7 years ago

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

必要な処理は

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

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


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

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

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

trueroad commented 5 years ago

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

trueroad commented 5 years ago

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

aminophen commented 5 years ago

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

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

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

aminophen commented 5 years ago

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

trueroad commented 5 years ago

[1] については、

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

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

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

aminophen commented 5 years ago

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

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

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

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

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

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

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

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

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

trueroad commented 5 years ago

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

やっぱりそうですかね…。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 の範囲を取り出して、こういったリストを使って判定するしかないかなと思います。