% \iffalse meta-comment
%
% Copyright (c) 2005-2007, Lars Kotthoff <lars@larsko.org>
%
% Large portions copied from pdftex,
% Copyright (c) 2001-3, Radhakrishnan CV <cvr@river-valley.com>
%                       Rajagopal CV <cvr3@river-valley.com>
%                       http://www.river-valley.com
%
% River Valley Technologies, Floor III, SJP Buildings, Cotton Hills
% Trivandrum, India 695014
%
% Tel: +91 471 233 7501
%
%                     Antoine Chambert-Loir 
%                     <chambert@math.polytechnique.fr>
%                     http://www.math.polytechnique.fr/~chambert
%
% Ecole polytechnique, Palaiseau Cedex, France
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
% 
% You should have received a copy of the GNU General Public License
% along with this program (gpl.txt); if not, write to the Free
% Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
% MA  02111-1307, USA.
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{dottex.dtx}
%</driver>
%<package> \NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package> \ProvidesPackage{dottex}
%<*package>
    [2007/08/22 v0.6 dot/neato graphs in LaTeX]
\RequirePackage{graphicx,moreverb,keyval}
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{dottex}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
    \DocInput{dottex.dtx}
    \PrintChanges
    \PrintIndex
\end{document}
%</driver>                                                       
% \fi
%
% \CheckSum{397}                                                   
%
% \CharacterTable                                                
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \changes{v0.1}{2005/08/06}{Initial version.}
% \changes{v0.2}{2005/08/13}{New way to set graph width, neatopic environment.}
%	\changes{v0.3}{2005/11/16}{Added pdf option to package.}
%	\changes{v0.4}{2006/01/23}{Changed pdf support to ps -> eps -> pdf conversion.
%	Fixed bugs.}
%	\changes{v0.5}{2006/04/02}{Added keyval interface for picture dimensions.}
%	\changes{v0.6}{2007/08/22}{Improved Miktex support.}
%
% \GetFileInfo{dottex.dtx}
%
% \DoNotIndex{\the,\year,\month,\day,\time}
%
% \title{The \textsf{dottex} package\thanks{This document
%   corresponds to \textsf{dottex}~\fileversion, dated \filedate.}}
% \author{Lars Kotthoff\\ \texttt{lars@larsko.org}}
%
% \maketitle
%
% \section{Introduction}
%
% This package allows you to include dot and neato graphs in your \LaTeX{} documents.
%
% The dot/neato code is extracted from the document and written to
% \texttt{.dot}/\texttt{.neato}
% files. Then, if shell escape is used, the graph files are automatically
% processed and converted to PostScript files, which will then be included. If
% shell escape isn't used, the user will have to manually convert the
% files.
%
% Shell escape is available in the web2c \TeX{} compiler, it allows the execution
% of shell code during the compilation of a \TeX{} document. It's disabled by
% default, you'll have to edit your configuration files or give the
% \texttt{-shell-escape} option to \texttt{latex}.
% A check is performed whether shell escape really works, so you might get
% warnings that the \texttt{.dot}/\texttt{.neato} files need to be converted manually although
% you enabled shell escape.
%
% \section{Requirements}
%
% To use dottex, you'll need the \texttt{graphicx}, \texttt{keyval} and
% \texttt{moreverb} packages, ps2pdf if you want to use the pdf
% option, and of course, dot / neato of the Graphviz package. All the binaries
% need to be in your PATH, i.e.\ you should be able to call them without
% specifying the absolute path to the binary.
%
% \section{Usage}
%
% To load the package, simply \verb=\usepackage{dottex}= in your document
% preamble. Options that can be passed to the package are
% \begin{description}
%     \item[\oarg{shell}] Use shell escape to automatically generate the graphs
%     from the dot source files. This is the default. Normally, you don't need
%     to specify it.
%     \item[\oarg{noshell}] Don't use shell escape, graphs must be generated
%     manually.
%     \item[\oarg{miktex}] We're using mikTeX.
%			\item[\oarg{pdf}] PDF output, generate .pdf files of the graphs out of
%			.ps.
% \end{description}
%
% The following environments can be used to include graphs:
%
% \DescribeEnv{dotpic}
% Within this environment, you can specify arbitrary dot code, for example\\
% \texttt{a -> b;\\b -> a;}.\\
% The \texttt{digraph} preamble and the surrounding braces are inserted
% automatically.
%
% \DescribeEnv{neatopic}
% Within this environment, you can specify arbitrary neato code, for example\\
% \texttt{a -- b;\\b -- a;}.\\
% The \texttt{graph} preamble and the surrounding braces are inserted
% automatically.
%
% For both environments, you may specify width or height of the picture using
% [width=\meta{width}] or [height=\meta{height}] as in the \texttt{includegraphics} command.
%
% \section{Acknowledgements}
%
% Thanks to Klaus Storch for several suggestions to improve the Miktex
% compatibility.
%
% \StopEventually{}
%
% \section{Implementation}
%
% \subsection{Initialization}
%    \begin{macrocode}
\newif\ifShellEscape
\newif\ifmiktex \miktexfalse
\newif\ifpdf \pdffalse

\DeclareOption{shell}{\ShellEscapetrue}
\DeclareOption{noshell}{\ShellEscapefalse}
\DeclareOption{miktex}{\global\miktextrue}
\DeclareOption{pdf}{\pdftrue}

\ExecuteOptions{shell}
\ProcessOptions\relax
%% test if shell escape really works
\ifShellEscape
    \def\tmpfile{/tmp/w18-test-\the\year\the\month\the\day\the\time} 
		\ifmiktex
				\def\tmpfile{w18-test-\the\year\the\month\the\day\the\time}
				\immediate\write18{echo t > "\tmpfile"}
		\else
		\immediate\write18{touch \tmpfile}
		\fi
		\ifmiktex
				\IfFileExists{\tmpfile.}{\ShellEscapetrue}{\ShellEscapefalse}
				\immediate\write18{del "\tmpfile"}
		\else
				\IfFileExists{\tmpfile}{\ShellEscapetrue}{\ShellEscapefalse}
				\immediate\write18{rm -f \tmpfile}
		\fi
\fi

\ifShellEscape
    \PackageInfo{dottex}
    {Automatically converting dot/neato files}
\else
    \PackageWarningNoLine{dottex}
        {Shell escape not enabled.\MessageBreak
        You'll need to convert the graphs yourself.}
\fi
\newcounter{fignum}
%    \end{macrocode}
%
% \subsection{\texttt{.dot}/\texttt{.neato} write out}
%    \begin{macrocode}
\def\figname{\jobname-dottex-fig\thefignum}

\def\dotverbatimwrite#1{%
    \def\BeforeStream
    {\message{Opening Dot stream=\figname.dot}%
        \immediate\write\verbatim@out{\string digraph\space G\space {/*}*/}
    }
    \@bsphack
    \immediate\openout \verbatim@out #1
    \BeforeStream%
    \let\do\@makeother\dospecials
    \catcode`\^^M\active
    \def\verbatim@processline{%
        \immediate\write\verbatim@out
        {\the\verbatim@line}}%
    \verbatim@start}
\def\enddotverbatimwrite{%
    \immediate\write\verbatim@out{/*{*/}}
    \immediate\closeout\verbatim@out
    \@esphack}

\def\neatoverbatimwrite#1{%
    \def\BeforeStream
    {\message{Opening Neato stream=\figname.neato}%
        \immediate\write\verbatim@out{\string graph\space G\space {/*}*/}
    }
    \@bsphack
    \immediate\openout \verbatim@out #1
    \BeforeStream%
    \let\do\@makeother\dospecials
    \catcode`\^^M\active
    \def\verbatim@processline{%
        \immediate\write\verbatim@out
        {\the\verbatim@line}}%
    \verbatim@start}
\def\endneatoverbatimwrite{%
    \immediate\write\verbatim@out{/*{*/}}
    \immediate\closeout\verbatim@out
    \@esphack}
%    \end{macrocode}
% 
% The spurious braces (commented out in the \texttt{.dot}/\texttt{.neato} file) are necessary
% because \LaTeX{} gets confused with only one brace.
%
%
% \subsection{Environment definition}
%    \begin{macrocode}
\define@key{pic}{width}{\def\dotwidth{#1}}
\define@key{pic}{height}{\def\dotheight{#1}}
\newenvironment{dotpic}[1][]{\stepcounter{fignum}%
		\let\dotwidth\undefined
		\let\dotheight\undefined
		\setkeys{pic}{#1}
    \xdef\dotCutFile{\figname.dot}
    \dotverbatimwrite{\dotCutFile}}
    {\enddotverbatimwrite%
    \dotgraphicsinclude}

\newenvironment{neatopic}[1][]{\stepcounter{fignum}%
		\let\dotwidth\undefined
		\let\dotheight\undefined
		\setkeys{pic}{#1}
    \xdef\neatoCutFile{\figname.neato}
    \neatoverbatimwrite{\neatoCutFile}}
    {\endneatoverbatimwrite%
    \neatographicsinclude}
%    \end{macrocode}
%
% \subsection{\texttt{.dot}/\texttt{.neato} file processing}
%    \begin{macrocode}
\long\gdef\dotgraphicsprocess{%
    \ifShellEscape
				\IfFileExists{\figname.dot}{%
						\immediate\write18{dot -Tps2 -o \figname.ps \figname.dot}
						\IfFileExists{\figname.ps}{%
								\ifpdf
										\immediate\write18{ps2pdf \figname.ps \figname.pdf}
										\IfFileExists{\figname.pdf}{%
												\PackageInfo{dottex}
												{\figname.dot converted}}
												{\PackageWarningNoLine{dottex}
														{Conversion of \figname.dot failed.}}
								\else
										\PackageInfo{dottex}
										{\figname.dot converted}
								\fi}
								{\PackageWarningNoLine{dottex}
										{Conversion of \figname.dot failed.}}}{}
				\fi}

\long\gdef\neatographicsprocess{%
    \ifShellEscape
        \IfFileExists{\figname.neato}{%
            \immediate\write18{neato -Tps2 -o \figname.ps \figname.neato}
            \IfFileExists{\figname.ps}{%
								\ifpdf
										\immediate\write18{ps2pdf \figname.ps \figname.pdf}
										\IfFileExists{\figname.pdf}{%
												\PackageInfo{dottex}
												{\figname.dot converted}}
												{\PackageWarningNoLine{dottex}
														{Conversion of \figname.dot failed.}}
								\else
										\PackageInfo{dottex}
												{\figname.neato converted}
								\fi}
                {\PackageWarningNoLine{dottex}
                    {Conversion of \figname.neato failed.}}}{}
				\fi}
%    \end{macrocode}
%
% \subsection{Graph inclusion}
%    \begin{macrocode}
\long\gdef\dotgraphicsinclude{\dotgraphicsprocess%
		\ifpdf
				\IfFileExists{\figname.pdf}{%
						\ifx\dotwidth\undefined
								\ifx\dotheight\undefined
										\includegraphics{\figname}
								\else
										\includegraphics[height=\dotheight]{\figname}
								\fi
						\else
								\ifx\dotheight\undefined
										\includegraphics[width=\dotwidth]{\figname}
								\else
										\includegraphics[width=\dotwidth,height=\dotheight]{\figname}
								\fi
						\fi
				}
				{\PackageWarningNoLine{dottex}
						{Please convert \figname.dot manually}}
		\else
				\IfFileExists{\figname.ps}{%
						\ifx\dotwidth\undefined
								\ifx\dotheight\undefined
										\includegraphics{\figname}
								\else
										\includegraphics[height=\dotheight]{\figname}
								\fi
						\else
								\ifx\dotheight\undefined
										\includegraphics[width=\dotwidth]{\figname}
								\else
										\includegraphics[width=\dotwidth,height=\dotheight]{\figname}
								\fi
						\fi
				}
				{\PackageWarningNoLine{dottex}
						{Please convert \figname.dot manually}}
		\fi
}

\long\gdef\neatographicsinclude{\neatographicsprocess%
		\ifpdf
				\IfFileExists{\figname.pdf}{%
						\ifx\dotwidth\undefined
								\ifx\dotheight\undefined
										\includegraphics{\figname}
								\else
										\includegraphics[height=\dotheight]{\figname}
								\fi
						\else
								\ifx\dotheight\undefined
										\includegraphics[width=\dotwidth]{\figname}
								\else
										\includegraphics[width=\dotwidth,height=\dotheight]{\figname}
								\fi
						\fi
				}
				{\PackageWarningNoLine{dottex}
						{Please convert \figname.neato manually}}
		\else
				\IfFileExists{\figname.ps}{%
						\ifx\dotwidth\undefined
								\ifx\dotheight\undefined
										\includegraphics{\figname}
								\else
										\includegraphics[height=\dotheight]{\figname}
								\fi
						\else
								\ifx\dotheight\undefined
										\includegraphics[width=\dotwidth]{\figname}
								\else
										\includegraphics[width=\dotwidth,height=\dotheight]{\figname}
								\fi
						\fi
				}
				{\PackageWarningNoLine{dottex}
						{Please convert \figname.neato manually}}
		\fi
}
%    \end{macrocode}
%
% \Finale
\endinput
