JTeX Note
				桜井貴文(sakurai@math.s.chiba-u.ac.jp)
				千葉大 理学部 数学・情報数理学科


[] JTeXの漢字コード

ファイルおよび端末入出力の漢字コードは、以下の方法により指定できる。
1. コマンドラインのオプションによりファイルの漢字コード
	j(la)tex -code=値 ファイル
2. texmf.cnf中のjtex_filetypeの設定によりファイルのデフォルトの漢字コード
	jtex_filetype = 値
3. ファイル中の \kanjifiletype, \kanjiterminaltype の値によりファイル
   および端末入出力の漢字コード
	\kanjifiletype=値 \kanjiterminaltype=値

j(la)texを
	j(la)tex ファイル
のように起動した場合、ファイルの漢字コードは、formatファイル(j(la)tex.fmt)
をdumpしたときの \kanjifiletype により指定された漢字コードであると想定
して処理される。ただし、texmf.cnfで上記2のように指定されていたら、ファイル
の漢字コードはjtex_filetypeの値により指定された漢字コードであると想定
される。さらに上記1のように起動すると、ファイルの漢字コードは -code
オプションにより指定されているコードとして処理される。さらにファイル中で
commandで指定した場合は、それが優先される。(詳細は以下。そこの説明で
\kanjifiletypeの値によって指定される部分が、上記の1と2でも指定される。)

ここで値とコードの対応は以下の通りであるが、上記1および2の指定法による
ときは、0〜6,10,20以外に、ascii, jis, euc, sjis という記述も可能である。
(それぞれがどのコードを意味しているかは明らかであろう。ただし、jisは
下記のjis_6を意味する。)

0	ascii_only
1	jis_1		/* The third byte for enter kanji is at sign
				   and that for exit kanji is J */
2	jis_2		/* at sign and H */
3	jis_3		/* at sign and B */
4	jis_4		/* B and J */
5	jis_5		/* B and H */
6	jis_6		/* B and B */
10	shift_jis	/* shift jis code */
20	EUC		/* Extended Unix Code,
				   eighth bit is on for both bytes */

commandによるコードの決定は、
terminalへの出力：  asciiから漢字に変わる時の\kanjiterminaltypeの値で。
log fileへの出力：  asciiから漢字に変わる時の\kanjifiletypeの値で。
    (以上2つは1つのjobの間固定で十分なのですが、user(job)ごとに
    変更可能にするにはこうするか環境変数を使う位しか思いつかない。)
\writeによる出力：  \openoutの時の\kanjifiletypeの値で。
    (\writeのタイミングを考えるとこれが最も簡単。)
\input \readによる入力：  1行ごとに\kanjifiletypeまたは\kanjiterminaltype
    (端末から\inputする時)の値で。1行ごとに値を見るのは、JTeX macroの
    コードと自分が使うコードが違うかもしれないからである。
    ただし、現在既にあるmacro fileを修正しなくてもすむ様に、
	jisのとき	jisとEUCを受けつける
	sjisのとき	jisとsjisを受けつける
	EUCのとき	jisとEUCを受けつける
    とする。従って、共有するファイルはjisにしておけばいつでも大丈夫である。


[] 日本語フォントのloadの仕方

日本語フォントをloadするときは\fontと同様に
	\jfont\foo=dm10
	\jfont\baa=dg10 scaled \magstep2
等の様にすればよい。ただし、globalなassignmentとするために
	\global\jfont\foo=dm10
とはできない。こうしたいときは、
	\gjfont\foo=dm10
とする。

日本語フォントはいくつかのsubfontにわかれており、例えば
	\jfont\foo=dm10 scaled \magstep2
とすると、各subfontに関しては、そのときまたは必要に応じて
	\font\fooja=dmjka10 scaled \magstep2
等が実行される。

標準以外の日本語フォントをloadするときは、
	\makejfontdata{dxm10}{dxm}{10}{10}
のような宣言が必要である。ここで、
	第1引数		フォント名
	第2引数XXX第3引数
		サブフォントファイル名
		(XXX = jsy, jroma, jhira, ..., jka, ..., jkz
		 だが、\jsubfontnames により変更可能。)
	第4引数		design size (pt)
である。また上のXXXの部分は

	\def\jsubfontnames{% no space here
	jsy jroma jhira jkata
	jgr jrus jkei
	jka jkb jkc jkd jke jkf
	jkg jkh jki jkj jkk jkl
	jkm jkn jko jkp jkq jkr
	jks jkt jku jkv jkw jkx
	jky jkz
	}

のような定義により変更可能である。


[] 使ってはならないcommand名

上で述べた\jfont等のJTeX特有のcommand名は定義し直してはいけないが、
その他、ユーザーが直接には使わないが再定義してはいけないcommand名として、
	\jsy \jroma \jhira \jkata \jgreek \jrussian \jkeisen
	\ja \jb \jc ... \jz
があげられる。これらはcurrent jfontの各subfontを表わしている。
それから、例えば \jfont\foo=... としたとき、
	\foojsy \foojroma \foojhira \foojkata
	\foojgreek \foojrussian \foojkeisen
	\fooja \foojb \foojc ... \foojz
も再定義してはいけない。(一般にはどういうフォントがloadされているか
わからなかったりするので、jsy jroma jhira ... ja jb .. jz で終わる
command名は使わないことにするのが安全。)


[] 日本語glue

日本語に関するglueには
	日本語間に挿入されるglue
	日本語とASCII文字の間に挿入されるglue
	日本語と数式の間に挿入されるglue
	全角空白を表すglue
の4つがある。最初の3つは禁則処理が行われる場合を除いて自動挿入される。
これら4つのglueの値には各日本語フォントごとに定められたdefault値が
使われる。(このdefault値を変更する方法は次節で述べる。)default値以外の
値を使いたいときは上の4つのglueに対応する以下の4つのglue parameter
	\jintercharskip \jasciikanjiskip \jmathkanjiskip \jisspaceskip
に0pt以外の値をセットする。例えば
	\jintercharskip=0pt plus 2pt minus 1pt
とすると日本語間に挿入するglueとしてdefault値の代わりに\jintercharskip
の値 0pt plus 2pt minus 1pt が使われる。その他の3つについても同様である。
全角空白のglueだけは`\jisspaceskip'という他と統一性がない名前になって
いるが、これは以前の版とのcompatibilityのため\jspaceskipでdefault値を
参照できるようにしたためである。その他の日本語glueについては\jspaceskip
に相当するものはない。

また、glueではないが、日本語に関連した長さの単位として zw, zh が使える。
これらはそれぞれ、カレント日本語フォントの文字幅(defaultでは\jspaceskip
に等しい)、および文字の高さ+深さに等しい。


[] 日本語glueのdefault値のセットの仕方

例えば \jfont\foo=dm... で定義された \foo の日本語glueのdefault値を
変更したいときは
	\defjintercharskip{\foo}{0pt}{1pt}{0pt}
等とする。ここで2番目の引数はglueのspace、3番目の引数はglueのstretch、
4番目の引数はglueのshrinkである。4つの各glueについてdefault値を変更する
commandが定義されており、それらはそれぞれ
	\defjintercharskip	\defjasciikanjiskip
	\defjmathkanjiskip	\defjspaceskip
である。
# 通常の使用に関しては以上のことを知っていれば十分であろうが、複雑な
# macroを書きたいときのため、情報を追加しておく。ただし将来、変更され
# る予定である。
日本語glueの各成分の値はja subfontのfontdimen paramに格納される。
場所は以下の通りである。
			space	stretch	shrink
	jintercharskip	2	3	4
	jasciikanjiskip	7	8	9
	jmathkanjiskip	10	11	12
	jspaceskip	13	14	15
上記の \def.. はこれらのfontdimen paramを操作しているのである。
また例えば次の様にすればcurrent jfontのglueに相対的に変更できる。
	\skip255\fontdimen3\ja \multiply\skip255 by 2
	\fontdimen3\ja\skip255
この段階ではfontdimen paramが変更されているだけで、これを4つの
glueに反映させるためには
	\setjglues
とすればよい。
(注意: 将来日本語glueのparameterをja subfontのfontdimen paramでなく
専用の場所に移動させるかもしれない。)


[] 数式中の日本語

version 1.12以前の版では数式中に日本語を入れるには \mbox で囲まなければ
ならなかったが、現在はそのまま入れることも可能になっている。しかし、
添字として使っても小さくはならない。


[] JTeXにおける改行の処理について

TeXでは<return>と<space>の扱いについて次の様な規則があります。
	(a) 空白行でない行の間の<return>は<space>とみなす。
	(b) 2つ以上の<space>は1つの<space>と同じ。
これだけ知っていればほぼ十分なのですが、空白行(<space>のみからなる
行も含む)も考慮してもう少し厳密に述べると、次の順に処理されます。
	(a) 行末の<space>は無視する。
	(b) 次の文字も<return>である<return>以外の<return>は<space>とみなす。
	(c) 2つ以上の<space>は1つの<space>と同じ。
これから派生規則として
	(d) 行頭の<space>は無視する。
が導かれ、また以上とは別に、
	(e) コメントの次の行頭の<space>は無視する。
という規則があります。

(注：以下、漢字と言った場合、ひらかな、かたかな等も含みます。)

しかし、一般に日本語の文章は漢字の前後はどこでも改行してよいので、
<return>を<space>と見なすと余計な空白がはいります。JTeXでは、
\jendlinetypeの値によって、これを制御することにしました。
すなわち、\jendlinetypeの値が、
  0のとき、特別な処理はしない(TeXと同じ)
  1以上3以下のとき、
	(a) 行末の<space>は無視する。
	(b) 2つ以上の<space>は1つの<space>と同じ。
  1のとき、(a)、(b)に加えて
	(c) 漢字で終わる行はその漢字の後にコメントがあると見なす。
	    (したがって次の行頭の<space>は無視する。)
  2のとき、(a)、(b)に加えて
	(d) 次の文字も<return>である<return>以外の<return>のうち、
		前か後に漢字がある場合はその<return>は無視し、
		そうでない場合はその<return>は<space>とみなす。
  3のとき、(a)、(b)、(c)、(d)
となります。規則(d)で<return>を無視する場合、ある行が英字で終わって
いても、次の行頭が漢字ならば空白ははいりませんが、こうすると
句読点として英字の . , の後に空白を入れて使っている場合、具合が悪く
なります。これに対処するため、規則(d)を適用するとき<return>の前が
指定した英字ならば(d)の適用はしない、というようにしました。その
指定をするためのコマンドが \asciipunct で、
	\asciipunct`, 1
のように使います。指定を解除するときには1を0にします。
defaultは、jtexbase.texで
	\jendlinetype=3
	\asciipunct`, 1
	\asciipunct`. 1
と設定されています。\jendlinetype=2 にするとversion 1.06以前と
同じになります。また、ファイルの最期の<return>については規則(d)を
適用しません。

ただし、この変更は端末からテキストが入力されるときやファイル
から\readで読むときには適用されません。従って、大抵の場合には
適用されることになります。

なお、この様に変更した結果、行の最後でエラーが起きた場合
(例えばその行を10行とすると)、TeXでは必ず
l.10 ...xxx xxx xxx

と表示されますが、JTeXでは
l.11
     yy yyy yyyy
と表示される事があります。これは11行の先頭の前、即ち10行の最後で
エラーが起きた、と読めるので表示が間違っているというわけでは
ありません。


[] 遅延(on demmand) font loading

version 1.0以来、日本語サブフォントについては必要になったとき始めて
loadするように*みせかけて*いるのですが、version 1.1で新しいprimitive
\delayedfont を導入して、必要になったとき*本当に*tfm fileをloadする、
ということを英字(というか256個以下の文字の)のフォントに対して可能に
しました。例えば、
	\delayedfont\foo=cmr5
としておけば、\fooを使ったときにcmr5.tfmがloadされfont番号が割あて
られます。使わなければ何も起こりません。実は単に遅延loadingするだけ
ならmacroを使って実現できますが、\jfontとの関係をすっきりさせるためと
以下で説明するshare機能をつけるため、primitiveにしました。share機能
というのは、例えば、
	\font\foojkata=dmjkata10
	\delayedfont\foojhira=dmjhira10 share \foojkata
とすると、\foojhiraを使ったとき始めてfont番号が割あてられ、フォント名
以外は同じフォント情報を共有します。さらに、これはこりすぎかもしれませんが、
	\delayedfont\foojkata=dmjkata10
	\delayedfont\foojhira=dmjhira10 share \foojkata
という具合に‘ちゅうぶらりん’の宣言も可能です。version 1.1では
これらの機能を使って\jfontを書き直してあります。
