Re: dviout の印刷で \rotatebox 内の和文括弧がずれる

名前: SHIMA
日時: 2003-08-20 17:41:22
IPアドレス: 157.82.19.*

>>21040 まず表題の訂正ですが,「dviout の印刷でずれる」のではなくて,「patch2方式での出力 でずれる」のであって,それ以外の出力,たとえば「replace(def)」ではずれないと思わ れます.また,「ずれる」と「ずれない」とはある程度相対的な問題です(以下に述べます). なお「auto mode(p2)」は,印刷の際は「patch2」方式,表示の際は「replace」方式としま す.これらの意味についての詳細は,付属の文書の「cmode.html」を参照してください. 「ずれる」原因ですが,これは現状のアスキーの日本語TeXにおける和文フォントの実際上の 取り扱いに内在する根本的な矛盾が絡んでいます.関連して和文文字の取り扱いに関して多 くの問題点も存在しますが,現状では根本的解決法は無いので,これらについて詳しく解説 してある書物は無いようです.詳しく書くと大変長くなってしまうので,今回関わっている 問題点についてなるべく簡潔に書きます. 今回の問題点は,(jfmファイルで定義されている)和文のフォントが,現実に使われるフォ ント(それの出力方法や,出力の際などに得られる情報)と食い違っていることが原因となっ ています.今回問題となっているWindowsのTrueType和文フォントは,等幅のフォントとして Windowsに定義しているものです. ・「jfm」では,括弧などの約物は,通常の文字の半分程度の幅(縦書きのときは高さ)になっ ていて,TeXではそれに基づいて組版されます. ・ また「jfm」では,文字の基準点は,横書きでは文字の左下,縦書きでは中央上部にありま す. WindowsのTrueTypeフォントでは,文字の基準点は,横書きでは文字の左下にあります. (縦書きでも,dvioutでは,文字を通常の向きで取得しているので,左下にあります). 同じ「左下」でも同じものを意味しているとは限らないので,調整が必要です. また,括弧などの約物では,(横書きでは)幅が全く異なるので,TeXでの出力の際にどのよ うに詰めるか? が問題になります.WindowsのTrueTypeフォントでは,等幅で組んだときの ことを考え,始まりの括弧では,左側に空きを多く,終わりの括弧では,右側に空きを多く 入れて等幅の文字サイズの矩形(文字のまわりの空きを含む)の中に入れていますが,これ も相対的なもので,フォントによってその程度が異なっています.dvioutでは,このことを 考慮して,文字種(フォント毎でない)で詰めを配慮(どちら側の詰めを重視するか,ある いは,平等か?)しています. 「文字サイズの矩形の中のどの位置に文字が入っているかを見て詰める」という方式も考え られますが,文字の左右の空きは文字毎にデザインされるべきものであって,一律に均等に とるのはそれを無視するので,よくない,ということでdvioutでは最初から採用していませ ん。その後開発された dvips では,最初はこの方式にしていたようですが,やはり dviout のような方式に改められて,現状に至っているようです. 「patch2」方式と,「replace」方式とは「出力方法や,出力の際などに得られる情報」と が全く異なっておりますので,違うフォントと考えるのが自然です(あるいは,別のdevice driver による出力と考える).たとえば,文字を回転して出力する場合(これは本来のTeX ではサポートされておらず,specialによるdevice dependentな命令としてのみサポートされ ています),「patch2」方式では,WindowsのSystemが文字の回転を行いますが,「replace」 では文字の回転をdviout自身が行います.よって,取得される文字のサイズ(辺がx軸,y軸 に平行な矩形)や基準点の位置は,前者では回転後,後者では回転前のものとなります.前 者では,回転の中心の位置がTeXとは異なります. 縦書きの「patch2」で回転・拡大などを行うと,このような矛盾点が集積されて,実用上問 題となっていると考えられます.dvioutにおいて,よりまともなように修正する,というこ とがあり得ますが,適当なフォントをモデルにした対処療法的対応ということになります. なお,dvipdfm や dvips,Ghostscript では,「文字の回転」は Windows の System でなく て自前で行っていているのではないかと思います.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)