# source specials

MikTeXとyapや最新のアスキーpTeXで対応されている source special を解釈し、dviout の画面からエディターを呼び出して該当するソースファイルの該当個所にジャンプすること、および逆にTeXのソースファイルからDVIファイルへジャンプすることができます。
source special は、
\special{src:line_number source_file_name}
という形でDVIファイルに埋め込まれます。
1. dviout からエディターを呼び出してのジャンプ
dviout からエディターを呼び出す方法は、Setup Parameters -> [Common] の -src: で指定します。たとえば
c:\Program Files\Hidemaru\Hidemaru.exe^s/j%d "%s"
とします。%s はTeXファイル名（フルパス名）、%d は行番号に置き換えられます。%s の代わりに %n と書くと、TeXファイル名から拡張子を削ったものになります。^s は起動プログラム名とパラメータとの区切り記号です。
以下のように先頭に < を入れると、エディターの起動後、dvioutはアイコン化します。
<c:\Program Files\Hidemaru\Hidemaru.exe^s/j%d "%s"
emacs/mule/meadow の場合は、gnuserv パッケージを用いることにより、以下のように指定できます。
gnuclientw^s+%d %s
なおgnuservパッケージを用いるには、パッケージ中の実行ファイルをパスの通ったディレクトリに入れ、gnuserv.el をlispディレクトリに置いて M-x byte-compile-file などとしてバイトコンパイルし、$Home/.emacs に
(require 'gnuserv)
(gnuserv-start)
の２行を追加しておく必要があります。
DDEコマンドを使う場合は、DDEサーバのサービス名、トピック名、XTYP_EXECUTEトランザクションで渡す文字列を１文字の空白で区切って順に並べ、その全体を ` で挟んだものを指定します。その後に空白を空けずに続けて、DDEサーバが起動されていないときの処理を指定します。たとえば
`myedit myedit [dviout(+%d %s)]`c:\Program Files\myedit.exe^s+%d %s
なお、二番目の ` を２つ重ねた場合は、DDEサーバが起動されていないときの処理を行ったあと、再度 DDEコマンドを実行します。複数の XTYP_EXECUTEトランザクションを指定するときは、| で区切ります。たとえば
`myedit myedit Open(%s)|Line(%d)``myedit
DDE用の設定がされていないときは、-src: の先頭に
`srctex srctex %s: %d`
をつけて処理されます。
-src: の設定が空で環境変数 TEXEDIT が設定してあれば、それを用います。
1.1. マウスの左ボタンのダブルクリックにより（ただし矢印の形のマウスカーソルで、source specials が有効になっていないと、失敗することがあります）-src: に従って、ソースファイルの該当個所へジャンプします。
同様に、SHIFTキーを押しながらのマウスの左ボタンクリックで文字列コピーを実行したとき、source special が設定されていれば、[Execute]ボタンが[->Src]ボタンに変更され、そのボタンでソースファイルの該当個所へのジャンプが出来ます。なお、Jump -> DireCt Jump to Editor がチェックされていれば、直接ジャンプします。
-src: が空でなくて、%d または %s, %n が含まれないときは、タグジャンプ形式のテキストが表示されます。
1.2. CTRLキーとマウスの左ボタンを押した状態で、マウスの右ボタンをクリックすると、source specialが設定されていれば、上記と同様ソースファイルへのジャンプができます。
こちらの場合は、縦方向（縦書きモードでは横方向）の位置のみしか見ていないので、多段組などではジャンプ位置が不正確になることがあります。
2. source special を使ってのジャンプ
HyperTeX を使ってのジャンプと同様、#line_number tex_file_name または #line_number/string tex_file_name を指定してdvioutで該当個所を表示できます。コマンドラインからは例えば、
dviout -1 foo.dvi "# 235 foo.tex"
のように指定します。なお、-1 は最初の dviout を意味します（cf. 起動と終了、no more dviout)。このときは DVIファイル名には拡張子 .dvi が必要。さらに
dviout -1 foo.dvi "# 235/This foo.tex"
とすると foo.tex の 235行目の "This" という単語への移動を意味します（単語単位かどうかは、dviout で行ってdvioutを終了した最後のサーチがどちらであったかで決まります）。"This book" のときは
dviout -1 foo.dvi "# 235/This book foo.tex"
とします（"# ... " の最後の部分がTeXのソースファイル名）。
dviout -1 foo.dvi "# 235/東京 foo.tex"
などのように和文の文字列も指定できます。
DDE（他のプログラムとの連携）を使う場合も同様で
[PageOpen(# 235 foo.tex)]
などのようにします。ファイル名の部分を * とすると、ファイル名のチェックは行わず、ソースファイルの行番号（+ 文字列）のみで判断されます。また、ファイル名が空白を含むときは ' で囲って 'My Documents\foo.tex' のように指定します。
エディターで編集中のTeXのソースファイルに対し、拡張子 .tex を .dvi に変えたDVIファイルが、同じディレクトリにあるとします。このときソースのカーソル位置に対応するDVIファイルの場所をdvioutで表示するには、たとえば秀丸のマクロでは
ddeinitiate "dviout", "dviout";
ddeexecute "[PageOpen(# "+str(lineno)+" *)]";
ddeexecute "[FileOpen("+leftstr(filename,strlen(filename)-3)+"dvi)]";
とします。なお上記の"[PageOpen(# "や" *)]" には半角空白が入っているので注意（DDE使用例参照）。
dvioutでの文字列サーチによる直接の指定（たとえば、_235_foo.tex あるいは _235_* で、_ は半角空白）もできます。
3. source specials を埋め込んだ DVI ファイルの作成
TeX コンパイラを -help というパラメータで起動したときに表示される Option: に
-src-specials Insert source specials into the DVI file.
という項があれば、source specials がサポートされており、-src というオプションを付加して TeX コンパイラを使うと、対応した DVI ファイルが作成されます。すなわち、たとえば以下のようにします。
platex -src foo
source specials に対応した TeX コンパイラを用いなくても、付属の srctex により source specials を埋め込んだ DVI ファイルを作成することができます。たとえば、foo.tex から
platex foo
によって、DVI ファイルを作成する代わりに
srctex platex foo
あるいは
srctex -a platex foo
とします。中間ファイルとして foo.tmp が作成され platex に渡されます。後者の方がより詳しい情報が埋め込まれ、より正確なジャンプが出来ますが DVIファイルの作成に失敗する可能性がより高くなり、作成されたファイルが大きくなります。
コンパイルエラーでエディターが呼ばれた場合、foo.tmp でなくて foo.tex を編集するには、付属の convedit を経由し、そのパラメータにエディターを開く通常の方法を指定します。たとえば
TEXEDIT=convedit mule +%d "%s"
foo.tex を source specials の埋め込まれた TeX ファイル fo1.tex に変換するには、
srctex -ofo1.tex foo
とします。またこれと同時に platex fo2 を実行するには
srctex -ifoo.tex -ofo1.tex platex fo2
とします。 より詳しくは、srctex をパラメータ無しで実行して表示される情報や付属の srctex.cfg などを参照してください。