# dviout specials

dviout は
\special{dviout <macro>}
によって、dviout のパラメータの変更やキー操作をdviファイルに埋め込んで利用することができます。通常の preview を行っているときのみ有効です（印刷や、4/16ページ同時表示などでは無視される）。
この機能は、HyperTeX specials でも用いることができます。
1. 上記の<macro>は、-macro: におけると同様、DDEによる他のプログラムとの連携における[ValueSet(parameter=value)] あるいは[Function(key)]の引数の形で定義します。ただし前者は各parameterの前に - をつけます。複数項を指定するときは空白で区切ります。
たとえば、
\special{dviout -y=A6L fn}
なお、マクロの実行や定義に変化を及ぼしたり、ページ表示後に行うキー操作(key)は、小文字に直して書きます。たとえば、次のページへの移動で、次のページに再び dviout special がある場合など(cf.Q_O30)。
用紙サイズを指定するには、dvips で
\special{papersize=<width>,<height>}
が可能ですが、これは dviout が自動的に
\special{dviout -y=F<width>:<height>P}
に変更して解釈します。ただし一度解釈されるとそのDVIファイルを閉じるまで、再解釈はされません。たとえば、
\special{papersize=21cm,19.7cm}
と指定しますが、-y=<parameter>の<parameter>を用いた
\special{papersize=A4L}
のような様式も可能です。また最初のページで
\AtBeginDvi{special{papersize=210mm,197mm>>>>{<<<<
のように指定しておけば、dviout の表示が最初のページからでなくてもこの指定が最初に解釈されます。
\AtBeginDvi{special{papersize=\the\paperheight,\the\paperwidth>>>>{<<<<
のような指定も可能です。
2. そのほか\special{dviout `key parameter}の形でいくつかの機能をサポートしています。keyには現在 timer, href, keep, restore, message, ask, input, in, in*, +, sp, initialize が可能です。
2.1. \special{dviout `timer number}
次に続く dviout specials の実行までに number/1000 秒の時間を空ける。ほかのページやdviファイルに移動した場合、未実行の dviout specials があってもそれはキャンセルされる。
次に続く dviout specials を number の後に空白を空けて書くことも許されます。
たとえば、最後を除く各ページに
\special{dviout `timer 60000}
\special{dviout Je}
と書き、最後のページに
\special{dviout `timer 60000}
\special{dviout Jt}
と書くと、各ページを順に60秒間表示し、最後のページの後は先頭のページに戻ります。なお
\special{dviout `timer 60000 Jt}
などと書いてもかまいません。
2.2. \special{dviout `wait}
これは \special{dviout `timer 0} と同じで、これ以前の dviout specials の実行が完了まで、これ以降の dviout specials の実行を待つ。また
\special{dviout <macro>}
\special{dviout `wait}
\special{dviout ....}
は、ひとつにまとめて
\special{dviout <macro> ; ....}
と書くことができる。
2.3. `"....."`
`timerを除く dviout specials は、`" と "` で囲んでブロック化することにより、いくつかの dviout specials を一つの \special にすることができます。間には自動的に `wait が挿入されます。
たとえば、myhyper.sty のもとで
\href{dviout:`"`href file:foo.mid"` `href file:foo.dvi}{jump to foo}
2.4. \special{dviout `href parameters}
paramaters は、HyperTeX specials における \special{html:<a href="parameters">} のparametersと同じ。ただし、parametersの先頭がdviout: であるものは無視される。
\special{html:<a href="dviout: -y=A4L ;`href file:foo.dvi">}
Jump to foo
\special{html:</a>}
などと、HyperTeXの中に入れることもできる。
2.5. \special{dviout `keep parameterlist}
paramater list にあるパラメータの現在の値を記録し、現在のDVIファイルから抜け出すとき、あるいは\special{dviout `restore}によって自動的に復元する。
現在のDVIファイル中でこの dviout special に複数回出会っても、値が記録されるのは初回のみである。また、復元により記録は消去される。たとえば
\special{dviout `keep y BMP}
2.6. \special{dviout `message <MESSAGE>}
<MESSAGE>が情報Windowに表示される。
<MESSAGE>は、`' と '` で囲むことによりブロック化できます。ブロック化した場合は、区切り `' により複数行に分割できます。複数行に分かれた場合は、最初の行がタイトル、それ以降がメッセージの本体と見なされます。たとえば
\special{dviout `message `'Remark`'Written by foo`'Jan. 2000'`}
2.7. \special{dviout `ask `'<MESSAGE>'` `yes ... `no ...}
<MESSAGE> を含む Yes か No かで答えるダイアログが表示され、その答えによって実行される dviout specials が選択される。
Yes と答えると、`yes が存在すればそれ以下のdviout specials が、`no の前まで、`no がそこに無ければ末尾まで実行される。No と答えた場合は逆になる。たとえば myhyper.sty を使うと
\href{dviout:`ask `'direction`'Landscape'` `yes -y=A4L fn `no -y=A4P fn}{Change direction}
2.8. \special{dviout `input <string>}
Clipboardの中身が <string> に置き換わる（ALTキーを押していると、Clipboardへの追加）。
`input の代わりに `in を用いると、<string>の中で一つの空白の後に16進の2桁の数が続いているものはその数のコードに置き換えられて入力される。ただし、空白が2つ続くものは1つの空白に置き換えられる。よって偶数個の連続した空白は、その半分の数の空白となる。
<string>の先頭が . で、それに16進の2桁の数が続いているものも、その数のコードに置き換えられる。先頭が .. となっていれば、それは . に置き換えられる。
`in の代わりに `in* を用いると、文字列が画面表示されることなくClipboardにコピーされる。
この dviout special は、HyperTeX の指定の中で用いると便利（ホットスポットのクリックで Clipboard に文字列がコピーされる）で、CTRL キーを押していた場合、エディタへの直接コピーができる（CTRL+ALT を押していた場合はエディタの再定義）。
2.9. \special{dviout `+<levels>}
そのページの以降の出力を制御する。<levels>がない場合は、出力を中止し、<levels> が - のとき再開される。
<levels>は -2, 4-5, 7- などのように書き（複数並べてもよい），その範囲のレベルにあるときに出力する。レベルは0から[SPACE]キーを押すと順に増える。
なお-2 は 0-2 と、7- は、7 以上と解釈される。さらに M はそれまでそのページで定義された最大のレベル、n個のMを並べるとそれまでそのページで定義された最大のレベル＋n を表す。一方 m はそれまでそのページで定義された最大のレベル−1 を、n個のmを並べるとそれまでそのページで定義された最大のレベル−n＋1 を表す（それが 0 以下の時は0）。
前のページに戻ったときは level が十分大きいとして処理されるが、再度 level を 0 としてそのページから再開するには reNew ボタンを押す（デフォルトでは CTRL+N）。
2.10. \special{dviout `sp <special>}
TeXのspecialを実行する dviout special。`initializeなどと組み合わせて使う。
2.11. \special{dviout `initialize <macro>}
dviファイルの先頭にこの dviout special を置くと、このdviファイルを読み込むときに（たとえ、２ページ目からの表示でも）常に最初に実行される。
オプションとして、<macro>の前に pageと書くと、各ページの最初で常に実行することを意味する。<macro>を指定したこの dviout special は、dviファイルの先頭以外の場所にあっても無視される。
先頭に定義したものを、途中で再度実行するには、
\special{dviout `initialize}
とのみ指定する。なお、dviファイルの先頭にこの dviout special を定義するには、たとえばTeXファイルの最初のページの冒頭に以下のように書く。
\AtBeginDvi{special{dviout `initialize -y=B5L>>>>{<<<<
\AtBeginDvi{special{dviout `initialize page `sp background Yellow>>>>{<<<<
さらに、複数のパスの設定ができる -TEXPK: -TEXFONTS: -TEXKNJ: -gdat: については、- を + と書くことによってパスの追加ができる。パスの先頭に ; を書くと末尾に、末尾に書くと先頭に追加される（いずれかを指定）。
重複追加がないようにチェックがされる。この + による機能は、一つの\specialにつきパラメータ名は一つのみである。たとえば
\AtBeginDvi{special{dviout `initialize `keep TEXPK>>>>{<<<<
\AtBeginDvi{special{dviout `initialize +TEXPK=^F/^s.pk;^F/^s.tfm;>>>>{<<<<
この初期化の dviout specials は、initial.par というファイルに中身を書いてDVIファイルへの埋め込みができる。