\documentclass[a4paper,11pt,nomag]{jsarticle}
\usepackage[textwidth=42zw,lines=40,truedimen,centering]{geometry}
\usepackage{amsmath}
\usepackage[defaultsups]{newpxtext}
\usepackage[zerostyle=c,straightquotes]{newtxtt}
\usepackage{newpxmath}

% common
\usepackage{ptex-manual}

\usepackage{shortvrb}
\MakeShortVerb*{|}

\def\size#1{\mathit{#1}}
\def\code#1{\texttt{#1}}
\def\codechar#1{\ensuremath{\langle\mbox{\kern0pt\code{#1}\kern0pt}\rangle}}

\title{\emph{JFMファイルフォーマット}}
\author{ASCII Corporation \& Japanese \TeX\ Development Community}
\begin{document}
\maketitle

\emph{JFM (Japanese Font Metric)}は，
\pTeX で和文フォントを扱うためのフォントメトリックであり，
オリジナルの\TeX のTFM (\TeX\ Font Metric)に相当する．
\pTeX と同じく株式会社アスキーによって開発され，
この文書も\pTeX に付属していたものであるが，ここでは2018年に
日本語\TeX 開発コミュニティによって拡張されたJFMフォーマットに
基づいて説明する．

なお，\pTeX の内部コードをUnicode化した\upTeX でも，
JFMフォーマットの仕様は全く同じであり，ただ
\node{char\_type}テーブルに文字コードを格納するときに
JISコードを用いる（\pTeX の場合）か，
UCS-4の下位3バイトを用いる（\upTeX の場合）かだけが異なる．

\tableofcontents
\clearpage

\section{JFMファイルの構成}\label{jfm-format}

JFMファイルのフォーマットは，
基本的にはTFMファイルのフォーマットに準拠しており，
TFMを拡張した形になっている．
ここでは，主にその拡張部分について説明を行い，
その他の部分に関しては，
\TeX\ the program等のTFMの説明を参照してもらいたい．

JFMファイル全体の構成は，
表\ref{構成}（\pageref{構成}ページ）に示すとおりである．
ここでTFMと異なるのは次の点である．
\begin{enumerate}
\item \node{char\_type}のテーブルが付け加えられたこと．
\item \node{exten}の換わりに\node{glue}のテーブルが設けられたこと．
\item 2に関連して，\node{lig\_kern}から\node{glue\_kern}テーブルへ変更されたこと．
\item これらに伴い，先頭のファイル内の各部分を規定するパラメータ表が変更されている．
  また，オリジナルのTFMとの区別のために$\size{id}$を付加しており，
  先頭の半ワード（2バイト）が横組用は11，縦組用は9である
  \footnote{欧文TFMの半ワードは$\size{lf}$すなわちファイルサイズであり，
  11や9になることはない．}．
\end{enumerate}
最初の7ワードは半ワード（＝2バイト）ずつに区切られ，
JFMファイルを構成する14個の要素のサイズが収められている
\footnote{欧文TFMでは12個だが，JFMでは$\size{id}$と$\size{nt}$が増え，
$\size{ne}$が$\size{ng}$に置き換わったため14個である．}．
これらの値は，すべて$2^{15}$よりも小さい非負の値で，
次の条件を満たしていなければならない：
\begin{align*}
\size{bc} &= 0 \\
0 &\leq \size{ec} \leq 255 \\
\size{lf} &= 7+\size{nt}+\size{lh}+(\size{ec}-\size{bc}+1)+\size{nw}+\size{nh}
               +\size{nd}+\size{ni}+\size{nl}+\size{nk}+\size{ng}+\size{np}
\end{align*}
ここで，$\size{bc}$と$\size{ec}$は最小・最大の文字タイプ番号，
$\size{nt}$は\node{char\_type}テーブルに登録された文字の数（文字タイプ0も含む），
$\size{nl}$と$\size{ng}$はそれぞれは\node{glue\_kern}テーブルと
\node{glue}テーブルのサイズであり，その他の値はTFMを踏襲する．

JFMファイルでもTFMファイルと同じく，拡張子は\code{.tfm}が用いられる．

\subsection{\node{char\_type}テーブル}
\pTeX では欧文\TeX よりはるかに多くの文字を扱う必要があるが，
そのほとんどは漢字であり，それらは全て同一の寸法（全角幅）を持つ．
また，括弧や句読点などの約物も種類が増えるが，こちらも
幾つかのパターンに分類すれば済む（例えば ``「'' と ``（'' は同様に扱える）．

そこで，JFMフォーマットでは，
同一の文字幅，高さ，前後に挿入されるグルー等，「その文字が持つ属性全てが
同じもの」を1つの\emph{文字タイプ} (\node{char\_type})として，
欧文フォントの1文字と同様にして扱うようにしている．
そして，文字コードと文字タイプとの対応付けを，
この\node{char\_type}テーブルを使って行う．

このテーブルの各エントリーは1ワード（＝4バイト）で構成され，
上位3バイトに文字コード（符号位置），下位1バイトに文字タイプを持つ
\footnote{日本語\TeX{}開発コミュニティによる新仕様；
詳細は第\ref{jfm-new}節を参照．}．
文字コードは，それが16進数24bit（3バイト）で\code{0xABcdef}と表されるとき，
\node{char\_type}テーブルには\code{cd ef AB}として格納される．
テーブル内にはコードの値の順番に収められていなければならない．
またこのテーブルの先頭には，デフォルトのインデックスとして
文字コード及び文字タイプの項が0のものが，
必ず1つ存在しなければならず，このテーブルに登録されていない文字は，
文字タイプが0として扱う．
つまり，このデフォルト以外の文字幅，カーン等の属性を持つキャラクタ
のコードとタイプが2番目以降のエントリーとして存在しなければならない．

\subsection{\node{char\_info}テーブル}
\node{char\_type}をインデックスとしてこのテーブルを
参照することにより，各\node{char\_type}の属性を検索する．
各テーブルへのインデックス等の情報を次の順番でパッキング
して1ワードに収めてある．
\begin{description}\itemindent=2zw
  \item[\node{width\_index} (8bits)]
    \node{width\_table}へのインデックス
  \item[\node{height\_index} (4bits)]
    \node{height\_table}へのインデックス
  \item[\node{depth\_index} (4bits)]
    \node{depth\_table}へのインデックス
  \item[\node{italic\_index} (6bits)]
    \node{italic\_table}へのインデックス
  \item[\node{tag} (2bits)]
    \node{remainder}をどのような目的で使うかを示す．
    \begin{description}\itemindent=1zw
      \item[$\size{tag}=0$]
        \node{remainder}の項は無効であり使用しないことを示す．
      \item[$\size{tag}=1$]
        \node{remainder}の項が\node{glue\_kern}への有効なインデックスであることを示す．
      \item[$\size{tag}=2, 3$]
        JFMでは使用していない．
    \end{description}
  \item[\node{remainder} (8bits)]
\end{description}

JFMでは$\size{bc}$は必ずゼロ\footnote{前節にあるとおり，文字コード及び
文字タイプの項が0のものが必ず1つ存在するため．}なので，
1つのJFMに含まれる\node{char\_info}は全部で$\size{ec}+1$ワードになる．

% [TODO] char_info のサイズが ec+1 ということは，
% 文字タイプは 0 から ec まで連続しなければならないのか？
% （char_type テーブル内の文字コードの順序については説明があるが，
%   文字タイプの連続性についてはどこにも明記されていない気がする…）

\subsection{\node{glue\_kern}テーブル}
特定の文字タイプの組み合せ時に挿入すべき\node{glue}又は\node{kern}を
簡単なプログラム言語によって指定する．
各命令は，以下の4バイトで構成される．
\begin{description}\itemindent=2zw
\item[第1バイト] (\node{skip\_byte})
  \begin{itemize}
  \item 128より大きいとき\\
    現在のワードが\node{char\_info}から示された最初のワード
    である場合は，実際の\node{glue\_kern}プログラムが
    \node{glue\_kern}[$256\times\size{op\_byte}+\size{remainder}$]から
    収められている（すなわち，再配置されている）ことを示す
    \footnote{日本語\TeX{}開発コミュニティによって新たにサポート；
    詳細は第\ref{jfm-new}節を参照．}．
    最初のワードでない場合（すなわち，既に再配置先あるいは
    プログラムのステップを開始した後のワードである場合）は，
    その場でプログラムを終了する．
  \item 128のとき\\
    このワードを実行してプログラムを終了する．
  \item 128より小さいとき\\
    このワードを実行した後，次のステップまでスキップする
    ワード数を示す
    \footnote{日本語\TeX{}開発コミュニティによって新たにサポート；
    詳細は第\ref{jfm-new}節を参照．}．
  \end{itemize}
\item[第2バイト] (\node{char\_type})
  \begin{itemize}
  \item 次の文字の文字タイプが，
    このバイトで示す文字タイプ
    \footnote{ここに文字タイプが格納されるため，
    文字タイプの上限は255なのである．}と同じ場合，
    第3バイトの処理を実行し，プログラム終了．
  \item そうでなければ次のステップへ．
  \end{itemize}
\item[第3バイト] (\node{op\_byte})\\
  この値によってグルーを扱うかカーンを扱うかを規定する．
  \begin{itemize}
  \item 127以下の場合\node{glue}[$\size{remainder}\times 3$]のグルーを挿入．
  \item 128以上の場合\node{kern}[$\size{remainder}$]のカーンを挿入．
  \end{itemize}
\item[第4バイト] (\node{remainder})\\
  第3バイトにより規定される
  \node{glue}または\node{kern}へのインデックスを示す．
\end{description}

\subsection{\node{glue}テーブル}
自然長，伸び長，縮み長の3ワードで1つのグルーを構成する
（したがって，$ng$は必ず3の倍数となる）．
各値は，$\mathrm{design size}\times2^{-20}$を単位として表す．
\begin{description}\itemindent=2zw
  \item[第1ワード] width
  \item[第2ワード] stretch
  \item[第3ワード] shrink
\end{description}

\subsection{\node{param}テーブル}
一応，以下のように定義されている．
\begin{description}\itemindent=2zw
  \item[\mbox{param[1]}]
    文字の傾き (italic slant)．
  \item[\mbox{param[2][3][4]}]
    和文文字間に挿入するグルー(|\kanjiskip|)のデフォルト値．
  \item[\mbox{param[5]}]
    \pTeX{}でzhで参照される寸法．
  \item[\mbox{param[6]}]
    \pTeX{}でzwで参照される寸法．
  \item[\mbox{param[7][8][9]}]
    和文文字と欧文文字間に挿入するグルー(|\xkanjiskip|)のデフォルト値．
\end{description}
\begin{dangerous}
このように書かれているが，実際には
\pTeX のzwは「文字タイプ0の文字の幅」，
\pTeX のzhは「文字タイプ0の文字の高さと深さの和」である．
明示的に|\fontdimen|で取得する場合を除くと，JFMの\node{param}テーブルの
値が用いられる状況は限られている．
% [TODO] 例えばいつ？
% ptex-manual によると，\accent で和文文字をアクセントにした場合の
% 上下位置補正に \fontdimen5 の値が用いられるらしい．他には？
\end{dangerous}

\subsection{日本語\TeX{}開発コミュニティによる新仕様}\label{jfm-new}
長らくJFMフォーマットは株式会社アスキーが開発した当初仕様のままであったが，
2018年1月から2月にかけ，日本語\TeX{}開発コミュニティは下記の3点につき
JFMフォーマットの仕様を拡張した．
\begin{enumerate}
  \item \node{char\_type}テーブルへの3バイトの文字コード格納
  \item \node{glue\_kern}テーブルでのスキップ(SKIP)コマンド使用
  \item \node{glue\_kern}テーブルでの再配置(rearrangement)
\end{enumerate}
和文JFMでこれらの拡張機能が使われている場合は\pTeX~p3.8.0以上が必要である．

\subsubsection{\node{char\_type}テーブルへの3バイトの文字コード格納}
\node{char\_type}テーブルの各エントリーは1ワード（＝4バイト）で
構成されるが，オリジナルの仕様では
\begin{itemize}
  \item 上位半ワードに文字コード（符号位置），下位半ワードに文字タイプを持つ
\end{itemize}
であった．
\pTeX{}では内部処理にJISが用いられ，JFMで扱う文字コードは2バイトが
上限だったため十分であったが，\upTeX{}でBMP超えの3バイトの文字を
JFMで扱うことができなかった．また，オリジナルの仕様では文字タイプ用に
下位半ワードが確保されている一方で，文字タイプの上限は255なので
実はその上位バイトは常に\code{00}であり，勿体なかった．

そこで，日本語\TeX{}開発コミュニティの新仕様（2018年1月）では
\begin{itemize}
  \item 上位3バイトに文字コード（符号位置），下位1バイトに文字タイプを持つ
  \item 文字コードは，それが16進数24bit（3バイト）で\code{0xABcdef}と
    表されるとき，テーブルには\code{cd ef AB}として格納される
\end{itemize}
とした．オリジナルの仕様で常に\code{00}だったバイトが
「実は文字コードの上位だった」と解釈することにして，
3バイト（U+10000以上）の文字コードで不足する1バイトを確保したのである．
これにより，新仕様はオリジナルの仕様の上位互換であることが保証されている．

\subsubsection{\node{glue\_kern}テーブルでのスキップ(SKIP)コマンド使用}
「スキップ」(\code{SKIP})は，元々アスキーの公式ページ
\footnote{\texttt{https://asciidwango.github.io/ptex/tfm/jfm.html}}
% 旧: http://ascii.asciimw.jp/pb/ptex/tfm/jfm.html
に文書化されてはいたが，実際には(p)PLtoTFは\code{GLUEKERN}プロパティ内で
\code{SKIP}命令を受け付けず，\pTeX{}もやはりJFMの\code{SKIP}命令を
サポートしていなかった．2018年2月の日本語\TeX{}開発コミュニティの改修により，
新たにサポートが開始された．

\subsubsection{\node{glue\_kern}テーブルでの再配置(rearrangement)}
「再配置」は，サイズが256を超える大きな\node{glue\_kern}テーブルを
格納するための方策であり，欧文TFMの\node{lig\_kern}テーブルにおける
それと同様である．2018年2月に日本語\TeX{}開発コミュニティによって，
\pTeX{}及びpPLtoTFで新たにサポートされた．

\subsection{JFMフォーマットの制約事項}

冒頭に述べたとおり，文字タイプ(\node{char\_type})の上限は255であり，
それに伴い可能な字幅も最大256種類しか許されない（さらに同じ字幅でも
\node{glue}又は\node{kern}の挿入規則を変える場合はその分減る）．
しかし，実際のフォントでは字幅が256種類を超えることもあり，
そのような時にJFMフォーマットは使用できない．

例として，OTFパッケージ(japanese-otf) \cite{jotf}が提供する
「ヒラギノフォントのプロポーショナル仮名を使う|\propshape|命令」では
\begin{itemize}
 \item 組版時に使われる\code{(up)phiraminw3-h.tfm}などの
  「(u)\pTeX 用JFM」は，約物類とプロポーショナル仮名のみに対応する
  ので，字幅が256種類以内
 \item VFを介して実際のフォントに割り当てられる
  \code{hiramin-w3-h.tfm}などの「DVIドライバ用JFM」は，
  Adobe-Japan1-5の20{,}317文字を全てCIDコード順に実際のフォントに
  即して定義しようとして，字幅が256種類を超えてしまう
\end{itemize}
という状況になっており，後者はJFMフォーマットで定義できない．

一方で，\OMEGA で使われるOFMフォーマットは最大65{,}536種類の字幅を
定義でき，かつ主要なDVIドライバ(\code{dvipdfmx}, \code{dvips})は
JFMとOFMの両方に対応している．
そこで\emph{あくまで回避策であるが}，(u)\pTeX 用JFMはそのままに，
機能しないDVIドライバ用JFMの代わりに「正しい字幅を定義したOFM」を
用意して\code{dvipdfmx}や\code{dvips}に優先的に使わせるという方法が
長らく用いられてきた．OTFパッケージが提供するOFMファイル群（|\CID|で
使われる\code{otf-cjmr-h.ofm}\footnote{実はこちらは字幅が256種類
以内であり，JFMフォーマットで十分対応できるが．}や|\propshape|で
使われる\code{hiramin-w3-h.ofm}など）はこの目的で用意されている\cite{cidofm}．
% メモ：\def\xspace{}
%   * OTFパッケージの|\CID|, |\propshape|では
%     DVIドライバ用JFMに割り当てるCMapは恒等変換|Identity-{H,V}|を指定
%   * \TL~2021以前の\code{dvips}では，
%     回避策として用意された縦組用OFMがかえって邪魔となり不正な出力になった
%     （\code{-noomega}でOFMを無視する必要があった）が，
%     \TL~2022以降は「OFMの|FONTDIR RT|をJFMの|DIRECTION TATE|と同等に扱う」
%     という改修を入れており，
%     \code{otf-cj**-v.ofm}や\code{hira***-w*-v.ofm}もそれを利用するようにした


% -- tables begin
\DeleteShortVerb{|}
\begin{table}[tbp]\small
\caption{JFMファイルの構成\label{構成}}
\begin{minipage}[b]{2in}
\begin{tabular}{|c|c|} \hline
\hbox to.8in{\hfil$\size{id}$\hfil} &
\hbox to.8in{\hfil$\size{nt}$\hfil} \\ \hline
$\size{lf}$ & $\size{lh}$ \\ \hline
$\size{bc}$ & $\size{ec}$ \\ \hline
$\size{nw}$ & $\size{nh}$ \\ \hline
$\size{nd}$ & $\size{ni}$ \\ \hline
$\size{nl}$ & $\size{nk}$ \\ \hline
$\size{ng}$ & $\size{np}$ \\ \hline
\multicolumn{2}{|c|}{} \\
\multicolumn{2}{|c|}{\node{header}} \\ 
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{} \\
\multicolumn{2}{|c|}{\node{char\_type}} \\ 
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{char\_info}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{width}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{height}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{depth}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{italic}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{glue\_kern}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{kern}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{glue}} \\
\multicolumn{2}{|c|}{}\\ \hline
\multicolumn{2}{|c|}{}\\
\multicolumn{2}{|c|}{\node{param}} \\
\multicolumn{2}{|c|}{}\\ \hline
\end{tabular}
\end{minipage}
\begin{minipage}[b]{3.3in}
\noindent
\begin{tabular}{l}
  $\size{id}=$ JFM\_ID number. ($=11$ for yoko, $9$ for tate) \\
  $\size{nt}=$ number of words in the character type table. \\
  $\size{lf}=$ length of the entire file, in words. \\
  $\size{lh}=$ length of the header data, in words. \\
  $\size{bc}=$ smallest character type in the font. ($=0$ for JFM) \\
  $\size{ec}=$ largest character type in the font. \\
  $\size{nw}=$ number of words in the width table. \\
  $\size{nh}=$ number of words in the height table. \\
  $\size{nd}=$ number of words in the depth table. \\
  $\size{ni}=$ number of words in the italic correction table. \\
  $\size{nl}=$ number of words in the glue/kern table. \\
  $\size{nk}=$ number of words in the kern table. \\
  $\size{ng}=$ number of words in the glue table. \\
  $\size{np}=$ number of font parameter words. \\
\end{tabular}
\end{minipage}
\end{table}
\MakeShortVerb*{|}
% -- tables end
\clearpage


\section{JPLファイル}\label{jpl-format}

TFMはバイナリ形式であるが，これをプロパティ（特性）という概念を使って
テキスト形式で視覚化したものがPL (Property List)ファイルである．
同様に，JFMをテキスト形式で視覚化したものが
\emph{JPL (Japanese Property List)}ファイルである．
JPLファイルでもPLファイルと同じく，拡張子は\code{.pl}が用いられる．

和文用JPLに特有のプロパティとして，以下が存在する．

\subsection{\code{CHARSINTYPE}}
\code{CHARSINTYPE \codechar{1バイト長の整数} \codechar{任意個数の和文文字}}の
形式で，文字タイプ\node{char\_type}及びそれに属する文字コードを設定する．
以下に示すのは，開き括弧類を\node{char\_type}が1のグループに，
閉じ括弧類を\node{char\_type}が2のグループに指定する例である（最初の
\code{O 1}と\code{O 2}はそれぞれ8進数の1，2）．
\begin{verbatim}
(CHARSINTYPE O 1
   （ 〔 ［ ｛ 〈 《 「 『 【
   )
(CHARSINTYPE O 2
   ） 〕 ］ ｝ 〉 》 」 』 】
   )
\end{verbatim}

なお，\codechar{任意個数の和文文字}は直接入力のほか16進数コード値で与える
こともできる．JISコードの場合は\code{J}で始め，UCSコード（\upTeX 専用）の
場合は\code{U}で始める．
以下の指定は上の例と等価である（例えば\codechar{（}はJIS~0x214A）．
\begin{verbatim}
(CHARSINTYPE O 1
   J 214A J 214C J 214E J 2150 J 2152 J 2154 J 2156 J 2158 J 215A
   )
(CHARSINTYPE O 2
   J 214B J 214D J 214F J 2151 J 2153 J 2155 J 2157 J 2159 J 215B
   )
\end{verbatim}

\subsection{\code{TYPE}}
\code{TYPE \codechar{1バイト長の整数} \codechar{プロパティリスト}}の
形式で，文字タイプ\node{char\_type}に含まれる文字の性質を定義する．
欧文用PLの\code{CHARACTER}プロパティに相当するが，利用可能な下位のプロパティは
\begin{itemize}
 \item \code{CHARWD \codechar{実数値}}：文字の幅
 \item \code{CHARHT \codechar{実数値}}：文字の高さ
 \item \code{CHARDP \codechar{実数値}}：文字の深さ
 \item \code{CHARIC \codechar{実数値}}：文字のイタリック補正値
\end{itemize}
に限られる（\code{NEXTLARGER}と\code{VARCHAR}は使えない）．

以下の例は，\pTeX の既定で使用している|min10.tfm|のソース|min10.pl|からの
抜粋である．|min10.tfm|のデザインサイズは10.0\,ptであるので，これは
文字タイプ0に含まれる文字の幅を9.62216\,pt，高さを7.77588\,pt，
深さを1.38855\,ptという定義である．
\begin{verbatim}
(TYPE O 0
   (CHARWD R 0.962216)
   (CHARHT R 0.777588)
   (CHARDP R 0.138855)
   )
\end{verbatim}

\subsection{\code{GLUEKERN}}
JFMの\node{glue\_kern}テーブルに収めるプログラムを記述する．
欧文用PLの\code{LIGTABLE}と似ているが，\code{LIG}の代わりに\code{GLUE}を
用いるところが異なる．
% [TODO] 書きかけ

\subsection{\code{DIRECTION}}
\code{DIRECTION \codechar{文字列}}の形式で，日本語フォントの組方向を指定する．
\codechar{文字列}の一文字目が|Y|であれば横組，|T|であれば縦組として扱う．
未指定の場合はデフォルトで横組として扱う．
(u)\pTeX と一緒に標準で配布しているものは，横組用に
\begin{verbatim}
(DIRECTION YOKO)
\end{verbatim}
を，縦組用に
\begin{verbatim}
(DIRECTION TATE)
\end{verbatim}
を指定している．

\clearpage


\section{JFMを扱うプログラム}\label{jfm-program}

\pTeX と\upTeX ，あるいはそれらが生成したDVIを扱うプログラムが
JFMを扱うのは当然であるが，ここではJFMおよび関連するフォントフォーマットを
扱うことに特化したプログラムの主なものを挙げる．

\subsection{pPLtoTF, upPLtoTF}

テキスト形式のJPLファイルをバイナリ形式のJFMファイルに変換する．いずれも
欧文\TeX 用の\code{pltotf}の上位互換であり，入力ファイルが欧文用のPLファイルで
あれば欧文用のTFMを生成し，和文用のJPLファイルであれば和文用のJFMを生成する．

\code{ppltotf}と\code{uppltotf}の違いは，エンコーディングである．
\begin{itemize}
  \item \code{ppltotf}: 常に\textbf{JIS}コードでエンコードされたJFMを生成するため，
    \pTeX 用のJFM生成には多くの場合\code{ppltotf}コマンドが用いられる．
  \item \code{uppltotf}: デフォルトでは\textbf{Unicode}（UCS-4の下位3バイト）で
    エンコードされたJFMを生成するため，主に\upTeX 用のJFM生成に用いられる．
\end{itemize}

\code{ppltotf}においては，\code{-kanji}オプションで
入力JPLファイルの文字コードを指定できる
（有効な値は\code{euc}, \code{jis}, \code{sjis}, \code{utf8}）．
\code{uppltotf}でも\code{-kanji}オプションが同じく使えるが，
同時にJFMのエンコードもJISになる（従って\code{ppltotf}と同じ挙動を示す）ことに注意
\footnote{\code{uppltotf}における規定値は\code{uptex}であり，
この場合はJFMがUnicodeでエンコードされる．}．

\subsection{pTFtoPL, upTFtoPL}

バイナリ形式のJFMファイルをテキスト形式のJPLファイルに変換する．いずれも
欧文\TeX 用の\code{tftopl}の上位互換であり，入力ファイルが欧文用のTFMであれば
欧文用のPLファイルを生成し，和文用のJFMであれば和文用のJPLファイルを生成する．

\code{ptftopl}と\code{uptftopl}の違いは，やはりエンコーディングである．
\begin{itemize}
  \item \code{ptftopl}: 入力JFMファイルを常に\textbf{JIS}コードで解釈するため，
    \pTeX 用のJFMデコードには多くの場合\code{ptftopl}コマンドが用いられる．
  \item \code{uptftopl}: 入力JFMファイルをデフォルトでは\textbf{Unicode}で解釈するため，
    主に\upTeX 用のJFMデコードに用いられる．
\end{itemize}

\code{ptftopl}においては，\code{-kanji}オプションで
出力JPLファイルの文字コードを指定できる
（有効な値は\code{euc}, \code{jis}, \code{sjis}, \code{utf8}）．
\code{uptftopl}でも\code{-kanji}オプションが同じく使えるが，
同時にJFMもJISコードで解釈される（従って\code{ptftopl}と同じ挙動を示す）ことに注意
\footnote{\code{uptftopl}における規定値は\code{uptex}であり，
この場合はJFMがUnicodeで解釈される．}．

\subsection{chkdvifont}

\TeX~Live 2019で追加された比較的新しいコマンドであり，
TFM/JFMファイルの簡単な情報を表示する機能を持つ（\OMEGA 用のOFMファイルにも対応）．

実行例を示す（注意：ファイル名の拡張子は省略不可．また，ファイルが
現在のディレクトリにない場合は，フルパスの指定が必要）．

\paragraph{欧文TFMの場合}
\begin{verbatim}
$ chkdvifont cmr10.tfm
    "cmr10" is a tfm file :  0  -> 127
    checksum        = 4BF16079
    design size     = 10485760 2^{-20} points = 10 points
\end{verbatim}
一行目の表示から，
欧文TFMであることと$\size{bc}=0$，$\size{ec}=127$であることが読み取れる．

\paragraph{和文横組用JFMの場合}
\begin{verbatim}
$ chkdvifont jis.tfm
    "jis" is a jfm file :  0  ->   5
    checksum        = 00000000
    design size     = 10485760 2^{-20} points = 10 points
\end{verbatim}
和文（横組用）JFMであることと$\size{bc}=0$，$\size{ec}=5$であることが読み取れる．

\paragraph{和文縦組用JFMの場合}
\begin{verbatim}
$ chkdvifont upjisr-v.tfm
    "upjisr-v" is a jfm(tate) file :  0  ->   5
    checksum        = 00000000
    design size     = 10485760 2^{-20} points = 10 points
\end{verbatim}
和文縦組用JFMであることと$\size{bc}=0$，$\size{ec}=5$であることが読み取れる
\footnote{\code{upjisr-v.tfm}は\upTeX 用JFMであるが，
原理的に\pTeX 用と\upTeX 用のJFMは区別できない．}．

\paragraph{和文JFMの拡張機能が使われている場合}
第\ref{jfm-new}節で述べたとおり，日本語\TeX 開発コミュニティによって
下記の3点につきJFMフォーマットの仕様が拡張されている．
\begin{enumerate}
  \item \node{char\_type}テーブルへの3バイトの文字コード格納
  \item \node{glue\_kern}テーブルでのスキップ(SKIP)コマンド使用
  \item \node{glue\_kern}テーブルでの再配置(rearrangement)
\end{enumerate}
和文JFMでこれらの拡張機能が使われている場合は\pTeX~p3.8.0以上が必要であるが，
この情報も表示される（下の例は再配置あり）：
\begin{verbatim}
$ chkdvifont upphiraminw3-h.tfm
    "upphiraminw3-h" is a jfm file :  0  -> 146
        New features in pTeX p3.8.0 / JFM 2.0:
        + rearrangement in glue_kern
    checksum        = 00000000
    design size     = 10485760 2^{-20} points = 10 points
\end{verbatim}

\subsection{makejvf}\label{makejvf}

JFMファイルを基にして，VF (virtual font)を生成するプログラムである．
\code{makejvf}が生成する和文VFの目的は以下のとおりである：
\begin{itemize}
  \item \pTeX や\upTeX で使われる多くのJFMでは，約物類（かっこ，句読点など）の文字幅を
    半角幅として定義し，見た目の空白をグルーやカーンの挿入によって実現している．
    例えば``（''のような左に空きがある括弧類は，左半分は文字の一部として扱わず，
    「グルーによる半角分の右シフト」と「半角幅の\inhibitglue （」として扱っている．
  \item 一方，DVIからPostScriptやPDFへ変換時に使われる実際のフォントでは，
    約物類も全角幅でデザインされている．そのため，DVIに配置された
    ``（''を実際のフォントの``（''に安直に置き換えると，想定よりも右にずれた
    位置に出力されてしまう．
  \item この位置ずれを補正するため，欧文フォントの合成や置換に実用されている
    VF（仮想フォント）という仕組みを和文フォントにも応用する．
    例えばVF中に「``（''は左に半角分ずらして置き換える」という記述を追加することで，
    DVIドライバがそれを解釈して位置補正できるようにする．
\end{itemize}
詳細はマニュアル|makejvf.1|（英語版）を参照してほしい．

\subsection{jfmutil}

JFMおよび和文VFを操作する種々の機能を提供するPerlスクリプトである．
主な機能は以下のとおり：
\begin{itemize}
  \item 和文の仮想フォント（VFとJFMの組）に対応する独自仕様の
    テキスト形式（ZVP形式）と，仮想フォントとの間の相互変換．
    欧文の仮想フォント（VFとTFMの組）とテキスト形式（VPL形式）との間を
    相互変換する|vftovp|/|vptovf|の和文版に相当する．
  \item 和文・欧文問わず，VFそれ単独に対応する独自仕様の
    テキスト形式（ZVP0形式；ZVP形式のサブセット）と，VFとの間の相互変換．
  \item 和文の仮想フォント（VFとJFMの組）を別の名前で複製する機能．
    VF中に記録された参照先のJFM名も適切に変更される．多書体化などに有用．
\end{itemize}
詳細は公式ドキュメントを参照してほしい．


\section{付録：利用可能なJFMについて}\label{jfm-dist}

\pTeX/\upTeX と一緒に標準で配布しているJFMについて，簡単に説明する．

\subsection{ptex-fonts}

コミュニティによる配布場所は |https://github.com/texjporg/ptex-fonts| であり，
内容物は以下のとおり．なお，\pTeX および\pLaTeX のフォーマットでは，既定で
横組用に |min*.tfm| と |goth*.tfm| を，
縦組用に |tmin*.tfm| と |tgoth*.tfm| を使用している．
\begin{itemize}
  \item 株式会社アスキーによるもの
    \begin{itemize}
      \item |min*.tfm|，|goth*.tfm|，|nmin*.tfm|，|ngoth*.tfm|（以上，横組用）
      \item |tmin*.tfm|，|tgoth*.tfm|（以上，縦組用）
    \end{itemize}
  \item 東京書籍印刷，現リーブルテックの小林肇氏によるもの
    \begin{itemize}
      \item |jis*.tfm|（JISフォントメトリック）
    \end{itemize}
\end{itemize}

\paragraph{株式会社アスキーによるJFM}

しばしば「|min10|系」と呼ばれる．
歴史が非常に古く，開発当時のドキュメントは残念ながらほとんど残っていない．
以下は，株式会社アスキーによる「日本語\TeX\ version j1.7」\cite{jtex1.7}に
付属していたドキュメント|README.KANJI|からの抜粋である．

\begin{quotation}
\paragraph{漢字フォント}

ディレクトリ |jfms| 内の漢字フォント用 JFM（TFM）ファイルは、以下に
示すサイズ（ドット数）のフォントを想定して作成されています（日本
語 version j0.3 の配布時のものと若干異なります。注意して下さい）。
尚、（株）アスキーより販売されている「日本語 Micro TeX」において
も、これと全く同じものを使用しています。

\begin{verbatim}
    TeX での呼び名  実寸（pt） 300dpi  480dpi  240dpi 118dpi
    5pt             4.58222      19     30      15     7
    6pt             5.49866      23     36      18     9
    7pt             6.4151       27     42      21     10
    8pt             7.33154      30     49      24     12
    9pt             8.24799      34     55      27     13
    10pt            9.16443      38     61      30     15
    10pt * 1.2^1/2  10.0391      42     67      33     16
    10pt * 1.2^1    10.9973      46     73      36     18
    10pt * 1.2^2    13.1968      55     88      44     22
    10pt * 1.2^3    15.8361      66     105     52     26
    10pt * 1.2^4    19.0034      79     126     63     31
    10pt * 1.3^5    22.804       95     151     75     37
\end{verbatim}

このサイズ以外のフォントを使用する場合は、プリンタドライバで疑似的に
これらのサイズに合わせるか、そのフォントに合わせたJFM（TFM）ファイル
を作成するかのどちらかになります。互換性を考慮する場合は、前者の方法
を取るべきです。しかし、それではどうしても気にくわないというのであれ
ば、|jtex/TeXware| に JFM 用の |tftopl| および |pltotf| がありますから、これ
を使用して新しい JFMファイルを作成して下さい。これらのユーティリティ
のドキュメントは、株式会社アスキー発行の「日本語 TeX テクニカルブック
I」を参照して下さい。（中略）

|jfms| 内には、|min*.tfm|、|goth*.tfm| の他に |nmin*.tfm| と |ngoth*.tfm| が含
まれています。前者は、句読点、ピリオド、カンマといくつかの仮名文字と
の間でカーニング処理を行うようになっていますが、後者ではこの処理を行っ
ていません。両者間では、これ以外の違いはありません。ただしマクロ中で
は、前者のみが定義されており、後者を使用する場合は自分で定義する必要
があります。
\end{quotation}

\jfont\minten=min10 % used in this paragraph!
通常の和文フォントは正方形の仮想ボディに収まるようにデザインされるが，
例えば公称10ポイントの|min10|は「幅\the\fontcharwd\minten`漢，
高さ\the\fontcharht\minten`漢，深さ\the\fontchardp\minten`漢」の
% 幅9.62216pt，高さ7.77588pt，深さ1.38855pt
扁平な矩形でデザインされている（$\mathrm{zw}=9.62216\,\mathrm{pt}$と
$\mathrm{zh}=9.16443\,\mathrm{pt}$が一致しない）．
また，例えば|ちょっと|が「ちょっと」ではなく「{\minten ちょっと}」と
詰まるなどの不自然な挙動も知られている\cite{min10otobe}．
ただし，\emph{互換性維持のため，コミュニティが修正を行う予定はない}．

\paragraph{JISフォントメトリック}

|jis*.tfm|は，JIS~X~4051-1995「日本語文書の行組版方法」になるべく即した
メトリックとして開発された\cite{jistfm}．
|min10|系を「そのまま置き換えて使ってもらう」ことを
意図しており，そのため，|min10|系の字詰まりの不具合等は直しつつ，
zw，zhの値を仮定した既存スタイルに影響を与えないように
|min10|のzw・zhの寸法は温存した設計になっている．
なお，|jsclasses|は横組用の|jis.tfm|と|jisg.tfm|を標準で使用している．

% JIS メトリックの説明（英語版）
% https://okumuralab.org/~okumura/texfaq/japanese/ptex.html
% http://ajt.ktug.org/2008/0201okumura.pdf

なお，|jis.tfm|（n無し）と|jisn.tfm|（n有り）の違いは
\begin{quote}
中黒\codechar{・}，コロン\codechar{：}，セミコロン\codechar{；}の組み方を
「半角幅＋前後グルー」とするか「全角幅」とするか
\end{quote}
だけである．

\paragraph{対応するVFと実フォント}

第\ref{makejvf}節で述べたとおり，\pTeX で使用するJFMと実際のフォントでは
一部の字幅が異なり，その位置ずれを補正するためにVFを用いている．
対応は以下のとおり（左が\pTeX 用JFM，右がDVIドライバ用JFMである
\footnote{DVIドライバ用JFMは全ての文字を全角扱いとしており，グルー挿入などは
一切定義していない．当然，\pTeX の組版時には使用すべきでない．}．
実際のOpenType/TrueTypeフォントの割り当ては，mapファイルに依存する；後述）．
\begin{itemize}
  \item |min*.tfm| → |min*.vf| → |rml.tfm|（→明朝体フォント，横組）
  \item |goth*.tfm| → |goth*.vf| → |gbm.tfm|（→ゴシック体フォント，横組）
  \item |tmin*.tfm| → |tmin*.vf| → |rmlv.tfm|（→明朝体フォント，縦組）
  \item |tgoth*.tfm| → |tgoth*.vf| → |gbmv.tfm|（→ゴシック体フォント，縦組）
  \item |jis*.tfm| → |jis*.vf| → |rml.tfm|（→明朝体フォント，横組）
  \item |jisg*.tfm| → |jisg*.vf| → |gbm.tfm|（→ゴシック体フォント，横組）
  \item |jis*-v.tfm| → |jis*-v.vf| → |rmlv.tfm|（→明朝体フォント，縦組）
  \item |jisg*-v.tfm| → |jisg*-v.vf| → |gbmv.tfm|（→ゴシック体フォント，縦組）
\end{itemize}

また，|tmin*.vf|及び|tgoth*.vf|では「縦書き時にソース中に
クオート\codechar{’}\codechar{”}を入力すると，
ミニュート\codechar{′}\codechar{″}を加工した文字に置き換える」と
いう処置も加えてある（\code{makejvf}の |-m| オプションの機能による）．
一方，|jis*-v.vf|及び|jisg*-v.vf|ではそのような処置を行わない．

\subsection{uptex-fonts}

配布場所は |https://github.com/texjporg/uptex-fonts| であり，
内容物は以下のとおり．なお，\upTeX および\upLaTeX のフォーマットでは，既定で
横組用に |upjisr-h.tfm| と |upjisg-h.tfm| を，
縦組用に |upjisr-v.tfm| と |upjisg-v.tfm| を使用している．

\paragraph{日本語用（upjis系）}

JISフォントメトリックを基に，JIS~X~0208→Unicodeで追加された記号類を
各文字タイプに追加した日本語用メトリックである．
|upjis*|と|upjpn*|のJFMの中身は同じであり，
対応するVFも（2022年現在は）実質的に同等である．

\begin{dangerous}
両者の違いは歴史的経緯にすぎない．
かつてはDVIドライバが|set3|命令すなわち「3バイト以上の文字出力」に
非対応のケースが多かったため，以下の仕様を設けていた．
\begin{itemize}
  \item 標準フォント|upjis*| … BMP内のみ出力可（VFは|set2|まで）
  \item オプションの|upjpn*| … BMP外も出力可（VFは|set3|も使用）
\end{itemize}
しかし，2018年以降はDVIドライバの|set3|対応が進んだことから，
標準フォント|upjis*|でも「Adobe-Japan1で定義されたBMP外の文字」を
出力できるように，VFに|set3|命令も使用することとした\cite{upf3}．
さらに，\TeX~Live 2021以降は各種DVIドライバによるJFM由来のVFの解釈が
以下のように拡張された：
\begin{quote}
|MAPFONT|で指示されているfont IDの一番若いものがJFMであり，\par
要求されたコードポイントが明言されていない場合は，\par
それが最小のfont IDに属すとみなし，そのコードポイントそのものを出力する．
\end{quote}
この解釈拡張により，VFに個々の文字を（|set3|命令を使うなどして）定義することなく，
省略されている場合でも文字出力が可能となった\cite{tjb99}．
\end{dangerous}

\paragraph{中国語簡体字用（upsch系）・中国語繁体字用（uptch系）・韓国語用（upkor系）}

日本語と中国語・韓国語では，
実際のフォントにおける記号類のデザイン（仮想ボディの中での配置）や
字詰めの方式が異なる点が多い．
そこで，\emph{実験的ではあるが}，日本語用（upjis系）の組み方では
明らかに不自然な点を調整したJFMをそれぞれ用意した．
詳細は\cite{upf2}を参照されたい．

\paragraph{対応するVFと実フォント}

対応は以下のとおり（左が\upTeX 用JFM，右がDVIドライバ用JFMである．
実際のOpenType/TrueTypeフォントの割り当ては，mapファイルに依存する；後述）．
\begin{itemize}
  \item |upjisr-*.tfm| → |upjisr-*.vf| → |uprml-*.tfm|（→日本語・明朝体）
  \item |upjisg-*.tfm| → |upjisg-*.vf| → |upgbm-*.tfm|（→日本語・ゴシック体）
  \item |upjpnrm-*.tfm| → |upjpnrm-*.vf| → |uprml-*.tfm|（→日本語・明朝体）
  \item |upjpngt-*.tfm| → |upjpngt-*.vf| → |upgbm-*.tfm|（→日本語・ゴシック体）
  \item |upschrm-*.tfm| → |upschrm-*.vf| → |upstsl-*.tfm|（→簡体中国語・宋体）
  \item |upschgt-*.tfm| → |upschgt-*.vf| → |upstht-*.tfm|（→簡体中国語・黒体）
  \item |uptchrm-*.tfm| → |uptchrm-*.vf| → |upmsl-*.tfm|（→繁体中国語・宋体）
  \item |uptchgt-*.tfm| → |uptchgt-*.vf| → |upmhm-*.tfm|（→繁体中国語・黒体）
  \item |upkorrm-*.tfm| → |upkorrm-*.vf| → |uphysmjm-*.tfm|（→韓国語・バタン体）
  \item |upkorgt-*.tfm| → |upkorgt-*.vf| → |uphygt-*.tfm|（→韓国語・ドトゥム体）
\end{itemize}

[TODO] クオート記号の割り当て
% https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=3153

\subsection{実フォントへの割り当て (ptex-fontmaps)}

先述のとおり，「DVIドライバ用JFM」に実際のOpenType/TrueTypeフォントを
割り当てるのはmapファイルの仕事である．
\TeX~Liveでは|ptex-fontmaps|として複数のプリセットを用意しており，
それらを|kanji-config-updmap(-sys)|というコマンドで切り替えることができる．
詳細は公式ドキュメント及び |https://github.com/texjporg/ptex-fontmaps| を参照のこと．

\begin{thebibliography}{99}
 \bibitem{jtex1.7}
   株式会社アスキー，「アスキー日本語\TeX 配布テープ 1992.02.24 (release~1.12)」
 \bibitem{min10otobe}
   乙部厳己，「min10フォントについて」，2000/12/12,\\
   |http://argent.shinshu-u.ac.jp/~otobe/tex/files/min10.pdf|
 \bibitem{jistfm}
   奥村晴彦，「pLaTeX2e 新ドキュメントクラス」，2016/07/07,\\
   |https://oku.edu.mie-u.ac.jp/~okumura/jsclasses/|
 \bibitem{jotf}
   Shuzaburo Saito，「Open Type Font用VF」，2019/04/01,\\
   |https://psitau.kitunebi.com/otf.html|
 \bibitem{cidofm}
   Hironobu Yamashita，「otf-cjXX-X.ofm は何のため？」，2019/05/31,\\
   |https://github.com/texjporg/japanese-otf-mirror/issues/15|
 \bibitem{upf3}
   Takuji Tanaka，「uptex-fontsで提供するフォントの文字範囲など」，2017/07/22,\\
   |https://github.com/texjporg/uptex-fonts/issues/3|
 \bibitem{tjb99}
   Takuji Tanaka，「和文vfの fallback を dviware で」，2020/03/11,\\
   |https://github.com/texjporg/tex-jp-build/issues/99|
 \bibitem{upf2}
   Hironobu Yamashita，「中韓フォントの JFM」，2017/07/01,\\
   |https://github.com/texjporg/uptex-fonts/issues/2|
\end{thebibliography}

\end{document}
