
		<< xdvik20c+hal2+dvisel patch について >>

				1999/03/04
				渡辺 毅
				watanabe@komadori.planet.sci.kobe-u.ac.jp

○xdvik20c+hal2+dvisel patch とは

  xdvik20c-j1.0p0e に対するバグフィックス/機能追加パッチです。


○追加/変更点

 1) はやし@姫路工業大学さんの xdvi-17jp+toc+hal2 patch の一部をマージ

  xdvi-17jp+toc+hal2 patch については READMEs/README.jp+toc+hal2 を
御覧下さい。このパッチは基本的には xdvi-17jp に xdvi-21 から取ってきた
変更点を加えるというもののため、ベースが xdvik-20c に移った今、その
ほとんどが適応済みになっています。ここでは、まだ適応されてない以下の
点をマージしました。

   1.1) 固定倍率に移行する shrink ボタンをやめて、自在に拡大縮小ができる
     ズームボタンを付けた。

     jp+toc+hal2 patch ではソースをそのまま書き換えてましたが、選択可能な
   ように #ifdef ZOOM_BUTTON に入れました。#undef にしておくと、オリジナル
   のままです。Makefile.in には -DZOOM_BUTTON を入れておきましたので、必要
   ない場合は消してから make して下さい。キーバインドは 'Z' (拡大ズーム)、
   'z'(縮小ズーム) に割り当ててあります。

   1.2) TOC 部のページ数表記で、ページ番号がバラバラな DVI ファイルだと
     出力桁数がおかしくなる問題を解決。

     巻末 Appendix だけページ番号が別に振ってある場合とかだと、こういう
   問題が起こりそうですね。詳しくは README.jp+toc+hal2 を御覧下さい。


 2) PRINTDVI の改良(?)版 DVISEL (拙作未発表)

  Print ボタンを押すと、xdvi 上からプリントアウトできるという機能は非常
に便利な機能で、作者様には感謝感謝です。うちの研究室回りにも TeX のプリ
ントアウト方法は、xdvi 上から行なうやりかたしか知らない者がごろごろい
ます(苦笑)。まあ、それは別にいいんですが、この PRINTDVI 機能はちょっと
うっとうしい点が少しあります(^^)。

  * 制御コマンドが % だらけでややこしい。:-)
     …PRINTDVI は初期バージョンから、% シーケンスがまた増えてます。この
   まま、新機能が追加されるたびに、%w %v …と増やしていくとすれば、頭の
   痛い話です。:-)

  * dviselect が縦書きに対応していない
     …これは PRINTDVI の問題ではなく、しかも対応させようと思えば、たぶん
   十行ほどの追加で済むと思うので、既に誰かが対応させてるかも知れません
   が…。

  * 制御コマンドがバイナリ埋め込みなので柔軟性に欠ける
     …これは特に FreeBSD や Linux などのパッケージを使う時に感じます。
   もちろん、PRINTDVI 初期バージョンとは違って今はリソースでも変更は効き
   ますが、バイナリパッケージを作る側から見ても、ユーザーが dvips, dvi2ps,
   jdvi2kps のどれを使うかを一方的に決めて作らなければならないというのは
   結構嫌ですよね?(^^;;)

また、xdvi の特徴として次の点があります。

  * xdvi は TeX の各ページが DVI ファイルの何バイト目から始まるのかを
  配列として持ってるので、その配列を参照するだけで指定ページの DVI だけを
  切り出すのはたやすくできる。

という訳で、解決方法…。dviselect 機能は xdvi で内包させる!!


  そもそも、% シーケンスがなぜこんなに多いのかといえば、dviselect に
引数を渡すためです。dviselect を xdvi 内部で持てば、外部コマンドに引き
渡すべき情報はほとんど無くなるので、% シーケンスはほとんど必要ありません。

  次に、現在、print-out メニューで全ページ、カレントページ、最終マーク
ページ、リージョン、マークリストのどれかを選べるので、そのそれぞれに印刷
コマンドを設定していますが、dviselect 機能を xdvi で持てば、外部コマンド
は選択された DVI を印刷するという一つだけで済む事になります。

  ならば、無理して、dvips, dvi2ps, jdvi2kps のどれを使うかをバイナリ埋め
込みなどにせずに、外部コマンドは一つのスクリプトを指定し、そのスクリプト
内で、上記のどれかのコマンドを呼び出すようにすれば、かなりすっきりします。
つまり、xdvi のバイナリには外部コマンド(スクリプト)一つを埋め込むだけで
済み、そのマシンの環境がどういうものかは全て印刷スクリプト側で吸収できる
のです。バイナリパッケージを使う場合でもスクリプトなら柔軟性に富んでます。

  ここで、外部コマンド(スクリプト)にファイルで渡すとすれば、テンポラリー
ファイル名などがまたややこしい問題になるので、UNIX らしくパイプで渡す事に
しましょう。DVI がファイルである事を強要するプリンタドライバーを使う場合は、
スクリプト側でテンポラリーファイルを作るとすれば、これで、テンポラリー
ファイル名を xdvi 内部に埋め込む必要性も無くなりました。つまり、外部コマ
ンドに渡すべき項目は、プリンタ名、紙のサイズの二つだけです。

  という訳で、DVISEL を define すると、上記 dviselect 機能を内包し、外部
スクリプト(デフォルトは /usr/local/bin/xdviprint。-xdviprint オプションや
.xdviPrint リソースでも変更可)に切り出した DVI ファイルをパイプで渡すよう
になります。プリンタ名と紙のサイズは引数で渡します。
  スクリプト側は DVI ファイルを標準入力から読みとり印刷するスクリプトに
します。dvips を使ったサンプルがインストールされますので、そのままでも
使えるとは思いますが、好きに編集して下さい。:-)
  DVISEL を define すると、% シーケンスのコマンド指定等はできなくなります。

  なお、PRINTDVI では、landscape 等のオプションの違いを xdvipaper.dvips
等の変換ファイルを使って、xdvi 内部で変換していました。これも、どのプリ
ンタドライバーを使うかを xdvi 内部に埋め込まないという方針から、xdvi
内部ではこの変換処理をしません。この処理はスクリプト側でするようにします。
インストールされるサンプル・スクリプトではこの処理をしてますので、従来の
PRINTDVI を使ってた時と同じ機能が実現できてるとは思いますが、スクリプトの
この部分も好きに書き換えて使って下さい。:-)

  補足ですが、DVISEL 機能は PRINTDVI ルーチンを全部置き換えたものではなく、
そのほとんどは PRINTDVI のルーチンを使って実現しています。dviselect のソース
は使わず一から書き足しました。

  また、DVISEL 機能が出力する切り出した DVI と、dviselect コマンドが出力する
DVI は同じではありません。違いは、dviselect ではフォント番号のリナンバー
を行なってるのに、この DVISEL 機能はそれを行なってない点です。
  DVI ファイルではフォント番号 0〜63番までは 1バイトでフォントチェンジが
できるが、64番以上だとフォントチェンジに 2バイトかかるという仕様になって
ます。従って、オリジナルの DVI ファイルではフォントを 65種類以上使って
るが、指定印刷ページでは合計 64種類以下のフォントしか使われてない場合、
dviselect では出力 DVI で使われてない欠番のフォント番号を埋めて全て
1バイトのフォントチェンジにしてしまう事ができますが、この DVISEL 機能は
オリジナルの DVI ファイルのフォント番号をそのまま使います。従って、
dviselect の出力する DVI よりサイズが大きくなる可能性があります。

  もっとも、私は 65種類以上ものフォントを使った TeX なんて見た事ないし、
どうせ印刷する時に一時的に使ってすぐ消す DVI の出力で数バイトを節約して
もしょうがないので、フォント番号のリナンバーは行なわない事にしました。:-)
DVI ファイル中で使われてるフォント番号が飛び飛びなのは問題ありません。
TeX 自体そういう DVI を吐きます。:-)


 3) その他 (拙作未発表)

   3.1) SMALL_PANEL の数値の見直し

     画面の小さいノートパソコン等で使う時には SMALL_PANEL 機能は便利です
   が、小さくするあまりボタンとスクロールバーが重なったりしてて格好悪い
   です。一般に SMALL_PANEL を使いたい人は画面の縦方向に余裕がないけど、
   横方向にはまだ余裕があると思われます。また、縦方向に小さ過ぎる場合は
   ウィンドーをリサイズすれば済みますが、横方向はリサイズしてもパネル部分
   の大きさは変わらないので、横方向に小さ過ぎて見にくいのは直しにくいです。
   という訳で、全体のバランスを見直してみました。

   3.2) 「XDvi*international: True」なんて、設定をすると、TOC でマウス
     真中ボタンを押した時に押した位置と違う位置がマークされてしまう。
     また、SELFILE 時に文字化けしたり、表示がずれたりする。

     こんな設定にしてる人はいないかも知れませんが(^^;;)、Athena Widget
   で i18n にする時には XFontStruct を使ってる部分は全部書き換えなきゃ
   …というやつです。:-)
     一応、X11R4 以前を使ってる人を考えて(いるのか? ^^;;)、#ifdef 付きで
   変更しておきました。:-)  テストはしてません。X11R4 なんて無い(笑)。

   3.3) マニュアルのオプション説明部分に付いて

     xdvi の man のオプション部分の説明はオプションのアルファベット順に
   記述されてると思われるが、PRINTDVI で追加されたオプションは後ろに
   追加されてて、アルファベット順になってないので、ソートし直した。:-)


○覚書 (敢えて TODO とは書かない(笑))

  * かつて色々あった xdvi-17 用パッチのうち、xdvik-20c 用パッチでまだ取り
 込まれてない機能としては、xdvi-17jp.960209 にあった、
    5.  DVI ファイル中の文字列の検索機能。
    6.  -remote オプションの追加。
 が挙げられます。


○最後に

  著作権はそれぞれのパッチの作者にあります。詳しくは READMEs/ ディレク
トリ以下のファイル群などを見て下さい。

/* Takeshi WATANABE <watanabe@komadori.planet.sci.kobe-u.ac.jp> */
