# ページ指定マクロ

印刷ダイアログで[Option]を選んだときの出力ページをコントロールするマクロは、dviout のディレクトリの par\*.pgm というファイル群で、一つのファイルが一つのマクロファイルである。その中身の意味は以下の通り。
先頭が#で始まる行は、コメント行。先頭行から続くコメント行の中で、日本語モードでは先頭が#e#以外で始まる行が必要で、その最初の行が、リストボックスに表示される（非日本語モードでは、#j#以外）。
「M」で始まる空白を挟まないブロックがマクロブロックで
Minitialize;difference;pages
の形をしていて、ページ指定範囲がこのマクロに基づいて出力される。なお、M 以下のマクロの記述部分が無い場合は、マクロの解除を意味する。
・マクロ文中では、v, w, x, y, z の5つの変数が使用可能。
・pages は、「式」または「Z+」,「Z-」,「Z」,「.」を「,」で区切って並べたもので、z > 0 が成立すれば「式」の値のページの出力などを行なう。
・上記終了後はdifferenceに従って変数の値を変え、さらにzの値を1引くが、z > 0 ならば再びpagesに従ったページ出力を行なう、と繰り返す。
・「式」 とは、 変数や数を「+」または「-」で結合したもので、x+5, x+v-3 などのようなものです。
・pagesの「式」の値が指定範囲に入っていなければ、 通常は空白ページが出力される。
・pagesの「式」のいくつかを[ ]で囲んでブロックを作っておくと、その中に範囲内のページ出力がない場合、そのブロックの出力を無視します。[ ] のネスティングは不可。
・initializeとdifferenceは、「代入文」を並べたもので、「代入文」 は 変数+=式,変数-=式, 変数*=式, 変数/=式 変数&=式 の何れかの形のもの。
・変数は、v = w = 0、x は指定範囲の最初のページ番号、yは指定範囲の最後のページ番号、zは指定範囲のページ数、がそれぞれ代入された後、initializeによって初期値が定まる。
C 言語の形式で言えば
v = w = 0; x = start_page; y = end_page; z = y - x + 1;
for(initialize; z > 0; difference, z--)
{ pages の出力;}
となります。例えば
Mv+=y,v&=1,y-=v,z-=v;y-=2,z-=1;y
は偶数ページのみの逆順出力になります。 一枚毎に手で用紙を裏返して行う両面印刷の袋とじは
Mz+=3,z/=4;x+=4;x+3,Z+,x,Z,[x+1,Z+,x+2,Z]
両面印刷プリンターを用いた、最初のページを空白にする両面印刷袋とじは
Mz+=4,z/=4,x-=1;x+=4;x+3,x,[x+1,x+2]