upTeX, upLaTeX --- 内部unicode版 pTeX, pLaTeX の実装実験 2009.08.23 Ver0.28 TANAKA, Takuji KXD02663(at)nifty(dot)ne(dot)jp ◇ upTeX開発のねらい ASCII pTeX/pLaTeXは、高品質の日本語組版ソフトウェアとして、いくつ かあるTeXの日本語化の中でもデファクトスタンダードの地位にある。縦組 の機能や日本語組版の品質はもとより、信頼性の高さや周辺ソフトウェアの 充実、ユーザー層の厚さなど、多くの点で圧倒的な魅力がある。しかし、直 接使える文字集合は、原則的にJIS X 0208(JIS第1,2水準)の範囲に限定され ている。例えば丸付き数字などは、「機種依存文字なので使えません」とい うことになっている。その一方、昨今のコンピュータ周辺の環境では、 JIS2004ことJIS X 0213(第3,4水準を追加)や、Unicode、Adobe-Japan1-6の ような公的/私的な規格、Machintosh搭載のヒラギノ、Windows搭載のMS明朝、 Acrobatに添付の小塚明朝など、JIS第1,2水準を超える範囲の文字を容易に 利用可能な環境はどんどん整ってきた。もはや、JIS第1,2水準で我慢してい るのはつまらない。機種依存文字は使えませんといって済ますことができる ような時代ではないのである。 これを克服する努力も繰り広げられてきた。そのひとつにUTF/OTFパッケー ジがある。巨大なvirtual fontに多分割する方法で巧妙にpTeXの狭い文字空 間をかいくぐり、UnicodeやAdobe-Japan1-6といった大文字集合を利用できる ようにした功績は大きい。しかし、マクロベースであり、直接文字入力する こともできないしaux, logなどに直接文字として出力することもできないな ど、制限事項も多い。Utf82TeXでは、プリプロセッサを利用することで、 UTF/OTFパッケージの入力の繁雑さを克服しているが、内部はpTeXであること に変わりなく制限事項を完全に克服できたわけではない。ptex-utf8, platex-utf8 は、pTeX入力のUTF-8化の大きな一歩であるし、^^ab化などの 工夫で\inputenc{utf8}との親和性が向上してはいるものの、日本語の基本 部分はやはりJIS X 0208の範囲に留まっている。いずれのアプローチも、 JIS第1,2水準外の現代の新しい標準を普通の文字として直接普通に使えるよ うになるまでには至っていない。Omega/lambda, XeTeXなどTeXのUnicode拡 張はあるものの、日本語の組版品質の繊細な部分まで行き届いているとは言 いがたいようであるし、マクロ類の充実、ユーザー層の厚さや参考書の多さ などを含めた環境整備はまだまだである。 pTeXにも弱味はある。前述の文字集合の問題以外にも、二点挙げてみよう。 一つは、8bitの非英語欧文との親和性である。もともとpTeXは、8bit目が立 った文字コードがEUCやShift_JISのパターンにマッチすると、和文処理に回 す。その動作が固定されているために、8bitを使うような日本語以外の文字 コードが直接処理できない。近年のpTeX+babelは、その動作をかいくぐる工 夫を要しており、単純とは言いがたい上に8bit欧文の直接処理も困難である。 もう一つは、pTeXの利用が日本語に限られていることである。中国語/韓国 語との混植は、UTF/OTFパッケージで可能になったとはいえ、マクロベースの 不便さは否めない。Unicode時代にあって、ローカルなソフトウェアは国際的 なディストリビューションの中でobsolete扱いを受けるようになってきたと 聞く。pTeX内部の動作をよく見ると、中国語/韓国語を含んだI18Nを施すこと はさほど難しくないように思えるが、実際にそうした話は聞いたことがない のは実にもったいないことである。日中韓(CJK)混植という面ではCJK-latex のようなマクロベースのアプローチもあるが、和文の組版品質や各種制限の 多さは問題である。pTeXでCJKの文字を直接扱うような拡張法の方が遥かによ い解となることは間違いない。 本upTeXの目標は、pTeXの利点をそのまま受け継ぎつつ、上記三つの弱点 を克服したpTeXの無理のない自然な拡張により、新時代の日本語(+東アジア) 標準TeXの地位を目指すことにある。文字集合の面では、pTeXの和文がJIS X 0208の範囲だったのに対し、upTeXでは内部コードをUnicode化しその中の CJKのレパートリーの範囲を和文の組版に利用する。8bit欧文との親和性の 面では、プリミティヴの指定により、和文/欧文の切替えを可能にする。国 際化の面では、pTeXでは日本語限定だったのに対し、upTeXではUnicode化に より中国語/韓国語を強化する。これらの拡張により、全世界制覇は無理に しても東アジア(CJK)標準TeXの地位に近付きたい。そこまでいければ、中韓 のTeXユーザーや開発者の方々もこの拡張版pTeXの利用環境のさらなる改善 に力になってくれるかもしれない。壮大な目標ではあるが、土台のpTeXの申 し分のない高みを出発点として、無理のない自然な拡張を着実に行っていけ ば、成果を出しつつ目標に近づけるであろうと目論んでいる。 ◇ 主な開発方針 <0> pTeX の基本的な機能はそのままで、内部の和文処理を EUC/SJIS から Unicode に変更する。 jfm の使用、dvi命令(255)の拡張など、pTeX 独自の特殊な拡張や 組版のアルゴリズム等は一切さわらずに、そのまま受け継ぐ。 このため、dviware などは pTeX 用拡張とほぼ同等の特殊処理が要る。 欧文用 dviware では対応できない場合がある点では pTeX と同じ。 <1> Unicode 化においては、pTeX の自然な拡張を行い、 pTeX のいくつかの弱点を克服する。 この点において、必要なら pTeX からの改造量が多少増えるのは厭わない。 <2> pTeX との互換性は出来るだけ維持する努力をする。その一方、 Unicode の文字集合や構造を前提として見たときにあまりに不自然な部分は、 互換性の維持をあきらめる。 例えば、kcatcode の default 値、 kcatcode の切替えのブロックの単位など。 <3> 8bit 欧文コードの処理が可能になるよう、和文/欧文の切替え用の プリミティヴを拡張、新設する。 pTeX では極めて限定的だった、欧文 Babel との整合性が向上する。 内部 Unicode 化を本当に行っているのは cjk トークンだけであり、 欧文部分はオリジナルの欧文 TeX と同等である。 pTeX から見ると欧文部分の機能が向上しているように見えるが、 欧文 TeX から見ると pTeX が欧文 TeX の機能を阻害していた部分を取り除いただけである。 <4> pTeX の和文トークンを cjkトークンとして扱い、 中国語/韓国語対応を強化する。 <5> pTeX の和文トークンの 16bit を単純に Unicode (UCS2等) 化すると 欧文トークン (catcode 4bit + charcode 8bit) と衝突してしまう。 これを回避する手法は何通りか考えられるが、 cjkトークンの上限の拡張を行い、 cjkトークンを (kcatcode 5bit+charcode 24bit) で扱う。 pTeX からの改造量はやや大きいが、欧文 TeX との対称性は良くなる。 <6> U+2xxxx (Supplimentary Ideograph Plane, SIP) の漢字も サポートする。ただし、dviware の対応状況に差が出る可能性を考慮し オプション扱いとする。 <7> 日本ローカル色を薄めるだけの目的での機能変更、整理、削除は行わない。 \xkanjiskip, \euc などはそのままの名称、機能で維持する。 理由は、少々の手当で日本ローカル色が払拭できるはずもなく、 pTeX との互換性を下げるだけに過ぎない結果になるであろうから。 この方針により、pTeX が抱えていた弱点はいくつか解消できるものの、 pTeX の特殊性 (全角等幅フォント前提の jfm 等) は保たれているし、 pdfeTeX など欧文 TeX の近年の動向から遠く離れたままであるし、 欧文部分 は 8bit のままであるし、 OpenType の新技術などを駆使できているわけでもない。 世界の最新の TeX 環境や 他の Unicode 拡張 (Omega/Aleph, XeTeX, LuaTeX 等)と比較すると、 旧くさく中途半端な印象を受けるかもしれない。 しかし、pTeX との互換性がほぼ 100% の Unicode 版 cjk TeX となり pTeX を中心に推移してきた日本の TeX ユーザーが 過去の資産を利用しつつ手早く Unicode のおいしい部分を享受するために、 的確な solution になっていると思う。 正直なところ、日本ローカル色は依然非常に強く 中韓の TeX ユーザーが使いたくなるものになっているかどうかの点で あまり期待は大きく持てないかもしれないが、 日本の TeX ユーザーが中国語/韓国語を混植するような用途には向いていると思う。 ◇ 主な仕様 <0> 名前をupTeX, upLaTeX と命名する。 unicode版pTeXという主旨で。 出来ることは欧文TeX + pTeXの和文拡張部分のUnicode版なので、 uTeX とか universal TeX はおこがましい。 <1> 内部コードとしてUnicodeを使用する。 入出力バッファのエンコーディングはUTF-8。 内部エンコーディングはほぼUTF-32(註1)。 <2> 入力ファイル(.texなど)はUTF-8とISO-2022-JPの自動判定。 出力ファイル(.log, .auxなど)はUTF-8。 <3> tfm(jfm)のエンコーディングはUCS-2。 エンコーディング名は JY2, JT2 とする。 U+FFFFを越える文字は、U+2xxxx(SIP)の漢字を想定し、 chartype が defaultの 0 の漢字として組版する。 jfmのフォーマットは当面拡張せずpTeXのままとする。 <4> dvi, vfにはUnicodeスカラー値を2〜3バイトで記録する(註2)。 U+FFFF以下の文字はset2で、U+FFFFを越える文字はset3で扱う。 和文として扱える文字コードの最大値はUnicodeの最大値U+10FFFF。 <5> 和文、欧文の切替えは、コードレンジのチェックに加えkcatcodeを見て行う。 kcatcode=16,17,18なら漢字,かな,和文その他記号(pTeXと同様)で、 kcatcode=15なら欧文、非CJKの文字(新規)。 kcatcode=19ならhangul(新規)。hangul直後の改行は欧文同様、 空白と看做すが、それ以外の点では、漢字と全く同じ動作になっている。 <6> 欧文と判定されればUTF-8の8bit可変長文字列として内部処理する。 オリジナルの欧文TeXと完全に互換の処理ができる。 すなわち、欧文LaTeXの\inputenc{utf8}やBabelが障害なく利用できる。 <7> 和文と判定されればpTeXと同様の処理ができる。 すなわち、組版はもちろん、 漢字,かなをコントロールワードに使う機能等が障害なく利用できる。 <8> kcatcodeの切替えはUnicodeのBlock毎に可能。 ( http://www.unicode.org/Public/UNIDATA/Blocks.txt ) ( ちなみに、オリジナルpTeXでは2バイト文字のうち上位バイト毎。 ) <9> 和文の内部コードは、kcatcode 5bit+charcode 24bit で処理する。 内部コードが欧文(catcode 4bit+charcode 8bit)と重なることはない。 <10> 従来のpTeXでは、kcatcodeの参照を文字コードからkcatcodeの表を引き 間接的に行う方法を行っている。この方法を ファイルなどからの読み込み時と内部処理時の両方で行っている。 upTeXでは、ファイルなどからの読み込み時は同様であるが、 内部処理時には、<9>でcjkトークン毎に振ったkcatcodeを読み込むように 変更した。たとえ同じ文字コードでもkcatcodeの途中変更を行えば、 cjkトークン毎に異なるkcatcodeを割り当てることが出来るようになる。 <11> 新しく \ucs プリミティヴを新設。 \char\ucs"301C, \kchar\ucs"301C はU+301C(波ダッシュ)になる。 <12> uptex, uplatex などでは -kanji=uptex と指定して 動くように実装した。 その他の漢字コード指定の場合は、 基本的に従来のpTeXと同様の結果になるはず。 <13> 各文字が実際のフォントで利用可能な文字かどうかの判定は uptex 本体では行わない。この判定は dviware で行うことになる。 「任意の部分実装を容認している Unicode において 文字集合の範囲の固定的な判定は不可能だ」という理由もあるが、 この仕様は pTeX でも同様となっている。 <14> 新しく \kchar, \kchardef プリミティヴをを追加。 \char`<文字>, \chardef では文字コードが255以下の場合には欧文動作、 265以上の場合には和文動作となる。 \kchar`<文字>, \kchardef では文字コード範囲によらず和文動作となる。 <15> デフォルトのフォントはset2の範囲で済むようにし、 set3を含むフォント(vf)は、オプションとする。 dviwareのset3対応の普及が進むのを待つため。 将来的にはset3対応を標準としたい。 <16> ISO-2022-JP{-3,-2004}, EUC-JISX0213, Shift_JISX0213などの JIS X 0213系エンコーディングも将来使用可能にしたいが、 当面開発凍結する。 (註1) 32bitではなく24bitで扱っている点で厳密にはUTF-32ではない。 あるいは、正規のUnicodeスカラー値(≒コードポイント)を 24bitで表したものといってもよい。 (註2) 正規のUnicodeスカラー値(≒コードポイント)と 等しい値を16/24bitで表したもの。 すなわち、UTF-32の下位16bit/24bitと等しい。 ◇ 内部処理の流れ (1) pTeX入力 [8bit可変長(UTF8)] ↓ <1> ptexenc [8bit可変長(UTF8)] ↓ (2) 入力バッファー [8bit可変長(UTF8)] ↓ <2> multistrlen,kcatcode等で和文/欧文を判定して変換 ↓ (3) 内部レジスター [和文5+24bit, 欧文4+8bit] { 最大29bit 欧文と和文で別構成※1 } ↓ <3> マクロ展開 ↓ (4) 組版処理 [和文5+24bit, 欧文4+8bit] (4a) tfm, jfm, (ofm)へのアクセス [和文16bit, 欧文4+8bit] ※2 <4a> ptexenc (4b) dviへの入出力 [和文5+24bit, 欧文4+8bit] ※3 <4b> ptexenc ↓ (5) 出力バッファー [8bit可変長(UTF8)] ↓ <5> ptexenc ↓ (6) 出力 (log, 端末など) [8bit可変長(UTF8)] ※1: 欧文はcatcode 4bit + 文字コード8bit (Omegaではcatcode 4bit + 文字コード16bitだが、Omegaへの拡張を視野にいれたい。) 和文はkcatcode 5bit + 文字コード24bit。 オリジナルpTeXでは、和文は文字コード16bit, kcatcodeは、文字コードを引数として表を参照して求めていたが、 upTeXでは、欧文と同等に(k)catcodeと文字コードの組となるように変更した。 和文/欧文トークンは 29bit を重ならないように使用していることになる。 U+10FFFFのUnicode最大値までを和文として処理できることを想定している。 U+1xxxxの文字は考慮していない。Omegaの拡張的アプローチが必要か。 ※2: U+FFFF超の文字は当面U+2xxxxの漢字のみを想定し、 U+2xxxxのchar typeをdefaultの0番と解釈することにすれば、 jfmは当面拡張する必要がない。 (2), (3), (4)のあたりで欧文8bit(TeX)との共存も可能。 欧文のcatcodeで使用しているレンジをさらに上位バイトに移動し、 和文24bit, 欧文16bit(Omega) と共存可能にし、 ptexencにOTPインタープリターを突っ込み、 ofmとjfmの混在した組版を可能にすれば upTeX + Omega = upOmegaが出来る??? ◇ 文字コード関連のまとめ [凡例] ○:欧文、△:欧文8bit多byteの擬似的な動作 ■:和文、―:使用不可 token:内部トークンでの文字コード text:SJIS/EUC/UTF-8など入出力の文字コード ( ):defaultではない [欧文TeX] token text ^^ab \char 〜0x7F ○ ○ ○ ○ 〜0xFF ○ ○[a] ○ ○ 0x100〜 ― △[b] ― ― [pTeX] token text ^^ab \char 〜0x7F ○ ○ ○ ○ 〜0xFF ○ ―[c] ○[f] ○ 0x100〜 ― ―[d] ― ― 0x8000〜 ■ ■[e] ― ■[g] [upTeX(v.0.10〜)] token text ^^ab \char \kchar 〜0x7F ○■[h] ○ [i] ○ ○[l] ■[o] 〜0xFF ○■[h] (○)■[j] ○ ○[m] ■[o] 0x100〜 ■ (△)■[k] ― ■[n] ■[o] [a] 8bit1byteで扱うのが基本。[b]のためにこの領域が使われることもある。 [b] 8bit多byteの処理をactive文字化で実現する手法(inputenc,CJK-LaTeX等)がある。 [c] SJIS/EUCのパターンに合わない場合のみ通る。欧文TeXから見ると制限事項になる。 回避には、^^ab, \char などでするしかない。 [d] [b]の方法が使えない。欧文TeXから見ると制限事項になる。 回避には、^^ab, \char などでするしかない。 [e] 入力では8bit2byte。SJIS/EUCのパターンに合う場合のみ有効。 [f] ここの不具合解消によりpTeX+babelが実現可能になった。 [g] 和文/欧文はコードレンジで簡明に区別できる。 [h] 和文の場合はkcatcode付きで管理されるので、欧文と区別できる。 [i] 欧文のみ可能。和文は不可。 [j] defaultは和文。kcatcodeの切り替えにより欧文化が可能。 [k] defaultは和文。kcatcodeの切り替えにより欧文の8bit多byte扱いが可能。 [l] 欧文のみ可能。和文は不可。 [m] 欧文のみ可能。和文は不可。一部(例えば\char\jis"215F(×)など)がpTeX と非互換になる。 [n] 和文のみ可能。欧文は不可。pTeXとの互換性のため用意。 [o] 和文のみ可能。欧文は不可。 ◇ pTeX との対照表 ◎ デフォルトのエンコーディング JY1 → JY2 JT1 → JT2 ◎ min10系のフォント(オプション) min10.tfm → umin10.tfm min9.tfm → umin9.tfm min8.tfm → umin8.tfm min7.tfm → umin7.tfm min6.tfm → umin6.tfm min5.tfm → umin5.tfm goth10.tfm → ugoth10.tfm goth9.tfm → ugoth9.tfm goth8.tfm → ugoth8.tfm goth7.tfm → ugoth7.tfm goth6.tfm → ugoth6.tfm goth5.tfm → ugoth5.tfm min10.vf → umin10.vf min9.vf → umin9.vf min8.vf → umin8.vf min7.vf → umin7.vf min6.vf → umin6.vf min5.vf → umin5.vf goth10.vf → ugoth10.vf goth9.vf → ugoth9.vf goth8.vf → ugoth8.vf goth7.vf → ugoth7.vf goth6.vf → ugoth6.vf goth5.vf → ugoth5.vf ◎ jis.tfm系のフォント(オプション) jis.tfm → ujis.tfm jisn.tfm → ujisn.tfm jis-v.tfm → ujis-v.tfm jisn-v.tfm → ujisn-v.tfm jisg.tfm → ujisg.tfm jisng.tfm → ujisng.tfm jisg-v.tfm → ujisg-v.tfm jisng-v.tfm → ujisng-v.tfm jis.vf → ujis.vf jisn.vf → ujisn.vf jis-v.vf → ujis-v.vf jisn-v.vf → ujisn-v.vf jisg.vf → ujisg.vf jisng.vf → ujisng.vf jisg-v.vf → ujisg-v.vf jisng-v.vf → ujisng-v.vf ◎ rml.tfm系のフォント rml.tfm → urml.tfm rmlv.tfm → urmlv.tfm gbm.tfm → ugbm.tfm gbmv.tfm → ugbmv.tfm ◎ upjisr-{hv}.tfm系のフォント(デフォルト、新規) ------- → upjisr-h.tfm (UniJIS-UTF16-Hを想定) ------- → upjisg-h.tfm (UniJIS-UTF16-Hを想定) ------- → upjisr-v.tfm (UniJIS-UTF16-Vを想定) ------- → upjisg-v.tfm (UniJIS-UTF16-Vを想定) ------- → upjisr-hq.tfm (UniJIS-UCS2-Hを想定) ------- → upjisg-hq.tfm (UniJIS-UCS2-Hを想定) ------- → upjisr-h.vf (UniJIS-UTF16-Hを想定) ------- → upjisg-h.vf (UniJIS-UTF16-Hを想定) ------- → upjisr-v.vf (UniJIS-UTF16-Vを想定) ------- → upjisg-v.vf (UniJIS-UTF16-Vを想定) ------- → upjisr-hq.vf (UniJIS-UCS2-Hを想定) ------- → upjisg-hq.vf (UniJIS-UCS2-Hを想定) ------- → uprml.tfm (UniJIS-UTF16-Hを想定) ------- → upgbm.tfm (UniJIS-UTF16-Hを想定) ------- → uprmlv.tfm (UniJIS-UTF16-Vを想定) ------- → upgbmv.tfm (UniJIS-UTF16-Vを想定) ------- → uprmlq.tfm (UniJIS-UCS2-Hを想定) ------- → upgbmq.tfm (UniJIS-UCS2-Hを想定) ◎ 各種ファイル ptex.ini → uptex.ini ptex.tex → uptex.tex (min10ベース → upjisr-hベース) kinsoku.tex → ukinsoku.tex platex.ini → uplatex.ini platex.ltx → uplatex.ltx pldefs.ltx → upldefs.ltx jy1mc.fd → jy2mc.fd (min10ベース → upjisr-hベース) jy1gt.fd → jy2gt.fd (goth10ベース → upjisg-hベース) jt1mc.fd → jt2mc.fd (tmin10ベース → upjisr-vベース) jt1gt.fd → jt2gt.fd (tgoth10ベース → upjisg-vベース) jarticle.cls → ujarticle.cls tarticle.cls → utarticle.cls jreport.cls → ujreport.cls treport.cls → utreport.cls jbook.cls → ujreport.cls tbook.cls → utreport.cls tsize10.clo → utsize10.clo tsize11.clo → utsize11.clo tsize12.clo → utsize12.clo tbk10.clo → utbk10.clo tbk11.clo → utbk11.clo tbk12.clo → utbk12.clo ◎ CJK対応新規フォント upjpnrm-{h,v}.{tfm,vf} (set3使用) upjpngt-{h,v}.{tfm,vf} (set3使用) upschrm-{h,v}.{tfm,vf} (set3使用) upschgt-{h,v}.{tfm,vf} (set3使用) uptchrm-{h,v}.{tfm,vf} (set3使用) uptchgt-{h,v}.{tfm,vf} (set3使用) upkorrm-{h,v}.{tfm,vf} upkorgt-{h,v}.{tfm,vf} upstsl-{h,v}.tfm upstht-{h,v}.tfm upmsl-{h,v}.tfm upmhm-{h,v}.tfm uphysmjm-{h,v}.tfm uphygt-{h,v}.tfm ※ Adobe Acrobat Reader 4 は以下の`generic fonts'を認識するそうだ。 (Ref. http://project.ktug.or.kr/omega-cjk/tug2004-preprint.pdf) Serif Sans Serif Chinese Simplified STSong-Light STHeiti-Regular Chinese Traditional MSung-Light MHei-Medium Japanese Ryumin-Light GothicBBB-Medium Korean HYSMyeongJo-Medium HYGoThic-Medium ◇ 動作状況 uptex ほぼ動いている。 和文トークンの内部コードを 21bit から kcatcode 5bit + charcode 24bit に大幅に変更した(uptex-0.07)。 \char`<文字>, \chardef では文字コードが255以下の場合には欧文動作、 265以上の場合には和文動作となるようにuptex-0.10で変更した。 さらに、文字コードが255以下の場合に和文動作をするためのプリミティヴ \kchar`<文字>, \kchardef を追加した。 uplatex ほぼ動いている。 uppltotf ほぼ動いている。 uptftopl ほぼ動いている。 updvitype set3も含めて動いている。 upjbibtex テスト中。ほぼ動いている。しかし、jalpha.bst 使用時に 一部のエントリーでeuc動作と同等にならない問題がある。 mendex 対応が難しいので当面放置。 upjmpost set3も含めて動いている。 ただし、日本語vfの領域を食い過ぎで多書体ができない。 xdvi set3も含めて動いている。 dvips set3も含めて動いている。 uptex-0.04までに追加していたオプション -UCS は廃止し、自動判定にした。 bookmark作成のためのrubyスクリプトconvbkmk.rbを作成した。 dvipdfmx set3も含めて動いている。 ただし、set3で、「内部コードがUTF-32, CMapがUniXXX-UTF16」であること を仮定したハードコーディングになっている。柔軟性が無く当面の間に合わせ。 xdvipdfmx のコードを一部採り入れ dvipdfmx で hyperrefとの組合せで bookmarkを CMAP なしでほぼ正常に生成できるようにした (dvipdfmx, xdvipdfmxともGPL Ver.2)。 ただし、Extension Bの文字は化けてしまっている (*.out の時点では化けていないのでdvipdfmxの問題か?)。要調査。 bookmarkでUnicode以外の文字コードの場合との互換性の問題があるそうだ。要調査。 dviout set2の範囲では改造無しでフォントの設定のみで動いている。 set3の範囲は文字化けしてしまうが、落ちることはない。 OTFパッケージの \CID{} が Unicode 経由なのは、 pLaTeX と同様。 http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/51610.html の問題点の御報告がある。dviout の修正法は? makejvf 簡単な対応を施した。 オプション -u, -3, -J, -U, -H, -i を新設した。 ptexenc ほぼ動いているが、一部機能していないまま放置。 合成文字の扱いが動いていない。 JIS→Unicode の変換表の中身は再検討すべき。 umin10.tfmなど 詳細未検討。 JIS X 0208の範囲ではほぼUnicodeに移植出来ていると思う。 JIS X 0213の追加の約物は一応入れた。 その他 JIS X 0208/0213 以外の約物はAJ1-6でめぼしいものはないようだ。 半角カナにも一応対応してみたが要テスト。 ukinsoku.tex JIS X 0213 に一応対応してみた。 utf/otfパッケージ utfパッケージは、動いているようだ。 otfパッケージは、動いているようだ。 今回、0x10FFFF 超の文字コードを使う少々トリッキーな方法で \UTF, \OTF マクロで使用する vf として EUC/SJIS 前提の従来のものがそのまま使えるように実装した。 noreplace なしや expert, deluxe 等のオプションで動かすために mkjvf を Unicode 対応にして、vf を追加作成した(uptex-0.24,0.25)。 updvi2tty dvi2tty の NTT JTeX/pTeX 対応版を upTeX 対応にした。 オプション -J を変更し、 -U, -E を新設した。 ◇ 今後の課題、要検討事項など < 内部実装関連 > [1] kcatcode関連のテスト。 \char`<文字>, \chardef, \kchar`<文字>, \kchardef, 和文機能をごっそり on/off するプリミティヴ: \enablecjktoken, \disablecjktoken, \forcecjktoken など。 総合的によくテストすべし。 現在、デバッグ用のコードも残してあるが将来整理すべし。 [2] Omegaとの融合の可能性は? e-TeX, pdfTeX 拡張機能の追加は? 北川さん作 e-TeX拡張の追加を自動インストール出来るようにしてみた。 テスト中。 [3] 中国語、韓国語の組版の品質のためには何が必要? 現在の機能でも充分? hangulの動作は? < 周辺実装関連 > [4] ptexenc で合成文字を処理できるようにする。 ptexenc 全体の信頼性のテスト。 < dviware, 外部ソフト関連 > [5] dvips のさらなるテスト。メモリーの浪費を対策したが、どうか。 [6] upjmpost で多書体が使えるようにする。ベースのmpostを新版にする。 [7] dviout でのさらなるテスト。 http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/51610.html の問題点の御報告がある。dviout の修正法は? [8] upjbibtex のさらなるテスト。jalpha.bst 使用時に 一部のエントリーでeuc動作と同等にならない問題点の解決。 < フォント、マクロ関連 > [9] ujis.tfm は、jis.tfm をUnicodeに移植したもの。 min10.tfm, jis.tfm のしがらみを絶って、 縦横比を1:1にした upjisr-h.tfmなどをデフォルトとしたが、 いろいろなケースで大丈夫なのか心配。 さらなるテストをすべし。 [10] dviwareの開発負荷軽減のため、デフォルトのフォントを set2(BMP)の範囲に留めるようにしたが、 何はともあれset2の範囲内でdviwareの改造を上流に依頼していきたい。 set3の普及活動はさらにその先。 [11] upjis?-?.tfm の約物、半角カナの検討をもっとする。 makejvf等への実装を完全にする。 まずはJIS X 0213追加分、次にJISになくてUnicodeにある約物の整備。 [12] JIS→Unicode→CID の変換をumin10.vf, ujis.vf, upjis?-?.vfなど に対してうまくいく形にする。 JIS X 0208集合の横組はよくなったが、縦組の約物はまだ上手くいかない。 vf と標準の CMap だけでは限界があり、 CMapの整備が必要。 [13] ukinsoku.tex のテスト。さらなる充実。 [14] pdf作成時、和文を含むしおりを検討。 [15] utf/otf パッケージの Unicode 動作のさらなるテスト。 < その他 > [16] ドキュメントの充実。 [17] 英語ドキュメントを書く。 ◇ 変更履歴 2009.08.23 Ver0.28 ptetex3-20090610 ベース uptex-base.ch, 0uptex.ch, ptex-src-3.1.10-forum327.patch: upTeXのヴァージョン番号の変更。 ptexlive から patch を拝借して、下記の修正を入れた。 http://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=327 下記のkcatcode関連バグ修正。 (Doraさん、北川さん、ありがとうございました) http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/53557.html http://oku.edu.mie-u.ac.jp/~okumura/texfaq/qa/53556.html euptexdir/ptexextra.c: e-pTeX/e-upTeX (090309) の自動インストール時に FAM256 パッチを無効とした場合に eupTeX が上手く動かなかったバグ修正。 (栗山さん、北川さんに御意見をいただき、 ありがとうございました) 0uptex.ch, 5macro_uptex.sh: 最新の jsclasses が ptetex3 に入ったので インストール法を元に戻した。 0uptex.ch: 小さいバグ修正。 convbkmk.rb: 新規に作成したrubyスクリプトを同梱。 upLaTeX, dvips と hyperrefとの組合せでしおり(bookmark)を 正常につくれるようになった。 松本隆太郎氏の convert-euc.txt (Ref. http://www.rmatsumoto.org/tex-ps-pdf/hyperref.ja.html) とほぼ同様の機能であるが、 pTeX/upTeX 両対応となっている点と ruby なのが新規。 引数に dvips の出力 foo.ps を指定すると foo-convbkmk.ps へ出力する。 dvips の出力を標準入力に与えると標準出力へ出力する。 この ruby スクリプトはMITライセンスとする。 otfstable-uptex-0.04: 小さいバグ修正。 (角藤さん、ZRさんに御意見をいただき、 ありがとうございました) ptexenc: 上流の更新に対応するための修正。 samples: 更新。 2009.03.12 Ver0.27 ptetex3-20080616 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 Makefile.in, 0uptex.chなど: e-pTeX/e-upTeX (090309) の自動インストール。 さらに、FAM256 パッチを利用可能にした。 eptex-090309.tar.bz2 の配布のうち etex.diff, uptex.diff, eptex.src, euptex.src, eptexdefs.lib, fp.ch, fam256.ch を利用。 その他は、拙作パッチに含まれるようにしたが、些細な点を除いて 北川さんオリジナルとほぼ同等のものが出来上がるはず。 my_option で ENABLE_EPTEX_FAM256=1 を指定すると FAM256 パッチが有効になる。 jsclasses-090222.zip, 0uptex.ch, 5macro_uptex.sh: jsclasses を更新。 配布元の奥村さんのところで upTeX パッチを適用して頂いた。 0uptex.ch: CTAN の cbfonts.zip のディレクトリ構成が変更されていたのに対応。 cbfonts.zip, cm-super.zip, unicode.zip のインストール先を texmf-dist に変更。 6babel_uptex.sh: eplatex, euplatex + babel でのfmtの再生成が出来ていなかったのを修正。 samples: 更新。 2009.02.21 Ver0.26 ptetex3-20080616 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 Makefile.inなど: eTeX, pdfeTeX などと同様に ヴァージョン番号を ptexextra.h などに自動で採り入れるようにした。 0uptex.chなど: e-pTeX/e-upTeX (090220) の自動インストール。 (北川さん、e-pTeX/e-upTeX の開発有難うございました。) eptex-090220.tar.bz2 の配布のうち etex.diff, uptex.diff, eptex.src, euptex.src, eptexdefs.lib, fp.ch を利用。 その他は、拙作パッチに含まれるようにしたが、些細な点を除いて 北川さんオリジナルとほぼ同等のものが出来上がるはず。 FAM256 は無効のままとなっている。 jsclasses-090123-uptex0.26.zip, 0uptex.ch, 5macro_uptex.sh: jsclasses を更新。upTeX パッチ適用済を同梱した。 samples: 更新。 2008.12.13 Ver0.25 ptetex3-20080616 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 otf, otfstable-uptex-0.03: 本文用vfに、JIS X 0208に含まれずかつJIS X 0213に含まれかつ Unicodeで合成不要の文字を追加した。 プロポーショナル仮名は未検討。 fontmap更新。 samples: 更新。 2008.10.18 Ver0.24 ptetex3-20080616 ベース uptex: フルパス指定などで起動できない問題点を修正した。 uptex, upjbibtex, uppltotf, uptftopl: BUG_ADDRESS を表示しないようにした。 updvi2tty: 環境によってコンパイルに失敗する問題点を修正した。 otf, otfstable-uptex-0.02: 本文用vfを追加した。JIS X 0208に含まれない仮名は未検討。 プロポーショナル仮名は未検討。 5macro_uptex.sh, 6babel_uptex.sh, 0uptex.sh: root_checkが効いていなかったのを修正した。 otfパッケージの本文用vfインストールを追加。 samples: 更新。 2008.09.04 Ver0.23 ptetex3-20080616 ベース updvi2tty: dvi2tty 日本語版を upTeX 対応にしたものを追加。 ptexenc ライブラリーを使用。 pTeX や NTT JTeX の場合でも UTF-8 出力が可能になっている。 NTT JTeX の場合の改行に関するバグも修正している。 0uptex.sh: updvi2tty の自動インストールを追加。 xdvi: 半角片仮名のとき、"Warning: 'font' (code=0xXXXX) is not square." の警告を出さないようにした。 ptexenc: PTEXENC_VERSION に 0.997-u00 と upTeX パッチの枝番を付けた。 samples: 更新。 2008.08.03 Ver0.22 ptetex3-20080616 ベース makejvf: font ID を0番から開始するオプション -i を追加。 dvioutとの組合せで発現する問題を回避するため。 uptex_font: 上記 makejvf の修正を適用。 umin5, umin6, ..., umin9 などを Makefile から削除。 0uptex.sh: 「xdviインストールなし」の場合でも動作するように修正。 pdvitype: -kanjiオプションが無効になっていたバグ (オリジナルのptetex3では発現せず、uptexパッチによるバグ)を修正。 xdvi: 半角片仮名が再度おかしくなっていたバグを修正。 あまり自信はないが、動いているように見える。 samples: 更新。 2008.03.13 Ver0.21 ptetex3-20080311 ベース uptex-base.ch: \uppercase, \lowercase が異常になるバグを修正。 updvitype, uppltotf, uptftopl, upjbibtex, upjmpost: default のエンコーディングを --kanji=utf8 --kanji-internal=uptex 相当にした。 xdvi, dvips, dvipdfmx: set3 対応のために消費していたメモリー領域を動的確保に変更。 従来ptetex3 版比 17 倍だったが、 SIP 使用時に3倍程度、 pTeX/pLaTeX 使用時には ptetex3 版とほぼ同等になった。 dvips: CMap の UTF32 と UTF8 に対応。 UniJISX0213-UTF32 など UTF16 のものが公開されていないものに対し 有用と思われる。 0uptex.shなど: make babelの後、uplatex.fmtを自動生成できていなかった点を修正。 make babel相当を自動で行うことにした。 不要なら0uptex.shからコメントアウトする。 samples: 更新。 2008.01.12 Ver0.20 ptetex3-20080107 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 updvitype, uppltotf, uptftopl, upjbibtex, upjmpost, updvitomp, upovp2ovf: 以前は pdvitype, pltotf, tftopl, jbibtex, jmpost, pdvitomp, ovp2ovf は ptetex3 のものを上書きしていたが、コマンド名を新設し上書きをやめた。 W32TeX では既にそのようにして頂いている。 ptexenc, makejvf, xdvi, dvips, dvipdfmx, jsclasses は、 まだ上書きしている。 upjbibtex: デフォルトの内部コードを uptex とした。 upmakempx: 新設。 samples: 更新。 2007.12.26 Ver0.19 ptetex3-20071214 ベース uptex-base.ch: プリミティヴ \forcecjktoken を追加。 フォント: upjisr-h, upjisg-h 等を修正。 半角仮名関係のグルーを追加。 ukinsoku.tex: 半角仮名関係を追加。 otf: 本文用vf利用の準備。実際の本文用vfは、別途検討する。 samples: 更新。 2007.12.08 Ver0.18 ptetex3-20071207 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 フォント: upjisr-h, upjisg-h 等を修正。 横組時に半角片仮名 (U+FF61〜U+FF9F) に対応させた。 xdviで "uprml-h is not a square metric." などの警告が出てしまうが、 一応動いているようだ。 makejvf: オプション -H を新設し、横組時に半角片仮名 (U+FF61〜U+FF9F) に仮対応した。 psフォント用のtfm出力において半角片仮名の部分は makejvfでの対応が出来ていない。 jmpost: 半角片仮名 (U+FF61〜U+FF9F) に対応した。 samples: 更新。 2007.11.17 Ver0.17 ptetex3-20071030 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 フォント: upjisr-h, upjisg-h 等を修正。公称10ptをDESIGN SIZE 10ptに、 縦横比を1:1に、CHARHT:CHARDPの比を88:12に変更した。 ujarticle.cls などで10pt指定に対し公称10pt, DESIGN SIZE 10ptを 9.62216ptに縮小した(OTFパッケージ同様)。 jarticle.cls と和文,欧文の横の大きさと比は一部の約物を除き一致する。 plain upTeX の uptex.tex では、10pt指定をDESIGN SIZE 10ptにした。 このため plain pTeX と和文の大きさが異なることになる。 jsclasses: uplatexオプション時にデフォルトで upjisr-h.tfm を 0.962216*0.961=0.924690 倍して使うようした。 ujis.tfm を使うには uplatex,jis オプションを指定する。 umin10.tfm を使うには uplatex,mingoth オプションを指定する。 ptexenc.c: 微修正。 無事 Windows のコマンドプロンプトでUnicodeの表示が出来ているようだ (Thanks to 角藤さん)。 samples: 更新。 (奥村さん、uchiyamaさん、本田さん、ZRさんに御意見をいただき、 ありがとうございました) 2007.11.10 Ver0.16 ptetex3-20071030 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 ptexenc.c: Windows のコマンドプロンプト用に WriteConsoleW()を使ったコードを書いてみた。 Windows9x 系では動かないはずだが --sjis-terminal で 利用することを想定。 動作確認していないがはたして上手くいくかどうか? makejvf: -U, -u jisq オプションを追加してみた。 縦組対応にはこれでも不充分で、専用の CMap を作るしかないようだ。 フォント: upjisr-h, upjisg-h 等を作成。公称10ptを9.62216pt(min10同様)に、 縦横比を1:1に、CHARHT:CHARDPの比を88:12にしてみた。 default のフォントを ujis,ujisg → upjisr-h, upjisg-h 等に変更。 中韓のフォントを upjisr-h 系に変更。 中韓のフォントにSans Serif用を追加。 samples: 追加、更新。 2007.10.18 Ver0.15 ptetex3-20071017 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 uplcore.ltx: "2006/11/10" ベースに更新。 u{,t}{article,report,book}.clsなど: "2006/06/27 v1.6" ベースに更新。 otfパッケージ: \UTFK{}, \CIDK{} などを動くようにした。 font/map/for_dviout.map: dviout 用のmap記入例を追加。 これで dviout の簡単なテストを行った。 samples: 追加、更新。 samples/testrun.bat: MS-DOS 用のバッチファイルを追加。 2007.09.25 Ver0.14 ptetex3-20070822 ベース uptex-base.ch: ヴァージョン番号の変更のみ。 ptexenc.c: 環境によってコンパイル出来ない問題を修正。 0uptex.sh: EUC-JP → UTF-8に。英語のコメントを追加。 00readme_en.txt: 追加。 2007.09.15 Ver0.13 ptetex3-20070822 ベース ptexenc: "-kanji=uptex" のとき "-kanji-internal=*" を無視し、 強制的に "-kanji-internal=uptex" をセットし、 内部コードを uptex に固定するようにした。 makejvf, 付属フォント: 「‘」「’」「“」「”」に関し ujis.vf などでの対応先を urml.tfm→rml.tfm 等 jis 系に変更。 フォント: default のフォントを umin10,ugoth10 → ujis,ujisg 等に変更。 default のフォントからset3を取り除いた。 {uj,ut}{book,report}.cls: 追加。 jmpost: -kanji オプションが子プロセスに伝搬するようにした (Thanks to 角藤さん)。 samples: 更新。 (ZRさん、土村さんに御意見をいただき、ありがとうございました) 2007.08.25 Ver0.12 ptetex3-20070822 ベース uptex: kcatcodeが18でUTF-8の3〜4バイトの場合に処理がときどき 異常になるバグを修正。 ハングルの直後の改行を空白扱いするように変更。 (Ref. http://project.ktug.or.kr/omega-cjk/tug2004-preprint.pdf) ptexenc: is_internalUPTEXの場合に JIS→Unicode の変換を 実装依存ではなく、一種類に固定するようにした。 ukinsoku.tex: \inhibitglue の U+FF5E の追加など。 jbibtex: デフォルトの内部コードをuptexからeucに戻した。 デフォルトではupTeXパッチのない状態に等しくなっているはず。 samples: 追加、更新。 (ZRさん、栗山さん、土村さんに御意見をいただき、ありがとうございました) 2007.08.07 Ver0.11 ptetex3-20070806 ベース jcharwidowpenalty がらみの動作が動かなくなっていたのを修正。 pdvitype: 出力を、端末の文字コードではなく -kanji 指定を優先するように変更。 ukinsoku.tex: 8 bit 欧文に関し \xspcode を追加。 makejvf: cjk に用いないコード値を vf に入れないようにした。 uptex_font: vf の軽量化。 sample を更新。 (ZRさん、安田さんに御意見をいただき、ありがとうございました) 2007.07.28 Ver0.10 ptetex3-20070606 ベース \char`<文字>, \chardef では文字コードが255以下の場合には欧文動作、 265以上の場合には和文動作となるように変更した。 さらに、文字コードが255以下の場合に和文動作をするためのプリミティヴ \kchar`<文字>, \kchardef を追加した。 jbibtex へのパッチのバグ修正。さらに、-kanji-internal=uptex, -kanji-internal=euc が動くようにした。 -kanji-internal=euc ならば従来のjbibtexと同等の動作になる(はず)。 ovp2ovf へのパッチの微修正。 cbfonts, cm-super などのインストール先の修正。 sample を更新。 (多数の点でZRさんに御意見をいただき、ありがとうございました) 2007.06.16 Ver0.09 ptetex3-20070606 ベース \string cjkトークン のバグ (ZRさんに御報告いただき、ありがとうございました) に関し 全く不可解なトークンは発生しないようにした(つもり)。 kcatcode表のデフォルト値を見直した (ZRさんに御提案いただき、 ありがとうございました) 。 unicode.zip, cbfonts.zip があれば自動インストールするようにした。 jsclasses へのパッチの微修正。 ovp2ovf へのパッチの微修正。 sample を更新。 2007.05.28 Ver0.08 ptetex3-20070522 ベース \char<数値>, \chardef で文字コードが 255 以下の場合に kcatcode, enablecjktoken の条件が整えば cjkトークンにするようにした。 utf/otf パッケージへの簡易的対応。まだ一部しか動かない。 また、実装方法も今後変更する可能性がある。 cm-super.zip があれば自動インストールするようにした。 uptex_font-0.08.tar.gz : vfフォントに 0x7F 以下を追加した。 これらは\char, \chardef による指定で利用可能になったはず。 sample を更新。 2007.05.13 Ver0.07 ptetex3-20070426 ベース CJKの内部コードを kcatcode + 文字コード に変更。 内部レジスターにおいて U+0080〜U+0FFF がそのままのコード値で 使えなかった問題点をほぼ解消したつもり。 まだ \char<数値> などの 255以下で問題がある。 大工事なので、安定性は低下しているおそれあり。 jbibtex の Unicode 対応実験(土村さんによる)を更新。 dvipdfmx で hyperrefとの組合せで bookmark を正常につくれるようにした。 calc_pos の簡略化。 kcatcodekey の簡略化(土村さんによる)。 makejvf の微修正。 sample を更新。 2007.04.15 Ver0.06 ptetex3-20070412 ベース jbibtex の Unicode 対応実験(土村さんによる)を更新。 プリミティヴ \enablecjktoken, \disablecjktoken を追加。 ukinsoku.tex を UTF-8 にし、JIS X 0212, JIS X 0213 関連を追加。 uptex-base.ch で cs_token_flag を変更。 sample を追加、更新。 uptex_font-0.06.tar.gz : 新版の CMap Uni{JIS,GB,UCS,KS}-UTF16-{H,V} を追加。 2007.04.08 Ver0.05 ptetex3-20070405 ベース ptexenc との摺り合わせ(土村さんに作業していただき、有難うございました)。 jbibtex の Unicode 対応実験(土村さんによる)を同梱。 JIS X 0213 関連ソースの動かなくなっていた部分を削除。 EUC/SJIS 動作で kcat_code の内部領域を変更。 uptex で kcode_pos, trick_buf2 の多バイト対応したつもり。テストは不十分。 jsclasses を uplatex に簡易対応させた。 dvips のオプション -UCS, -SJIS を廃止し、自動判定するようにした。 uptex-utf8.fmt, uplatex-utf8.fmt を uptex.fmt, uplatex.fmt に変更。 tftopl, pltotf のコード範囲のチェックを checkkanji 任せに変更。 ドキュメントに「upTeX開発のねらい」を追加。 sample を追加。 2007.03.25 Ver0.04 ptetex3-20070323 ベース 新しい ptexenc の関数に対応(土村さんに作業していただき、有難うございました)。 sample を修正。 2007.03.18 Ver0.03 ptetex3-20070316 ベース 自動インストールスクリプトを追加した(Thanks to 土村さん)。 ディレクトリ構成、インストール上の問題点を修正(Thanks to 土村さん)。 メモリーを浪費していた点を修正(土村さんにご指摘いただきました)。 新しい ptexenc の関数に一部を変更。 jmpost が set3 を含めて動くようになった。 sample を追加。 フォントのバイナリーパッケージでシンボリックリンクを使用するようにした。 2007.03.07 Ver0.02 ptetex3-20070304 ベース sample を微修正。 フォントのバイナリーパッケージを分離。 2007.02.27 Ver0.01 ptetex3-20070223 ベース kanji_enc を入出力コード(-kanji=xxx)と内部コード(-kanji-internal=xxx) に分離(Thanks to 土村さん)。 ptex と uptex のソース、バイナリーを分離。共存できるようにした。 sample を追加。 jis.tfm 系のフォントを追加。同系統のCJKのフォントを追加。 CJKの動作確認。sample を追加。 とりあえずkcatcodeに hangul(19)を追加。現状は漢字(16)と同じ動作。 dvidpfmx で set3 が使えるようになった。 pltotf がまともに使えるようになった。 2007.01.27 Ver0.00 ptetex3-20070101 ベース