rotatebox/scalebox (転載)

名前: 奥村晴彦
日時: 2002-02-23 10:02:05
IPアドレス: 61.206.197.*

fj.comp.texhaxから転載(一部略) ---------------------------------------------------------------------- From: nide@ics.nara-wu.ac.jp (NIDE Naoyuki) Subject: rotatebox/scalebox Newsgroups: fj.comp.texhax Date: 21 Feb 2002 14:23:32 GMT Organization: Nara Women's University 新出@奈良女子大学と申します。 下記のLaTeXソース \documentclass[a4j]{jarticle} \usepackage{graphicx} \begin{document} This is a pen. \def\a{\scalebox{1.23456}{.}} \a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a \a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a This is a pen. \end{document} をplatex→dvips→gsで処理すると、最初の「This is a pen.」と2番目のそれが ずれて見えてしまいます。 なぜかと調べてみると、graphicxパッケージ(graphicsでも同様)のscaleboxや resizeboxの実現に問題があるようです。上記のものに対し 1.23456 1.23456 scale …中略… 1 1.23456 div 1 1.23456 div scale のようなPostScriptコードを吐いていて(dvips.defにそう書いてあるようです。 手元のものはDebian GNU/Linux 2.2のパッケージtetex-base中のdvips.def 1999/02/16 v3.0i)、これでは実装によっては計算誤差を生じてscaleが完全には 元に戻りません。 なぜかrotateboxだけは gsave … 角度 neg rotate … grestore のようなコードを吐くので、この現象が生じません。scaleboxやresizeboxもそ ういう実装にしておけば問題なかったのに、と思うのですが、どうしてなんでしょ うね… というわけなので、上記の例でも \def\a{\resizebox{0}{\scalebox{1.23456}{.}}} のようにすれば問題が回避できるのでした。 nide@ics.nara-wu.ac.jp ---------------------------------------------------------------------- From: Hideyuki Suzuki <hideyuki@sat.t.u-tokyo.ac.jp> Subject: Re: rotatebox/scalebox Newsgroups: fj.comp.texhax Date: 22 Feb 2002 19:57:10 +0900 Organization: Dept. of Math. Eng., The Univ. of Tokyo, Japan 鈴木@東大情報理工です。 ……略…… これは前回のバグとは違う問題のようです。私も見た目ではズレが わからなかったのですが、最初のを表示し終わったあたりと2番目を 表示し始めるあたりに "matrix currentmatrix ==" という行を入れて みると、たしかに以下のように計算誤差が見られました。 hideyuki@villa[1|~] gs scale.ps GNU Ghostscript 6.51 (2001-03-28) Copyright (C) 2001 artofcode LLC, Benicia, CA. All rights reserved. This software comes with NO WARRANTY: see the file COPYING for details. [0.148456618 0.0 0.0 0.148456618 89.0 27.0] [0.148456618 0.0 0.0 0.148456618 88.9689941 26.9667969] >>showpage, press <return> to continue<< dvips.def を直そうと思うと、以下のような感じになってしまって、 これはこれで grestore するときの currentpoint の計算に誤差が 入りそうな気もします。でも CTM に誤差が入るよりは良さそうですね。 新出さんのところではこれで直りますでしょうか? \def\Gscale@start{\special{ps: gsave currentpoint currentpoint translate \Gscale@x\space \Gscale@y\space scale neg exch neg exch translate}} \def\Gscale@end{\special{ps: currentpoint matrix currentmatrix transform grestore matrix currentmatrix itransform moveto}} -- Hideyuki Suzuki / hideyuki@sat.t.u-tokyo.ac.jp Department of Mathematical Informatics, Graduate School of Information Science and Technology, The University of Tokyo, 7-3-1 Hongo, Bunkyo-ku, Tokyo 113-8656, Japan ----------------------------------------------------------------------

この書き込みへの返事:

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