% \iffalse meta-comment % % Copyright (c) 2005-2007, Lars Kotthoff % % Large portions copied from pdftex, % Copyright (c) 2001-3, Radhakrishnan CV % Rajagopal CV % 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 % % 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} % % \NeedsTeXFormat{LaTeX2e}[1999/12/01] % \ProvidesPackage{dottex} %<*package> [2007/08/22 v0.6 dot/neato graphs in LaTeX] \RequirePackage{graphicx,moreverb,keyval} % % %<*driver> \documentclass{ltxdoc} \usepackage{dottex} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{dottex.dtx} \PrintChanges \PrintIndex \end{document} % % \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