フォールバック カスタムフォント

  1. どうもお世話になってます

    フォールバックの記事を見ていて
    カスタムフォントは非対応になってますが
    これ対応は無理なんでしょうか?

    好みの白源やUDEV Gothicは円記号の問題でここだけネックでしたが
    思いつきで
    円記号だけのフォントを作りこれをMeryのフォントに登録
    フォールバックでUDEV Gothic(JPDOC版)と保険にMSゴシックとLastResortにすると
    うまく日本語フォント風になり成功
    https://imgur.com/1U37dM2
    理想のフォント表示になったと喜びましたが
    カスタムフォントがフォールバック非対応なので
    ポータブ環境では使えず、ぐぬぬとなってます
    あとフォールバックの所の上下移動ボタンは無くなったのですか?
    ドラッグで移動できるので問題ないのですが
    フォールバックの記事を見ていたのであれ?となりました

     |  kiyohiro  |  返信
  2. ご愛用いただきありがとうございます。

    > フォールバックの記事を見ていてカスタムフォントは非対応になってますがこれ対応は無理なんでしょうか?

    はい。私が調べた限りですと DirectWrite 自体にそういった機能ないので Mery でも対応できない状態です。

    技術的な話になってしまいますが…

    【参考】IDWriteFactory2::GetSystemFontFallback メソッド (dwrite_2.h)
    https://learn.microsoft.com/ja-jp/windows/win32/api/dwrite_2/nf-dwrite_2-idwritefactory2-getsystemfontfallback

    現状、DirectWrite の API は上記の GetSystemFontFallback しか用意されておらず、システムフォント (インストール済みのフォント) からしかフォールバックフォントを取得できません。

    Get'Custom'FontFallback みたいな感じの API を Microsoft が用意してくれると良いのですけれどね。また、他に方法をご存じのかたがいらっしゃったら情報をいただけるとありがたいです。

    > あとフォールバックの所の上下移動ボタンは無くなったのですか?

    はい。オプション画面のスペースの都合により Ver 3.3.2 で上下ボタンは削除して、その代わりにドラッグアンドドロップで移動できるようにしました。

     |  Kuro  |  返信
  3. 回答ありがとうございます
    分かりました
    それなら仕方ないですね
    仕事で使うならUSBメモリに入るPortable対応が必要だったもので
    まあ、家で使う時のフォント問題が解決しただけでも嬉しいです

    もう一つ質問お願いします
    フォントによってルーラーや行間等レイアウトが変わりますが
    これフォントのどの部分で判断してるのでしょうか?
    今回の円記号.ttfは自作で入ってるのは円記号1文字だけ
    等幅とUDEV Gothicの他の記号の大きさのバランスのみ意識したものです
    UDEV Gothicと比べると行間が詰まってしまうので円記号.ttfの修正で行けるなら
    合わせたいです
    よろしくお願いします

     |  kiyohiro  |  返信
  4. DirectWrite は現在でも機能追加されていってるので将来的にはできるようになるかもしれないですね。

    > フォントによってルーラーや行間等レイアウトが変わりますがこれフォントのどの部分で判断してるのでしょうか?

    フォントについては詳しくないので ttf ファイルの仕様までは分かりかねますが、プログラムとしては以下の記事で行間について説明しています。

    https://www.haijin-boys.com/software/mery/mery-2-6-11#:~:text=%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%9F-,GDI%20%E3%81%A7%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E8%A1%8C%E9%96%93,-%E3%81%AF%E3%80%81TEXTMETRIC%20(%E6%96%87%E5%AD%97

    フォントによっては GDI (DirectWrite オフ) と DirectWrite で取得できる行間の情報が異なるケースがあるようですが、Mery の場合、横書き時の行間は DirectWrite のオン・オフにかかわらず GDI の行間を採用しています。

    ルーラーの幅は「0」の文字から取得した幅を基準にしています。

     |  Kuro  |  返信
  5. こんにちは。UDEV Gothicの作者です。

    > UDEV Gothicと比べると行間が詰まってしまうので円記号.ttfの修正で行けるなら
    > 合わせたいです

    FontForgeをお使いなら、
    https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=%A5%D5%A5%A9%A5%F3%A5%C8%A4%CE%B9%E7%C0%AE
    のサイトで紹介されている、「ベースにするフォント(Migu1M)の調整」という章を参考に、そのあたりの各種パラメーターをいじってみると行の高さが変わると思いますので、よければお試しあれ。(フォントフォールバックとの兼ね合いで意図せず高さが変わったりしないかとかは、ちょっと分かりませんが…)

     |  yuko  |  返信
  6. Kuroさん
    yukoさん
    色々アドバイスありがとうございます
    頂いた情報を元に試してみます

    特にUDEVGothicの作者さんはここでよくお見かけするので
    例え1文字でも表示が変わってるので怒られるかな
    でもフォールバック機能なのでok、怒られたた止めようとか考えてました

    FontForgePortable使いました
    しかし今回のフォールバックを使って円記号の変更を思いつき
    1文字位なら簡単かと思い始めたのですが
    完全素人だとむちゃくちゃムズいですね
    2週間ぐらい色んなサイトとにらめっこしてやっと出来ました
    しかも何処をどういじったのか覚えてないので
    教えて頂いたサイトを参考にまた色々試してみます

     |  kiyohiro  |  返信
  7. >> yuko さん

    サポートのご協力ありがとうございます。

    UDEV Gothic、最強です!HackGen と行ったり来たりしてますがどちらも愛用させていただいてます。

    DirectWrite のフォントフォールバックの仕様はブラックボックスなので、フォールバックしたときの行間がどうなるかは謎ですが…

    >> kiyohiro さん

    なんかすごいことやってますねー。

    フォントの制作は未知の領域なのでお役に立てないと思いますが、なければ作るの精神、素敵です。

    Mery の仕様についてなら回答できると思うのでまたお気軽にどうぞー

     |  Kuro  |  返信
  8. 一応完成しました
    https://imgur.com/lPGMZbo
    多分色々間違っていると思いますが
    表示出来てるので後は無視
    と言うかもう触りたくない
    素人は手を出すべきではなかった
    まず、FontForgeの使いかたが分からない
    ググっても情報が少なく古い
    専門用語だらけで設定が多すぎ
    正解の数値か分からないので適当
    少し変更したらフォント生成してMeryで確認の繰り返し
    たった1文字で死にかけました

    > ルーラーの幅は「0」の文字から取得した幅を基準にしています。
    円記号.ttfは
    円記号しか入ってないので
    https://imgur.com/7mXMMaf
    ルーラーと行番号は
    フォールバックのUDEV Gothic(JPDOC版)
    で表示されてるみたい
    行間は
    エレメント -> フォント情報 ->OS/2 -> メトリック
    のWin AscentとWin Descentで設定出来るみたい

    >> yuko さん
    UDEV Gothic(JPDOC版)v1.2.0で○が半角表示されます
    (全角表示されるようになる記号一覧は こちら)には入っているし
    v1.1.0では全角表示でした
    ご確認お願いします。

     |  kiyohiro  |  返信
  9. >> kiyohiroさん

    > 例え1文字でも表示が変わってるので怒られるかな

    いえいえ、オープンソースにしてしまっていますし、自由にご自身の好きなものにしていただいていいと思います。
    その探究心や、あっぱれ!です。

    FontForge、曲者なんですよね。基本的にLinuxのオープンソースツールなので、インストール方法も色々ありますし… バージョンによって、できることやUIなんかも微妙に異なったりして、難解です。

    個人的には、手始めにまず「Em Size」というのをUDEV Gothicと同じ値に調整してみるといいと思います。
    EMはいわば「グリフの縦の解像度」的なものなのですが、EMが異なっていてもフォールバックフォントとの文字サイズが違和感なく調整されているのを見るに、DirectWriteがよしなに拡大・縮小してフォント間のEM差を埋めている気がします。そのときに幅が微妙~にずれたりするんですよね。なので、まずはEMを元フォントとフォールバックフォント間で同じにすると、狙った幅や行間になりやすいのではないかなぁと想像しています。

    > UDEV Gothic(JPDOC版)v1.2.0で○が半角表示されます
    > (全角表示されるようになる記号一覧は こちら)には入っているし
    > v1.1.0では全角表示でした

    そうですね、別口でも報告が上がってきているんですが、JetBrains Monoのアップデートにより一部の記号が半角表示になってしまっているんです。

    ちなみに「全角表示されるようになる記号一覧」に入っているのは、「○ (U+25CB)」ではなく、「◯ (U+25EF)」の方ですね。見た目がややこしいですが別の記号なので、もともと「○ (U+25CB)」の方は全角表示を想定していなかったのです。
    その状況で、JetBrains Monoに「○ (U+25CB)」が新たに追加されてしまったので、意図せず半角化してしまったんですよね。

    このあたりの問題は、こちらで扱っています。 https://github.com/yuru7/udev-gothic/issues/14
    整理しつつ、そのうち「○ (U+25CB)」もJPDOC版では全角にするつもりです。

    >> Kuroさん

    そう言っていただけて何よりです😎
    私も、最近は大抵UDEV Gothicを使っています。HackGenで判読性を上げるべくたくさん癖付けしてきた胃もたれ的な反動か、あっさり癖のないUDEV Gothicはなんだかしっくり来ますw

    ただ、ブラウザのようなメイリオが基本なページ上では違和感強めなので、ブラウザ固定幅フォントだけはPlemolJP 35を使っています。手前味噌ながら、こうやって選択肢が多いのは良いことですね。

     |  yuko  |  返信
  10. >> yuko さん
    回答ありがとうございます
    打ち間違いが多いので
    英字や数字が認識しやすいし日本語も綺麗な
    UDEV GothicやHackGenを使いたいと思ったのですが
    日本語フォントに慣れてるので
    円記号がどうしても違和感が強く何とかならないかと考え
    フォールバック機能を思いつき1文字ならと始めたのですが
    こんなに難しいとは思いませんでしたが
    お2人のアドバイスで何とか日本語フォント風UDEV Gothic表示に成功しました

    ??も少し気になるので(特に半角の方)修正したかったのですが
    1文字で力尽きたので諦めましたが
    > 個人的には、手始めにまず「Em Size」というのをUDEV Gothicと同じ値に調整してみるといいと思います。
    を試してみたいですね
    まあ、しばらくはやる気が出ないですが

    > 「○ (U+25CB)」ではなく、「◯ (U+25EF)」の方ですね。
    別物でしたか○はよく使うので
    変換で○の方が登録されていてそればかりできずきませんでした

     |  kiyohiro  |  返信
  11. >DirectWrite のフォールバック フォントでカスタム フォントを使用できるようにした
    >時間がかかりましたが、ようやく DirectWrite でカスタム フォントにフォールバックする方法を見つけました。

    対応ありがとうございます
    これでポータブル環境でも
    円記号フォントとフォールバックでUDEVGothicJPDOC-Regular.ttf
    を使えるようになり大変助かります

     |  kiyohiro  |  返信
  12. ご返信ありがとうございます。

    > 円記号フォントとフォールバックでUDEVGothicJPDOC-Regular.ttfを使えるようになり大変助かります

    そんな使い方もあるんだなぁ…と思いながら、Ver 3.7.5 ではちょっとマニアックで面白い機能をこっそり追加してみました😉

    新機能は、フォールバック フォントに Unicode 範囲を指定できるというものです。これで、複数のフォントをお好みで組み合わせられるようになります。

    使い方はとっても簡単です。

    まず、[フォールバック フォント] にフォントを追加し、その項目をダブルクリックします。すると、[Unicode 範囲] を入力するダイアログが表示されます。

    たとえば、

    U+3040-309F

    と入力すると、ひらがなだけそのフォントにフォールバックされます。

    カタカナも追加したい場合は、

    U+3040-309F, U+30A0-30FF

    のようにカンマで区切れば OK です。

    さらに、フォールバック フォントの文字サイズも調整できます。

    たとえば、

    U+3040-309F, 125%

    と入力すれば、指定した範囲のフォント サイズを 125% に変更できます。

    サイズだけを調整したい場合は、

    125%

    だけでも大丈夫です。

    同じフォントで Unicode 範囲ごとに複数のサイズを設定したい場合は、[追加] ボタンから同じフォントを複数追加し、それぞれでサイズを設定できます。

    少しマニアックな機能ですが、フォントを自由に組み合わせて楽しみたい方には便利かと思います。

    ただし、フォールバック機能はメインのフォントに存在しない文字にのみ適用される点にご注意くださいね。

    「円記号フォント」のような、ほぼ空っぽのフォント (そんなの作れるの?) が用意できるなら、英数字、ひらがな、カタカナ、漢字、絵文字など、いろいろなフォントを組み合わせて楽しむことができるかもしれません。

    また、合成フォントの制作などにも、実験的な用途として使えるかもしれません。

     |  Kuro  |  返信
  13. おおー、面白い機能ですね😲
    カスタムフォントのフォールバック機能との合わせ技で、まさしく仰るように複数フォントの組み合わせをプレビューしたいような合成フォント職人たちには嬉しい機能かもしれませんw

    その他、英字+日本語文字フォントを従来のフォールバックで組み合わせた際の大きさのバランスが崩れがちな問題を緩和するのに良さそうですね。

    試しに、
    ・Consolas 12pt + フォールバック BIZ UDゴシック 倍率変更なし
    ・Consolas 13pt + フォールバック BIZ UDゴシック 倍率90%
    で比べてみたものが以下です。
    https://imgur.com/a/yTIWX4C

    興味はあるけどよく分からなくて合成フォントは作れない…って方も遊びの幅が広がりそうです!

     |  yuko  |  返信
  14. >そんな使い方もあるんだなぁ…と思いながら、Ver 3.7.5 ではちょっとマニアックで面白い機能をこっそり追加してみました😉
    >新機能は、フォールバック フォントに Unicode 範囲を指定できるというものです。これで、複数のフォントをお好みで組み合わせられるようになります。

    確かに面白い機能ですね
    小説を読むときはZenモード縦書きで
    電撃文庫ラノベ的フォントの源暎ちくご明朝
    で読んでますが数字がイマイチだと思っていたので
    源暎ちくご明朝とフォールバックでUDEVGothicJPDOC-Regular.ttf U+0030-U+0039
    にしたらいい感じです
    ただ、メニュー→表示→フォントで
    普段は
    円記号フォントとフォールバックでUDEVGothicJPDOC-Regular.ttf
    小説を読むときは
    源暎ちくご明朝

    その他と
    フォント使い分けてるので
    そうなると毎回フォールバック設定し直さないといけないので
    フォールバックも保存と読み込み出来て
    メニュー→表示→フォントみたいに簡単に変更できてたら普段遣い出来そうですが
    私みたいにフォント使い分けてる人じゃないと要望出すにしろ需要は少なそうですね

     |  kiyohiro  |  返信
  15. 早速お試しいただき、ありがとうございます。

    >> yuko さん

    ちょっとマニアックな機能なので、初心者の方に「Unicode とは…」と説明してまで使っていただくよりも、こっそり実装するかたちにしました。

    それでも気に入っていただけたようで嬉しいです😁

    > ・Consolas 13pt + フォールバック BIZ UDゴシック 倍率90%

    おおー、素晴らしいですね!倍率を 100% から 90% に変えるだけで、印象が大きく変わり、美しさが際立ちますね。

    Consolas 好きの方には、この組み合わせはかなり刺さりそうです😲

    > 興味はあるけどよく分からなくて合成フォントは作れない…って方も遊びの幅が広がりそうです!

    フォールバック フォントは代替フォントということで、本来、合成フォントのための機能ではないと思いますが、こうした使い方も面白いですよね。

    ただ、フォールバックの仕組み上、「Consolas + フォールバック」は可能でも、「BIZ UDゴシック + フォールバック」はできない (できないわけではありませんが…) ので、そのあたりは初心者の方には難しいかもしれません。

    >> kiyohiro さん

    > 源暎ちくご明朝とフォールバックでUDEVGothicJPDOC-Regular.ttf U+0030-U+0039にしたらいい感じです

    源暎ちくご明朝には数字が含まれているので、フォールバックしても源暎ちくご明朝の数字が優先されると思うのですが…。

    円記号フォント → フォールバックで UDEVGothicJPDOC-Regular.ttf U+0030-U+0039 → フォールバックで源暎ちくご明朝、といった感じで設定されているのでしょうか?

    > そうなると毎回フォールバック設定し直さないといけないのでフォールバックも保存と読み込み出来てメニュー→表示→フォントみたいに簡単に変更できてたら普段遣い出来そうですが私みたいにフォント使い分けてる人じゃないと要望出すにしろ需要は少なそうですね

    そうですね。それに、フォールバック機能自体が初心者の方には難しく、Unicode 範囲の設定はさらに難しいので、あまり目に触れないようにしておきたいところです。

    一応、フォント設定とフォールバック フォントの設定はマクロで操作できるので、よく使う組み合わせを読み込むマクロをメニューに置いておけば、素早く設定できるかもしれません。

    ※ 設定を変更するマクロなので、試す際には [ツール] > [設定の管理] > [設定のエクスポート] でバックアップを取ることをおすすめします。

    たとえば、フォントを Consolas に設定するには以下のようなコードになります:

    editor.WriteSettings();
    editor.WriteSettingString('Display', 'FontName', 'Consolas');
    editor.ReadSettings();

    フォールバック フォントを UDEV Gothic JPDOC U+0030-0039 と源暎ちくご明朝 v3 に設定するには以下のようになります:

    editor.WriteSettings();
    editor.WriteSettingString('Display', 'FallbackFonts', '"UDEV Gothic JPDOC|U+0030-0039","源暎ちくご明朝 v3"');
    editor.ReadSettings();

    二つを同時に設定する場合は:

    editor.WriteSettings();
    editor.WriteSettingString('Display', 'FontName', 'Consolas');
    editor.WriteSettingString('Display', 'FallbackFonts', '"UDEV Gothic JPDOC|U+0030-0039","源暎ちくご明朝 v3"');
    editor.ReadSettings();

    最初の WriteSettings は現在の Mery の設定を Mery.ini に書き出すためのものです。

    設定の一部はメモリ上に保持され、Mery 終了時に Mery.ini に書き出されるため、Mery.ini を書き換える前に WriteSettings を使ってこれらを Mery.ini に保存します。

    次に、WriteSettingString で必要な設定を Mery.ini に書き込み、最後に ReadSettings で Mery.ini の内容をエディターに反映させます。

    このようにマクロを作成すれば、簡単に設定を切り替えられるようになると思います。

     |  Kuro  |  返信
  16. >源暎ちくご明朝には数字が含まれているので、フォールバックしても源暎ちくご明朝の数字が優先されると思うのですが…。
    >円記号フォント → フォールバックで UDEVGothicJPDOC-Regular.ttf U+0030-U+0039 → フォールバックで源暎ちくご明朝、といった感じで設定されているのでしょうか?
    はいそうです
    円記号フォントメインで色々フォールバックで試してました
    円記号しか入ってないのでUnicode範囲指定を試しやすかったです

    >ちなみに、私は /sp オプションは使っていないのですが、
    今回のUnicode範囲指定とかフォント、設定なんか試すとき
    テスト用Meryを作り/spでメインと2つ起動して
    設定テストはどこが変わったか確認したり
    フォントも見比べや
    メニューのフォントに登録されるのを避けたりと割と/spを使ってます

    >一応、フォント設定とフォールバック フォントの設定はマクロで操作できるので、
    マクロで出来たのですね
    自身ごく簡単なマクロしか作れないので頭になかったです
    これで今回のUnicode範囲指定もあるしフォールバックもポータブルで使えるようになったし
    色々フォントの組み合わせを作ってみたいです
    取り敢えずメインと読書用の縦書きフォントのマクロを作ってみましたが
    フォントサイズも変えれるしいい感じです
    https://imgur.com/nRBK3Ym

     |  kiyohiro  |  返信
  17. ご返信ありがとうございます。

    > 円記号フォントメインで色々フォールバックで試してました
    > 円記号しか入ってないのでUnicode範囲指定を試しやすかったです

    なるほど、そうだったんですね。

    そのやり方だと、かなり自由にフォントを組み合わせて楽しめそうですね!私も円記号フォントに挑戦してみたのですが、FontForge の使い方が難しすぎて、途中でギブアップしちゃいました…。

    > テスト用Meryを作り/spでメインと2つ起動

    なるほど、それはアリですね。

    ただ、/sp オプションを使うと、セパレート プロセス (sp) で起動するので、プロセス間でタブが移動できなかったり、Mery.ini の更新が最後に終了したプロセスに左右されたり、トレイ アイコンが 2 つ表示されるなど、ちょっとした問題が出ることがあるんです。

    でも、普段はインストーラー版を使って、テスト用にポータブル版に /sp オプションを使うなら、そういった問題も少ないかもしれませんね。

    > 取り敢えずメインと読書用の縦書きフォントのマクロを作ってみましたがフォントサイズも変えれるしいい感じです

    おお、いいですね!マクロもうまく動いているようで安心しました。でも、フォントの変更やタブの切り替えが少し遅いようですね。動画撮影の影響で遅くなっているだけならいいんですが…。

    私もマクロは簡単なものしか作れませんが、たとえば「Zen モードにして縦書きにし、フォントを変更する」、もう一度実行すると「Zen モードと縦書きを解除して、フォントを元に戻す」みたいなマクロも作れると思います。

    メインモードと読書モードをワンクリックで切り替えられるマクロがあれば、さらに楽しく使えそうですね。

     |  Kuro  |  返信
  18. >フォントの変更やタブの切り替えが少し遅いようですね。
    動画撮影の影響みたいです

    >私も円記号フォントに挑戦してみたのですが、FontForge の使い方が難しすぎて、途中でギブアップしちゃいました…。
    確かに情報も少なく古く
    最初0から円記号作り死ぬほど苦労しました
    何度か作ってると
    UDEVGothicJPDOC-Regular.ttfから円記号取り出し
    設定など丸パクリすれば楽だしフィットするかと思い試すと出来てしまいました

    FontForgePortable
    https://portableapps.com/apps/utilities/fontforge-portable

    UDEVGothicJPDOC-Regular.ttfを読み込む
    U+00A5の所の円記号を右クリックでコピー
    メニュー→ファイル→新規
    新規の円記号U+005Cの所に右クリックで貼り付け
    メニュー→エレメント→フォント情報→一般情報→EMの大きさ→2048(UDEVGothicJPDOC-Regular.ttfの大きさ)
    メニュー→ファイル→フォントの出力→生成
    で最低限の物は作れました
    ただ、同じ手順でもエラーで生成出来ないときも?

     |  kiyohiro  |  返信
  19. 情報ありがとうございます。

    教えていただいた手順で、円記号のみのフォントを無事に作成できました!

    私は HackGen の大ファンなので、HackGen から円記号だけを取り出して作ってみました。

    EM のサイズを合わせたのですが、行間や文字間が変わってしまい、OS/2 のメトリックもコピペしてみたものの、全然うまくいきませんでした。

    最終的には、オリジナルの HackGen を開いて、すべてのグリフを選択してクリアし、そこに円記号だけを貼り付けるとうまくいきました。

    結果として、「円記号フォント → フォールバックで UDEV Gothic JPDOC U+0030-0039 → フォールバックで HackGen」というかたちで、円記号と数字の差し替えを行った HackGen が完成しました。

    HackGen や UDEV Gothic のような美しいフォントを制作してくれた yuko さんに感謝しつつ、ちょっとだけ自分でオリジナルのフォントを作った気分になって、テンションが上がりました。

    これをきっかけにフォント制作に挑戦したい!…と思うほど簡単ではなくて、FontForge は本当に難しいですね (笑)

     |  Kuro  |  返信
  20. >EM のサイズを合わせたのですが、行間や文字間が変わってしまい
    一番簡単で最低限の作り方のつもりだったもので
    私もここから色々調整して満足のいく円記号に仕上げました
    どこをどういじったかは覚えてないですし
    しかしUnicode範囲指定面白いですね
    昨日から何パターン試したか分からないほど遊んでます
    ホント理想のフォントはむずかしい

     |  kiyohiro  |  返信
  21. 色々と組み合わせを楽しんでいるようだったので、このMeryの機能でしか使えないであろう、グリフが空のフォントを作るfontforgeスクリプトを用意してみましたw

    fontforgeはPythonランタイムを内包しているので、こんなコードがさらりと動きます。案外、プログラマーにとってはコードの方が分かりやすいかもしれませんね。
    ただfontforgeのスクリプトの動作ってバグっぽい動きがちょいちょいあるんですよね…。そのせいで今回はEM値をいじってから一度開き直したりしています。

    以下のスクリプトを適当に「empty_font.py」として保存し、以下のコマンドでビルドすると、作業フォルダに「empty_font.ttf」が出来上がるはずです。
    これをMeryのメインフォントとして設定し、フォールバックフォントに好きな順序でフォントを設定していく、という感じです。

    「empty_font.py」のソースコード:

    """グリフの無いフォントを作成するスクリプト
    
    実行方法 (PowerShell):
        & "C:\Program Files (x86)\FontForgeBuilds\bin\fontforge.exe" -script empty_font.py
    """
    
    import os
    
    import fontforge
    
    # EM値
    # ascent = ベースラインからの高さ
    # descent = ベースラインからの深さ
    # これらを足してEM値として扱う。
    # 一般的にEM値は 1000, 1024, 2048 のいずれかが使われる。
    EM_ASCENT = 1624
    EM_DESCENT = 424
    
    FONT_FILE_NAME = "empty_font.ttf"
    FONT_FILE_NAME_TMP = "empty_font_tmp.ttf"
    
    
    def main():
        font = fontforge.font()
        # フォント名
        font.fontname = "EmptyFont"  # 文字列内スペース非許容
        font.fullname = "Empty Font"
        font.familyname = "Empty Font"
        # エンコード
        font.encoding = "UnicodeFull"
        # グリフが何も無いとエラーになってしまうので半角スペースだけ設定
        font.createChar(-1, "tmp")
        font["tmp"].width = (EM_ASCENT + EM_DESCENT) // 2
        # EMサイズ
        font.ascent = EM_ASCENT
        font.descent = EM_DESCENT
        # 一度保存してから開き直さないとEM値が正常に反映されない
        font.generate(FONT_FILE_NAME_TMP)
        font.close()
        font = fontforge.open(FONT_FILE_NAME_TMP)
        # その他のサイズ
        font.os2_winascent = EM_ASCENT
        font.os2_windescent = EM_DESCENT
        font.os2_typoascent = EM_ASCENT
        font.os2_typodescent = -EM_DESCENT
        font.os2_typolinegap = 0
        font.hhea_ascent = EM_ASCENT
        font.hhea_descent = -EM_DESCENT
        font.hhea_linegap = 0
        # その他プロパティ
        font.weight = "Regular"
        font.os2_weight = 400
        font.copyright = "none"
        # 保存
        font.generate(FONT_FILE_NAME)
        font.close()
        # 一時ファイル削除
        os.remove(FONT_FILE_NAME_TMP)
    
    
    if __name__ == "__main__":
        main()

    ビルドコマンド (Powershell想定):
    ※fontforge.exe の配置パスが異なる場合は環境に合わせてください

    cd <empty_font.py の配置フォルダ>
    & "C:\Program Files (x86)\FontForgeBuilds\bin\fontforge.exe" -script empty_font.py
     |  yuko  |  返信
  22. 上記で「# グリフが何も無いとエラーになってしまうので半角スペースだけ設定」としている箇所、コメントがいまいちでした。
    実際にはUnicode外の領域 (-1 指定) にこの空白グリフを設定しているため、何の文字を入力した場合にも使われることはありません。つまり、実質的に表示できるグリフが存在しない空フォントです。

     |  yuko  |  返信
  23. >> kiyohiro さん

    > しかしUnicode範囲指定面白いですね
    > 昨日から何パターン試したか分からないほど遊んでます

    ありがとうございます!そう言っていただけると、開発した甲斐がありました。

    私もついつい夢中になって、時間を忘れて遊んじゃってます(笑)なんでしょうね、この不思議な楽しさ。

    yuko さんが紹介してくださった「空フォント」も面白そうですよ!

    >> yuko さん

    おお!素晴らしいスクリプトをありがとうございます。

    バッチリ動作して、無事に空フォントを作れました!

    FontForge の GUI から空っぽのフォントを作ろうとすると保存できなかったので、「空フォントって無理なのかな?」と思っていたのですが、Unicode の領域外にダミーを置くことで解決できるとは、さすがです😲

    この空フォントを使って、円記号を BIZ UDゴシック (90%) にフォールバックさせ、次に Consolas へ、さらにもう一度 BIZ UDゴシック (90%) にフォールバックさせることで、「¥」が表示できる Consolas な BIZ UDゴシックができました😁

    EM 値やベースラインの設定はよくわかっていなかったのですが、一般的なフォントの設定が適用されているおかげで、とても助かりました。

    >> kiyohiro さん、yuko さん

    私もフォントの組み合わせで遊んでいたのですが、kiyohiro さんがおっしゃっていたように、設定を切り替えるのがだんだん面倒になってきたので、設定を切り替えるマクロを作ってくれるマクロ (w を作ってみました。

    /*
    設定を切り替えるマクロを生成するマクロ
    */
    editor.WriteSettings();
    var fontName = editor.ReadSettingString('Display', 'FontName', '');
    var fontHeight = editor.ReadSettingInteger('Display', 'FontHeight', -13);
    var fallbackFonts = editor.ReadSettingString('Display', 'FallbackFonts', '');
    var s = "editor.WriteSettings();\n";
    s = s + "editor.WriteSettingString('Display', 'FontName', '" + fontName + "');\n";
    s = s + "editor.WriteSettingString('Display', 'FontHeight', " + fontHeight + ");\n";
    s = s + "editor.WriteSettingString('Display', 'FallbackFonts', '" + fallbackFonts + "');\n";
    s = s + "editor.ReadSettings();\n";
    prompt('マクロ(&M):', s, mePromptMultiline);

    このマクロを実行すると、現在のフォント設定に基づいて、設定を切り替えるためのマクロが画面に表示されます。

    マクロを画面に表示するだけなので、設定が実際に書き換わることはありません。

    内容をコピペしてマクロとして保存し、右クリック メニューに割り当てるなどして使えます。

     |  Kuro  |  返信
  24. >> yuko さん
    >グリフの無いフォントを作成するスクリプト
    面白いですね
    作るときにビルドコマンド (Powershell想定)を見落として
    ファイラーから実行したせいか
    文字化けしてたので間違えたのかと焦りましたが
    問題なくempty_font.ttfが出来ました
    FontForgePortableやその他の確認ソフトで見てもちゃんと空ですね
    確認ソフト
    ファイラ連携型フォント表示器『ViW-f』
    フォント文字数算出器『FontCharCounter』
    http://www.ne.jp/asahi/krk/kct/software/

    あと色々と組み合わせて遊んでると
    白源(HackGen-Regular.ttf)で
    第三水準、第四水準が一文字ずつ足らない?と調べると
    元の源柔ゴシック(GenJyuuGothic-Regular.ttf)の影響なんですね
    ちょっと気になったので報告だけ

    >> Kuro さん
    >設定を切り替えるマクロを生成するマクロ
    これは便利ですね
    フォント名がコピペ出来ないので
    マクロ作るとき地味に面倒でした

     |  kiyohiro  |  返信
  25. Kuroさん

    フォールバック機能で遊んでいたところ、おや?と思う挙動があったのでお知らせします。

    フォールバックフォントを

    ・A (カスタムフォント機能で Mery\Fonts フォルダから読み込ませているもの)
    ・B (インストール済みのフォント)

    という順序で読み込ませた場合、期待値としては「Aが基本的に表示され、存在しないコードポイントでのみBのグリフが表示される」という動きを期待していました。
    しかし実際には、この順序に関係なく、インストール済みの B が優先して適用されているようでした。

     |  yuko  |  返信
  26. ご報告ありがとうございます。

    いただいた条件で試してみたところ、私の環境では yuko さんが想定されているように、「A が基本的に表示され、存在しないコードポイントでのみ B のグリフが表示される」という動きになっていました。

    検証に使った設定はこんな感じです。

    メイン フォント:

    Empty Font

    フォールバック フォント:

    A: Roboto (未インストール、Fonts フォルダーから読み込み)
    B: HackGen (インストール済み)

    この設定で確認したところ、英数字は Roboto、それ以外は HackGen で表示されました。

    もし、フォント名やコードポイントなど、もう少し具体的な状況がわかれば、原因をもっと詳しく探れるかもしれません。

    それから、A と同じ名前のフォントがすでにインストールされていないか、ご確認いただけると助かります。

    カスタム フォント機能では、インストール済みのフォントが上書きされることはなく、同じ名前のフォントがインストールされていると、そちらが優先されます。

    普通はこれで問題ないと思いますが、フォントを作っている方だと、合成済みのフォントをインストールしたまま、同じ名前の部分的なフォントを Fonts フォルダーに配置したりすることがあるかもしれないと思いまして…😅

     |  Kuro  |  返信
  27. どうもお世話になってます
    報告の準備をしてたらyukoさんが報告されたので
    スルーしてましたがこちらもyukoさんと同じ?症状です

    カスタムフォント(Mery\Fonts)
    ennkigou2、0xProto、UDEV Gothic JPDOC
    インストールフォント(C\Users\xxxx\AppData\Local\Microsoft\Windows\Fonts)
    UDEV Gothic JPDOC

    ポータブル環境でもMeryを使ってるので
    UDEV Gothic JPDOCは両方に入ってます

    editor.WriteSettings();
    editor.WriteSettingString('Display', 'FontName', 'ennkigou2');
    editor.WriteSettingString('Display', 'FontHeight', -14);
    editor.WriteSettingString('Display', 'FallbackFonts', '0xProto,"UDEV Gothic JPDOC"');
    editor.ReadSettings();

    0xProtoの記号だけフォールバックしたいのですが
    記号のUnicode範囲指定がググってもよくわからない
    ので取り合えすUnicode範囲指定なしにしたら
    0xProtoがフォールバックされませんでした

    editor.WriteSettings();
    editor.WriteSettingString('Display', 'FontName', 'ennkigou2');
    editor.WriteSettingString('Display', 'FontHeight', -14);
    editor.WriteSettingString('Display', 'FallbackFonts', '0xProto|U+003F,"UDEV Gothic JPDOC"');
    editor.ReadSettings();

    0xProtoでUnicode範囲指定した物はフォールバックされる

    よろしくお願いします

     |  kiyohiro  |  返信
  28. 情報ありがとうございます。

    いただいた条件で、無事に現象を再現できました。

    最初に私の環境で再現できなかったのは、検証のために「使ったことないフォントを」と思って適当に Google Fonts からダウンロードしたつもりが、確認してみたらそのフォント (Roboto)、実はすでに私の環境にインストールされてたんです😅

    まったく記憶にないのですが、何かのアプリをインストールしたときに一緒に入ったのかもしれません。

    原因についてですが、Unicode 範囲を指定しない場合、高速化のためにフォールバック フォントを一括で登録しているのですが、その際にシステム フォントとカスタム フォントが混在していると、システム フォントを優先するようになっていました。

    逆に、Unicode 範囲を指定した場合は、一括登録ではなく一つ一つ順番に登録するため、問題は発生しません。

    次のバージョンではこの問題に対応しておきますので、しばらくお待ちくださいね。

     |  Kuro  |  返信
  29. >- フォールバック フォントにシステム フォントとカスタム フォントが混在している場合の優先順位を調整
    修正ありがとうございます
    動作確認しました

    フォールバック選び難しですね
    ennkigou2とフォールバックUDEV Gothic JPDOCをメインに
    一部記号のみ変更したいのですが
    記号の場所バラけ過ぎで一括変更悩みましたし
    見た目良さそうな0xProtoだと幅が広がるし
    サイズ調整 0xProto|U+0021-002F, U+003A-0040, 80%
    だと幅は合うけど全体的に小さくなる
    と困ってた所新しくExplexが出て解決しました
    目測ですがExplexとHackGenとUDEV Gothic JPDOCならちゃんと等幅になり
    今の所に以下になりました
    https://imgur.com/DGgsXAb
    editor.WriteSettings();
    editor.WriteSettingString('Display', 'FontName', 'ennkigou2');
    editor.WriteSettingString('Display', 'FontHeight', -14);
    editor.WriteSettingString('Display', 'FallbackFonts', '"Explex|U+002C, U+003B, U+003F","HackGen|U+0021, U+0040, U+FF0C, U+FF1B, U+FF1F, U+FF01, U+FFE5","UDEV Gothic JPDOC"');
    editor.ReadSettings();

     |  kiyohiro  |  返信
  30. >> kiyohiro さん、yuko さん

    ご確認ありがとうございます。うまく動作しているようで安心しました。

    kiyohiro さん、詳細な情報提供ありがとうございました。そして、yuko さん、私の確認不足でご迷惑をおかけしてしまい、申し訳ありませんでした。

    > 見た目良さそうな0xProtoだと幅が広がるし
    > サイズ調整 0xProto|U+0021-002F, U+003A-0040, 80%
    > だと幅は合うけど全体的に小さくなる
    > と困ってた所新しくExplexが出て解決しました
    > 目測ですがExplexとHackGenとUDEV Gothic JPDOCならちゃんと等幅になり

    いい感じですね!記号だけフォールバックするあたり、かなりこだわりを感じます。

    私もフォントをいじりたかったのですが、Mery の開発で手がいっぱいで…。でもこれでようやくフォールバック機能で遊べそうです。

    ここで教えていただいた 0xProto はプログラミングにぴったりそうだったので、Ver 3.7.6 をリリースしたら試そうと思っていましたが、もう Explex が出てるとは!フォールバックなしでも美しい~。

    yuko さんの創作スピードには本当に感服します。

    お手軽にフォントを切り替えられる仕組みなど、さらに便利にする課題は残っていますが、これでひとまずフォント フォールバック機能については開発完了と言って良さそうですね。

     |  Kuro  |  返信
  31. > yuko さん、私の確認不足でご迷惑をおかけしてしまい、申し訳ありませんでした。

    いえいえ、とんでもないです。ご対応ありがとうございました!

    > yuko さんの創作スピードには本当に感服します。

    もう合成スクリプトの型が出来上がってしまっていますから、Meryで組み合わせの見た目を確認したらちょちょいっと高さなど変えるくらいで終わってしまいますw
    組み合わせの見た目確認が意外と時間かかるところで、以前は毎回合成し終えたやつで確認するしかなかったので大変でしたが、この機能のおかげでそこがサクサクいけちゃいました。とても助かっています😊

    > お手軽にフォントを切り替えられる仕組みなど、さらに便利にする課題は残っていますが、これでひとまずフォント フォールバック機能については開発完了と言って良さそうですね。

    細かい芸当で、大変お疲れさまでした。
    Mery無しのパソコン生活にはもう戻れませんね…w

     |  yuko  |  返信
  32. ちょっとしたネタになりそうな面白そうなフォントを見つけたので共有を。

    Unicodeコンソーシアムが提供する“最後の手段”フォント「Last Resort Font」【レビュー】 - 窓の杜 https://forest.watch.impress.co.jp/docs/review/1301754.html

    あえて、フォールバックされている文字を見つけたい人のためのフォントなようです。

    MeryやVSCode、ブラウザなどの複数フォントを指定できるアプリケーションでしか使うことができず、なおかつわざわざフォールバック文字を特定したいなんて限定的な用途しかなさそう…😅

     |  yuko  |  返信
  33. 情報ありがとうございます!

    Last Resort フォント、面白いですよね!以前、別のトピックで kiyohiro さんに教えていただき、私もデバッグ用途に使っていました😁

    フォールバックが効いているか確認するのに本当に便利ですよね。

    > MeryやVSCode、ブラウザなどの複数フォントを指定できるアプリケーションでしか使うことができず、なおかつわざわざフォールバック文字を特定したいなんて限定的な用途しかなさそう…😅

    私はてっきり、豆腐が嫌いな人のためのフォントかと思っていましたが、実は本当にデバッグ用途だったんですね🤣

     |  Kuro  |  返信
スポンサーリンク