next up previous
Next: その他 Up: 花子でTPIC! (TPICの拡大縮小をLaTeXで行う) -DRH2TEX.EXE Version Previous: LaTeXで拡大/縮小

技術的な事

manfntgif

この章では, 拡大縮小を行っているマクロについて説明します。 この章は特に読まなくても差し支えありません。偉そうに``急カーブマーク''を 5個も書いていますが, そんなに難しい事を書いているわけではありませんので, 気楽に読んで下さいgif

さて, それでは本題に入りましょう。tpic special命令は単位が0.001インチに固定 されています。その為, LaTeXの\unitlength の値に影響を受けません。 この問題を回避する為に今回の改造では\unitlength の値に応じて tpic specialへ渡す値を変えられるようにしました。従来又は-mオプション無しでは

\special{pa 92 375}%

というコードを作成していましたが, -mオプションを指定した場合は

\DRHcomp{\DRHi}{92}%
\DRHcomp{\DRHii}{375}%
\special{pa \the\DRHi\space\the\DRHii}%

というコードを作成するように修正しました。\DRHcomp というマクロで \unitlength に応じた比率を計算しているわけです。具体的な書式は

\DRHcomp {register}{value}

で, value\unitlength に応じて計算し, registerに格納 するわけです。

さて, 話しはいきなり変わりますが, TeXでの拡大縮小に関する計算では千分 率を使用する事が多いように感じます。TeXの除算(\divide )では整数の 商しか得られない([1, P.166,])gif からだと思います。千分率を簡単に説明すると, 予め1000を1倍とする値で積をとっておいてから1000で割るといった手法です。 例えば, 3000の80%を求める場合は2400 で求める事が出来ます。今回の改造でも千分率 を使用する事にしました。先ず, tpicの最小単位である0.001インチを1000に見せかけ なければなりません。普通に考えると1000を掛けてgif更に1000を掛ければ0.001インチを 1000にする事が出来るように感じるのですがTeXの内部では全て長さは pt(ポイント)で 表現されているので, この方法ではうまくいきません。1インチは72.27ポイント [1, P.85,]なので, 0.001インチは0.07227ポイントの筈なのですが, 以下のような記述をして調べて見たところ

\unitlength0.001in
\typeout{\the\unitlength}

0.001インチは0.07277ポイントという結果が得られました。この値で1000を割った商 を0.001インチ(実際は0.07277ポイント)に掛ければ1000という値が得られる筈です。 ansという値が得られました。実際に以下の記述で 試して見ましたが,

\unitlength 0.001in
\unitlength 13741.92662\unitlength
\typeout{\the\unitlength}

999.98853という値が得られました。そこで試行錯誤(原始的な方法(^^;) を繰り返した結果13742.0845という値を掛けると1000という値が得られる事がわ かりました。

結局, \ DRHcomp{register}{value}というマクロは 以下のように作成しました。

{\catcode`\p=12\catcode`\t=12%
    \gdef\INT#1.#2pt{#1}}
\def\DRHcomp#1#2{%
    \DRHwkd=13742.0845\unitlength%
    \def\DRHint{%
        \expandafter\INT\the\DRHwkd}%
    #1=#2\multiply#1 by \DRHint%
    \divide#1 by 1000}

先ず\unitlength と13742.0845の積を\DRHwkd (予め \newdimen で作成しておきます)へ待避しておきます。そして \DRHwkd を整数化します(小数点以下を切り捨てます)。最後に整数 化した値にvalueを掛け, 更に1000で割ります。このようにして得られ た値をregisterに格納するわけです。

このマクロで得られた値をtpic special命令の引数として使用しているわけです。

さて, この方法で完全な比率が得られるかというと, 小数点以下を切り捨てている 為, 完全な比率は得られませんが, 大きな誤差が出るわけでもないので, 今回は この方法で行う事にしました。

参考の為, 表:gifvalueが1000の時の\unitlenght の 値に応じたregisterの値を示します。

表: \DRHcomp マクロの実行例

 table 

\DRHcomp の定義を変えればもっと正確な比率を求める事も可能になると 思いますので, この程度の精度では不満のある方はマクロを作り直して見て下さい。

と, 此処まで書いて松田さんに査閲を依頼したところ「カウンタに直接長さのレジス タを代入すると長さのスケールポイント値が得られるという技を使うと, \ DRHcompの定義を少し簡略化できますよ。」と御教示頂きました。

結局, 御教示頂いたマクロを参考にマクロを定義し直しました。

\newdimen\DRHwkd
\unitlength=0.001in
\DRHbase=\unitlength
\def\DRHcomp#1#2{%
    \DRHwkd=#2\unitlength%
    #1=\DRHwkd\divide#1 by \the\DRHbase}

精度の方は最初の\DRHcomp と変らないようです。表:gifのテストを新しい\DRHcomp についても実行してみましたが, 全く同じ結果が得られました。ただ新 しい方が, やや速度的に有利gifなのでこちらの方を使用する事に致しました。



Tadamegu Furukawa
Sat Mar 1 09:35:11 1997