Yaku Han JP
Site & Documentation
About
Yaku Han JP(ヤクハンジェイピー)は、日本語テキストに含まれる約物を半角にするフォントです。
Packages
- yakuhanjp — ブラウザで使用するYakuHanJP
- core — YakuHanJPのフォントデータ
- merged — YakuHanJPを元フォントにマージしたデータ
- unicode — 内包文字のunicodeを生成するスクリプト
Development
v4.1.1から開発中のv5.0.0への変更点はcontextにまとめています。
フォントの生成(Glyphsアプリ不要)
Python 3.12以上とuvを用意し、リポジトリのルートで実行します。
依存関係はuv.lockに固定しています。元フォントはresource、約物の文字・余白・縦書き設定は
packages/core/*/sources/*.json、輪郭はpackages/core/*/outlines/*.jsonから読み込みます。
生成にはFontToolsを使い、Glyphs形式のデータや専用アプリは使用しません。
調整値の意味と文字追加の手順はcoreのREADMEを参照してください。
# 全6ファミリー・46ウェイトをbuild/fontsに生成(既存の配布ファイルは上書きしません)
npm run build:fonts
# ファミリー・ウェイトを限定して試す
npm run build:fonts -- --family YakuHanJP --weight 400
# 約物フォントだけ生成
npm run build:fonts -- --target core
# マージ版をTTFとOTFの両方で生成(全字形の形式変換が必要なため低速)
npm run build:fonts -- --merged-format both
# 公開前に全形式でpackages/coreとpackages/mergedを更新
npm run build:fonts -- --merged-format both --output packages
# 生成処理と既存フォントとの互換性を検証
npm run test:fonts
coreにはTTF・OTF・WOFF2、mergedには元フォントと同じ形式(JP/RPはTTF、MPはOTF)を生成します。
変更のないスタイルはスキップします。--forceで全て作り直せます。
生成・キャッシュは常にbuild/fontsで行い、--output packagesは検証済みの生成物をコピーします。
同じ入力と形式で生成済みなら、出力先を変えても再ビルドせず、不足する形式だけ生成します。
マージは元フォントの収録文字とOpenType機能を維持し、約物と縦書き用の代替字形を置き換えます。
置き換えた約物にはpalt・halt・vpal・vhalによる追加の詰め処理を適用しません。
ルートのnpm run buildもPythonとuvを使用し、全形式のフォント更新から配布ファイルの生成まで実行します。
npm run build -w coreとnpm run build -w mergeは各パッケージのフォントを直接更新します。
バイナリの完全一致は保証しません。Glyphsとコンパイラが異なるため、ヒンティングや曲線変換、
内部テーブルに差が出ます。公開前にはplaygroundで表示も確認してください。
また、既存のマージ版には約物ソースと幅が異なる文字があります(例:YakuHanJP Regularの!)。
新しいマージ版は約物ソースの幅を採用するため、既存のマージ版から文字送りが変わる場合があります。
mergedサブセットの調査(配布仕様は未確定)
配布用サブセット版の計画は現在保留中です。ゲームの使用文字から開発時にサブセット化する方が効率的との判断で、 以下の調査結果・スクリプトは参考用に保持しています。
調査方針・結果・固定した資料の取得先はサブセット計画を参照してください。
scripts/research_merged_subset.pyは取得済みのTUBELEX未正規化頻度データをハッシュ検証して集計します。
通常のフォント生成・ZIPには組み込んでいません。
.venv/bin/python scripts/research_merged_subset.py \
--input build/subset-research/source/tubelex-ja_no-normalization.tsv.xz \
--output build/subset-research/data \
--font-output build/subset-research/fonts
--font-outputを省くと文字リストと対応範囲の集計だけを行います。試作フォントはbuild/内に限定し、
内部名も全文字版と同じままなので配布・インストール用ではありません。既存のpackages内のフォントは変更しません。
共通の候補文字リストを維持し、元フォントにない文字はそのフォントの試作から省きます。
省略したコードポイントと対象スタイルは、出力先のreport.jsonへ記録します。
別資料での評価はscripts/evaluate_merged_subset.pyで行います。固定した入力資料の取得先・実行手順と、
基礎文字の補助枠案はサブセット計画を参照してください。
配布物の一括ビルド
ルートのnpm run buildは次の順番で実行します。途中で失敗した場合は、後続の処理を実行しません。
build:fonts:packages:全形式のフォントを生成・検証し、packages/coreとpackages/mergedに反映build:unicode:packages/unicode/dist/data.jsonを更新build:main:最新のcoreフォントからCSSとWOFF2をpackages/yakuhanjp/distに生成build:zip:core・mergedのTTFとOTFをbuild/zip/YakuHanJP_v<version>.zipに梱包
Unicodeと配布用のdistは削除してから生成するため、古い成果物は残りません。
packages/yakuhanjpのprepublishOnlyもルートのbuildを実行し、公開前に同じ更新を行います。
フォントの入力・形式が変わっていなければ、キャッシュを再利用します。
CSSだけを作り直す場合はnpm run build:mainを実行してください。
ダウンロード版ZIP
npm run buildでWeb用配布物とダウンロード版ZIPをまとめて生成します。
ZIP名と展開後のフォルダー名にはpackages/yakuhanjp/package.jsonのバージョンを使います
(例:build/zip/YakuHanJP_v5.0.0.zip、展開後はYakuHanJP_v5.0.0/)。
ZIPにはcore/<family>/{otf,ttf}/とmerged/<family>/{otf,ttf}/の全6ファミリー・46スタイル、
合計184フォントと、専用README・ライセンスを収録します。WOFF2・CSS・編集用JSONは含みません。
READMEとMIT本文はscripts/zip/、元3フォントのOFL本文・著作権表記はresource/*/OFL.txtから同梱します。
# 生成済みのpackages/core・packages/mergedからZIPだけを作り直す
npm run build:zip
# フォントの変更を反映してZIPを作る(Web用配布物の生成は省略)
npm run build:fonts:packages && npm run build:zip
build:zip単独ではフォントを再生成しません。定義されたフォントやライセンスが欠損・空の場合は失敗し、
同じバージョンの既存ZIPも削除します。ZIPは完成してから出力先に配置します。
梱包処理のテストはnpm run test:fontsに含まれます。
GitHub Releasesへの添付は別途行ってください。
prepublishOnly・npm run play・ドキュメントサイトのCIでもルートのbuildを呼ぶためZIPを生成します。
ZIP生成に失敗した場合は後続処理を停止します。
配布用CSSの生成設定
packages/yakuhanjp/project.jsonのフォント情報とpackages/coreのWOFF2を元に、
src/build.tsが通常版CSS・jsDelivr向けCSS・ライセンスバナーを生成します。
フォントやウェイト、収録文字を変更するときはproject.jsonを編集してください。
npm run playは配布用ファイルを生成してからplaygroundを起動します。
フォント情報を変更した後は、再度npm run buildを実行してください。
Media
License
- Yaku Han JP : SIL OFL 1.1 AND MIT
- Gothic fonts : Based on Noto Sans JP licensed under the SIL OFL 1.1
- Mincho fonts : Based on Noto Serif JP licensed under the SIL OFL 1.1
- Round Gothic fonts : Based on M PLUS Rounded 1c licensed under the SIL OFL 1.1