Open aminophen opened 7 years ago
[1] で一番手っ取り早いのは fontconfig の設定にディレクトリを追加してしまう(09-texlive.conf
のように)だと思いますが、それをせずに実現したいということでしょうか。
スクリプトではできないかもしれませんが fontconfig の API に FcConfigAppFontAddDir ()
というのがあって、自前のフォントディレクトリを追加することができます。
https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcconfigappfontadddir.html
LilyPond はこれを使って自分がもっている音符フォントのディレクトリを追加しています。(音符フォントは他のアプリでは使いでが無いでしょうから、こうして他のアプリから見えないけど、自分は fontconfig 経由で使えるようにしているのだと思っています。)
[2] ですが、 fontconfig の API で
FcFreeTypeCharSet ()
https://www.freedesktop.org/software/fontconfig/fontconfig-devel/fcfreetypecharset.html
を使えば、そのフォントが持っている Unicode の範囲が得られるので、それで判定する、とかかなぁと思います。源ノフォントはCJK全部入り、という結果になるのだと思います。
issue を建ててから時間が経って放置していました。コメントありがとうございます。
いま私のところでは,tools ディレクトリに置いてある fontlist_mac.sh および fontquery.sh というスクリプトを使っています。ただし,
du
で一覧化。du
で出力されたファイル一覧のうち,ファイルサイズが大きいものを恣意的に選んで数を絞った後で,fc-query
コマンドで lang を見て,という風に,結局まだ手作業が多いままです。
fontconfig に頼らない手段があれば better で,いま有力なのは texlua スクリプトです。database/ ディレクトリに zrlistttc.lua が置かれていますが,これを使えば [3] OTF/TTF/TTC/OTC の区別と [4] PSName の取得は出来ています。あとは [1] と [2] の処理が出来るようになればいいな,と思っているところです。
[1] については、
ということだとすると、現在お使いのような、候補になりうるディレクトリを列挙したデータベースを作っておく方法ぐらいしかないとおもいます。TEXMF については kpsewhich --var-value=TEXMF
の出力を取り込んで使うとかでいいんでしょうけども…。もし、fontconfigなら正解を知っている、ということであれば、 fc-cache -v
の出力を取り込むなどの方法が取れると思います。
texlua で外部コマンド実行して、その標準出力をパースする、とかができるのであれば、一応 texlua スクリプトでもできる、と言っていいかどうか微妙ですかね。。。 luatex は fontconfig を使っていると思うので、 texlua があるのなら fontconfig もあるんだろうと想像しています。 texlua から fontconfig の API が呼び出せればもっといいんですが。
[2] については、「見破る」のを自動化するのはかなり困難ですよね。。。fc-query の lang が何を元にして表示してるものなのかよくわからなので何とも言えませんが。。。
候補になりうるディレクトリを列挙したデータベースを作っておく方法ぐらいしかない
やっぱりそうですかね…。fontconfig が正解を知っているかどうかもよくわかりません(少なくとも macOS では fontconfig が標準装備されていないし,システムフォントと無関係のはずです)。
texlua で外部コマンド実行して、その標準出力をパースする
これは想定内でした。今考えたのですが,例えば
とすれば,[1] と [2] の途中まで出来るような気がしますね。
luatex は fontconfig を使っていると思う
LuaTeX は fontconfig を使っていません。luaotfload や context の texlua スクリプトが独自にフォントを頑張ってパースしています。
fc-query の lang が何を元にして表示してるものなのか
これさえわかれば,それと同じようなことを texlua で実装すればいいので,「見破る」はさすがに無理でも,全部手作業よりは幾分ラクになると思います。
候補になりうるディレクトリを列挙したデータベースを作っておく方法ぐらいしかない
やっぱりそうですかね…。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 の範囲を取り出して、こういったリストを使って判定するしかないかなと思います。
データベースをいちいち作るのがめんどくさくなってきたので,「スクリプトを走らせると,見つかる全ての CJK フォントに対するデータベースを作る」というようなことができないか?と考え始めています。
必要な処理は
ということになると思いますが,何か良い案はないでしょうか?
(さすがに Provides を自動生成するのは無理そうなので,それは手動になるでしょう。)
最初に思いついたのは fontconfig ですが
fontformat=CFF
かfontformat=TrueType
かでわかる。postscriptname
とid
でわかる。という感じです。[2] のやり方がわからないのと,[1] の「fontconfig に TEXMF ツリーも探させるやり方」がわかれば進むかもしれません。
他のやり方があれば提案していただけると助かります。LuaTeX あるいは XeTeX でこのような処理ができれば better だと思うので,そういうのがあればありがたいです。