% ------------------------------------------------------------------------
% File: srcltx.sty
%       ==========
%
% Version 1.002 1999 Sep 3  (modified to change \everypar)
%               by David Carlisle
%
% Version 1.001 1998 Dec 23 (modified to change \output)
%               by Berthold Horn
%
% This package was originally written by Aleksander Simonic (the
% author of WinEdt Shell) to implement a source file tracking and
% DVI "SRC" specials for LaTeX.
%
% This package comes with no guarantees and no reserved rights.
% You can use or modify this file at your own risk.
% ************************************************************************
% NOTE: TeX commands are case sensitive. You have to use uppercase
% \Input to take advantage of this package
%
% This package supports nested \Input commands...
% File extension should be specified in \Input!
%
% This file should be placed in a directory where your LaTeX is
% looking for inputs (eg. ...\localtexmf\tex for MiKTeX).
%
% If you are writing a book with WinEdt and LaTeX simply
% include this file and use \include{mychapter} command...
% This way all the necessary specials for DVI Search and
% Inverse Search are inserted in your DVI File.
%
% WinEdt will be able to track Errors from your LOG file.
%
% ************************************************************************
%
% Some TeX implementations (eg. MiKTeX 1.20 [or later]) can insert
% the SRC specials much better than any macro package. Consult your
% TeX documentation to see if it is better to leave the task to your
% TeX. You can still use the [inactive] version of this package to
% take advantage of the re-defined Input commands and thus allowing
% WinEdt to keep track of errors in included source files.
%
% MiKTeX inserts the SRC specials in the DVI file if you start
% [La]TeX with --src qualifier (see MiKTeX's Manual:
% ...\texmf\Doc\MiKTeX\MiKTeX.pdf for more info).
%
% ************************************************************************
%
% * NOTE: Some TeX implementations add the file type to the "\jobname".
% In that case the definition of the "\MainFile" should be modified to:
%
%     \def\MainFile{\jobname} instead of \def\MainFile{\jobname.tex}.
%
% ************************************************************************
%
% *** Example - Your LaTeX thesis document may look like this:
%
%\documentclass[12pt]{report}
%\usepackage[centertags]{amstex}
%\usepackage{thesis,newlfont,amsthm}
%\usepackage[active]{srcltx}
%%No src specials are written when loading the package by
%%\usepackage[inactive]{srcltx}
%
% .... Preamble ....
%
%\begin{document}
%
% .... Title, Author etc. ....
%
%\WinEdt{?0000} % Do not process any Errors (Overful/Underful Boxes)
%\beforepreface
%\WinEdt{?1111} % Process All Types of Errors from here on
%\include{ABS}
%\include{ACK}
%\afterpreface
%\include{chapter0}
%\include{chapter1}
%\include{chapter2}
%\include{chapter3}
%\bibliographystyle{amsplain}
%\bibliography{xbib}
%\end{document}
%
% ------------------------------------------------------------------------
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{srcltx}[1999/10/11 v1.002 DVI Search]
\newif\ifSRCOK \SRCOKtrue
\DeclareOption{active}{\SRCOKtrue}
\DeclareOption{inactive}{\SRCOKfalse}
\ExecuteOptions{inactive}
\ProcessOptions
% ------------------------------------------------------------------------
\newcount\PAGETOP
\newcount\LASTLINE
\global\PAGETOP=1
\global\LASTLINE=-1
\gdef\MainFile{\jobname.tex}% ".tex" needed for MiKTeX
\gdef\CurrentInput{\MainFile}
\newcount\INPSP
\global\INPSP=0
\def\EJECT{\SRC\eject}
\def\WinEdt#1{\typeout{:#1}}% WinEdt LOG MODE and INPUT
% ------------------------------------------------------------------------
%If your are using DVIWIN remove the \space from the definitions below...
\def\SRC{\ifSRCOK%
  \ifnum\inputlineno>\LASTLINE%
    \ifnum\LASTLINE<0%
      \global\PAGETOP=\inputlineno%
    \fi%
    \global\LASTLINE=\inputlineno%
    \ifnum\INPSP=0%
      \ifnum\inputlineno>\PAGETOP%
        \special{src:\the\inputlineno\space\CurrentInput}%
      \fi%
    \else%
      \special{src:\the\inputlineno\space\CurrentInput}%
    \fi%
  \fi%
\fi}
% ------------------------------------------------------------------------
\def\PUSH#1{%
\SRC%
\ifnum\INPSP=0 \global\let\INPSTACKA=\CurrentInput \else%
\ifnum\INPSP=1 \global\let\INPSTACKB=\CurrentInput \else%
\ifnum\INPSP=2 \global\let\INPSTACKC=\CurrentInput \else%
\ifnum\INPSP=3 \global\let\INPSTACKD=\CurrentInput \else%
\ifnum\INPSP=4 \global\let\INPSTACKE=\CurrentInput \else%
\ifnum\INPSP=5 \global\let\INPSTACKF=\CurrentInput \else%
               \global\let\INPSTACKX=\CurrentInput \fi\fi\fi\fi\fi\fi%
\gdef\CurrentInput{#1}%
\WinEdt{<+ \CurrentInput}%
\global\LASTLINE=0%
\ifSRCOK\special{src:1\CurrentInput}\fi%
\global\advance\INPSP by 1}
%
\def\POP{%
\ifnum\INPSP>0 \global\advance\INPSP by -1  \fi%
\ifnum\INPSP=0 \global\let\CurrentInput=\INPSTACKA \else%
\ifnum\INPSP=1 \global\let\CurrentInput=\INPSTACKB \else%
\ifnum\INPSP=2 \global\let\CurrentInput=\INPSTACKC \else%
\ifnum\INPSP=3 \global\let\CurrentInput=\INPSTACKD \else%
\ifnum\INPSP=4 \global\let\CurrentInput=\INPSTACKE \else%
\ifnum\INPSP=5 \global\let\CurrentInput=\INPSTACKF \else%
               \global\let\CurrentInput=\INPSTACKX \fi\fi\fi\fi\fi\fi%
\WinEdt{<-}%
\global\LASTLINE=\inputlineno%
\global\advance\LASTLINE by -1%
\SRC}
% ------------------------------------------------------------------------
% Dummy Input: can be used as \INPUT{<file>.bbl} to collect \bibitems
\def\INPUT#1{\relax}
% ------------------------------------------------------------------------
% Redefine the original \include command
\let\OldINCLUDE=\include
\def\include#1{%Always ".tex" file type!
\EJECT%
\PUSH{#1.tex}%
\OldINCLUDE{#1}%
\POP}
% ------------------------------------------------------------------------
\def\Input#1{%Specify File Extension!
\PUSH{#1}%
\input #1%
\POP}
% ------------------------------------------------------------------------
% Note that these have been defined to concatenate the \SRC with
% whatever those token lists did before, just in case they were not
% empty token lists.  Of course, later definitions may undo all this...
\let\originalxxxeverypar\everypar
\newtoks\everypar
\originalxxxeverypar{\the\everypar\expandafter\SRC}
%\everypar\expandafter{\the\everypar\expandafter\SRC}
% ??? Remove the following line if you encounter problems:
\everymath\expandafter{\the\everymath\expandafter\SRC}
% ------------------------------------------------------------------------
% Redefine the \bibliography command:
\let\zzzxxxbibliography=\bibliography
\def\bibliography#1{\PUSH{\jobname.bbl}\zzzxxxbibliography{#1}\POP}
%------------------------------------------------------------------------
% Modification to output routine to turn off \SRC while \output is active
\output\expandafter{\expandafter\SRCOKfalse\the\output}
%------------------------------------------------------------------------
