この章では, 拡大縮小を行っているマクロについて説明します。 この章は特に読まなくても差し支えありません。偉そうに``急カーブマーク''を 5個も書いていますが, そんなに難しい事を書いているわけではありませんので, 気楽に読んで下さい。
さて, それでは本題に入りましょう。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,])
からだと思います。千分率を簡単に説明すると,
予め1000を1倍とする値で積をとっておいてから1000で割るといった手法です。
例えば, 3000の80%を求める場合は
0.001インチは0.07277ポイントという結果が得られました。この値で1000を割った商
を0.001インチ(実際は0.07277ポイント)に掛ければ1000という値が得られる筈です。
という値が得られました。実際に以下の記述で
試して見ましたが,
999.98853という値が得られました。そこで試行錯誤(原始的な方法
結局, \ DRHcomp{register}{value}というマクロは
以下のように作成しました。
先ず\unitlength と13742.0845の積を\DRHwkd (予め
\newdimen で作成しておきます)へ待避しておきます。そして
\DRHwkd を整数化します(小数点以下を切り捨てます)。最後に整数
化した値にvalueを掛け, 更に1000で割ります。このようにして得られ
た値をregisterに格納するわけです。
このマクロで得られた値をtpic special命令の引数として使用しているわけです。
さて, この方法で完全な比率が得られるかというと, 小数点以下を切り捨てている
為, 完全な比率は得られませんが, 大きな誤差が出るわけでもないので, 今回は
この方法で行う事にしました。
参考の為, 表:にvalueが1000の時の\unitlenght
の
値に応じたregisterの値を示します。
表: \DRHcomp マクロの実行例
\DRHcomp の定義を変えればもっと正確な比率を求める事も可能になると
思いますので, この程度の精度では不満のある方はマクロを作り直して見て下さい。
と, 此処まで書いて松田さんに査閲を依頼したところ「カウンタに直接長さのレジス
タを代入すると長さのスケールポイント値が得られるという技を使うと,
\ DRHcompの定義を少し簡略化できますよ。」と御教示頂きました。
結局, 御教示頂いたマクロを参考にマクロを定義し直しました。
精度の方は最初の\DRHcomp と変らないようです。表:のテストを新しい\DRHcomp
についても実行してみましたが, 全く同じ結果が得られました。ただ新
しい方が, やや速度的に有利なのでこちらの方を使用する事に致しました。
\unitlength0.001in
\typeout{\the\unitlength}
\unitlength 0.001in
\unitlength 13741.92662\unitlength
\typeout{\the\unitlength}
(^^;
)
を繰り返した結果13742.0845という値を掛けると1000という値が得られる事がわ
かりました。
{\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}
\newdimen\DRHwkd
\unitlength=0.001in
\DRHbase=\unitlength
\def\DRHcomp#1#2{%
\DRHwkd=#2\unitlength%
#1=\DRHwkd\divide#1 by \the\DRHbase}
Tadamegu Furukawa
Sat Mar 1 09:35:11 1997