summaryrefslogtreecommitdiff
path: root/info/ptex-manual/jfm.tex
blob: 0e8d9b1573e29b0b68ed28715dcc99fb8b374eb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
\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ファイルに依存する).
% [TODO] この割り当てを定義するのが ptex-fontmaps である,まで言及したい.
% kanji-config-updmap のドキュメントまで導線を張るつもりだが,別の節にまとめる.
\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}

[TODO] 執筆予定.

% クオート記号
% https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=3153

\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|
\end{thebibliography}

\end{document}