
        << xdvi-17+markpage+toc+printdvi patch について >>

					1993/09/13
					小野 康一
					onono@fuka.info.waseda.ac.jp

○xdvi-17+markpage+toc+printdvi patch とは
  xdvi-17 + miyu-patch for xdvi PL17 に対するパッチです。このパッチをあ
  てて作った xdvi では、以下のような機能を使うことができます。

  1) Use_MARKPAGE
  ページマーキング機能を、GNU Emacs のマークリング風に実現したものです。
  ページのマーク(`m',`a')/アンマーク(`U',`A')、マークしたページへの移動
  (`'',``')、マークしたページとカレントページとの交換('"')、マークを伴う
  ページジャンプ('<','>')などを行なえます。
  また、2) の toc からのマーキングも可能です。

  2) Use_TOC
  ページ番号リストを表示し、マウスでそのページをクリックすることで、その
  ページへ移動(左ボタン)、そのページをマーク(真中ボタン)、アンマーク(右
  ボタン)することができます。ドラッグにより、連続するページをマーク/アン
  マークすることもできます。

  3) Use_PRINTDVI
  `o' または Print ボタンで Print-out メニューがポップアップします。ファ
  イル全体の出力やカレントページ、最後にマークしたページ、リージョン(カ
  レントページと最後にマークしたページとの間のページ)、マークした全部の
  ページをメニューから選択して出力できます。

○動作を確認した環境
	SunOS 4.1.3 / sun4c マシン(SPARCstationシリーズ)

○インストールについて

  まず, xdvi PL17 のソース・ファイルである xdvi-17.tar.gz と
  それに対するパッチ xdvi-17miyu.patch-beta4.gz (*1)、そして
  当該パッチ xdvi-17+markpage+toc+printdvi.patch を用意します。

  次に, 作業ディレクトリを作成して, そのディレクトリに移った後, 
  xdvi-17.tar.gz を展開します。そのまま, ディレクトリを移動しないで, 
  xdvi-17miyu.patch-beta4.gz を用いてパッチをあてます。
  このとき, GNU のツールである gzip および patch が必要となります (*2)。
  さらに xdvi-17+markpage+toc+printdvi.patch を用いてパッチをあてます。

  あとは, システムに応じて Imakefile を編集した後, 
  xmkmf を実行して Makefile を生成して, make を実行します。

  なお、miyu-patch for xdvi PL17 については、README.miyu-patch をよく読
  んでください。

  (*1) これらは, 
       ftp.tohoku.ac.jp[130.34.8.9]:~ftp/pub/tex/dviwares/xdvi/PL17 などの
       anonymous ftp などから入手できます。
  (*2) これらは, 
       ftp.waseda.ac.jp[133.9.1.32]:~ftp/pub/GNU/prep 以下、または、
       ftp.ecei.tohoku.ac.jp[130.34.222.67]:~ftp/pub/GNU/gzip および
       ftp.ecei.tohoku.ac.jp[130.34.222.67]:~ftp/pub/GNU/patch 以下にあります。

○Use_MARKPAGE および Use_TOC について
  つけられるマークの最大数を 1024、DVI ファイルの最大ページ数も同じく 
  1024 としてあります。これを越えることはまずないと思いますが、もし変更
  する場合は、Imakefile の RINGSIZE および MAX_PAGE を修正してください。

○Use_PRINTDVI について
  Imakefile の Use_PRINTDVI のところは、自己サイトの環境に合わせて変更し
  てください。%d などの意味については、print.h の最初の方のコメントに書
  いてあります。また、デフォルトでは dvi2ps や dviselect を用いるように
  書いてあります。このように、必要なページを切り出したり、プリンタ出力形
  式へ変換する作業は xdvi の内部で行なわず、外部コマンドで処理するような
  仕様にしました。したがって、これらのコマンドをあらかじめインストールし
  ておかないと、xdvi からの出力ができません。dvi2ps, dvips, jdvi2kps,
  dviselect など、自己サイトの環境に合ったコマンドをインストールし、それ
  に合わせて Imakefile を修正した上で xdvi を作ってください。
  また、デフォルトでは lpr に -v オプションを与えていません。PostScript 
  プリンタ用のフィルタによっては -v オプションをつける必要があるかも知れ
  ません。
  また、デフォルトでは dvi2ps の出力を lpr の標準入力にパイプで与えてい
  ます。lpr によっては、出力データが 1Mbyte を越えるとそれ以降を切り捨て
  て出力するような仕様になっているかも知れません。そのような場合は、
  dvi2ps の出力を一旦テンポラリファイル(/tmp/%F:%c@%r.ps など)にリダイレ
  クトし、それを lpr -s で出力し、終了後に rm するようにすればいいでしょ
  う。ただし、-s の場合、スプーリングせずに出力するため、出力が完了する
  までそのファイルを消せません。出力完了まで待って rm する、という手続き
  を簡単には書けないと思うので、デフォルトでは lpr の標準入力に与える方
  法を採りました。1Mbyte を越えるくらいたくさんのページを出力するような
  場合は、xdvi の中から出力せずにシェルのコマンドラインから
	% dvi2ps file.dvi > /tmp/file.ps
	% lpr -s /tmp/file.ps
	(出力完了後)
	% rm /tmp/file.ps
  とした方がいいような気がします:-)

○内部変数(%f など)の意味
  print.h の最初の方のコメントにも書いてありますが、簡単に説明しておきま
  す。Imakefile 中の PRCMD??? という変数は
	PRCMDLST="(cd %d; dviselect -i %F -o /tmp/%F:%t@%r.dvi %A; dvi2ps /tmp/%F:%t@%r.dvi) | lpr -P%p -J'%F (Page %t)'; /bin/rm /tmp/%F:%t@%r.dvi"
	/* all marked pages */
  のように、% 表記の内部変数が用いられています。これは、DVI ファイルの出
  力時に解釈されて実行されるコマンド文字列です。
    PRCMDALL  DVI ファイルの全部を出力(する時に用いられるコマンド文字列)
    PRCMDCUR  カレントページ(現在表示しているページ)を出力
    PRCMDMRK  最後にマークしたページを出力
    PRCMDRGN  リージョン(カレントページと最後にマークしたページで挟まれ
              ている区間)内のすべてのページを出力
    PRCMDLST  マークしたすべてのページを出力
  これらのコマンドは、Print-out メニューで選択する項目
	All pages
	Current page
	Marked page
	Region
	All marked pages
  にそれぞれ対応しています。
  コマンド文字列の解釈は、% 表記の内部変数を展開することによって行なわれ
  ます。各内部変数の意味は次の通りです。
    %f : 現在参照している DVI ファイルのファイル名(フルパス名)
    %F : 現在参照している DVI ファイルのファイル名(basename)
    %d : 現在参照している DVI ファイルが置かれているディレクトリ名
         ( %f = %d/%F )
    %p : プリンタ名(環境変数 PRINTER が定義されていればその値。また、
         Print-menu で設定されるならその値)
    %r : xdvi のプロセス ID
  以下はページ番号に関する内部変数です。すべて絶対ページ番号(先頭ページ
  を1として単調増加するページ番号。\count に左右されない)で表記します。
    %c : カレントページ番号
    %m : 最後にマークしたページ番号
    %s : リージョンの開始ページ番号(%c と %m の最小値)
    %e : リージョンの終了ページ番号(%c と %m の最大値)
    %l : マークしたページ番号リスト(マーク順); 各ページ番号は ',' で区切
         られている
    %L : マークしたページ番号リスト(マーク順); 各ページ番号は ' ' で区切
         られている
    %t : マークしたページ番号リスト(ソートされている); 各ページ番号は
         ',' で区切られている
    %T : マークしたページ番号リスト(ソートされている); 各ページ番号は
         ' ' で区切られている
    %k : %l と同様、ただし、各ページ番号の前に '=' が置かれている
         (dviselect を仮定している)
    %K : %L と同様、ただし、各ページ番号の前に '=' が置かれている
         (dviselect を仮定している)
    %a : %t と同様、ただし、各ページ番号の前に '=' が置かれている
         (dviselect を仮定している)
    %A : %T と同様、ただし、各ページ番号の前に '=' が置かれている
         (dviselect を仮定している)
  たとえば、上記の PRCMDLST の定義で、/home/onono/doc/sample.dvi をプレ
  ビューしていて、3,6,11,17ページをマークしている時に、Print-out メニュー
  から all marked pages を選択すると、実行される文字列は以下のようになり
  ます。
	(cd /home/onono/doc;
	 dviselect -i sample.dvi -o /tmp/sample.dvi:3,6,11,17@3255.dvi
		 =3 =6 =11 =17;
	 dvi2ps /tmp/sample.dvi:3,6,11,17@3255.dvi)
	| lpr -Plp -J'sample.dvi (Page 3.6.11.17)';
	/bin/rm /tmp/sample.dvi:3,6,11,17@3255.dvi
  ただし、xdvi のプロセス ID = 3255、プリンタ名 = lp とします。

○独立性
  Use_MARKPAGE, Use_TOC, Use_PRINTDVI は、相互に独立して#define/#undefで
  きるはずです(試していません)。もちろん、
	#undef	Use_MARKPAGE
	#define	Use_TOC
	#define	Use_PRINTDVI
  で作った場合は、toc 上でのマーキングができませんし(ページ移動はできる)、
  Print-out メニューは All pages と current page の二つだけになるでしょ
  う。

○著作権
  当該パッチの中のファイル
	markring.c
	markring.h
	markpage.c
	markpage.h
	toc.c
	toc.h
	print.c
	print.h
  の著作権は、作者である
	松浦 俊     MATSUURA Syun      syun@fuka.info.waseda.ac.jp
	平原 厚志   HIRAHARA Atsushi   hirahara@fuka.info.waseda.ac.jp
	小野 康一   ONO Kouichi        onono@fuka.info.waseda.ac.jp
  に帰属します。なお、著作者を明らかにする限り、当該パッチの一部または全
  体を改造、転送、再配布するのは自由とします。

○ヒマがあればやろうかな

1. 環境変数, オプション, リソースによる指定
			-printer	*printer
	XDVIPRALL	-prall		*print.all
	XDVIPRCUR	-prcur		*print.currentPage
	XDVIPRMKD	-prmarked	*print.markedPage
	XDVIPRRGN	-prregion	*print.region
	XDVIPRLST	-prlist		*print.list

2. ページ移動に伴う toc のスクロールバー移動

3. toc に表示するページ番号を \count0 を考慮した(実際の)ページ番号にする

4. マークページリストの表記を
	5,8-12,27,29,35-36,41
   のようにする
