\input DraTex.sty
\input AlDraTex.sty
%%%%%%%%%%%%%%%%% finite machines %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Define\StateDiagrams{
\Define\StateAt(3){
\IF \LtInt(##1,0)\ELSE
\MoveTo(##2,##3)
\StateNode(##1)(--\null--) \EdgeToInit(##1)
\FI }
\Define\AStateAt(3){
\IF \LtInt(##1,0)\ELSE
\MoveTo(##2,##3)
\AStateNode(##1)(--\null--) \EdgeToInit(##1)
\FI }
\Define\StateBt(4){
\IF \LtInt(##1,0)\ELSE
\MoveTo(##3,##4)
\StateNode(##1)(--##2--)
\EdgeToInit(##1)
\FI }
\Define\AStateBt(4){
\IF \LtInt(##1,0)\ELSE
\MoveTo(##3,##4)
\AStateNode(##1)(--##2--) \EdgeToInit(##1)
\FI }
\StateSpec(,106,,,106,)
\ArrowHeads(1)
}
\Define\EdgeToInit(1){
\IF \EqInt(#1,0) \MoveToNode(#1,-1,0)
\Move(-20,0) \FcNode(x) \Edge(x,0)
\FI
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Define\Tape(3){\getlbl#3////%
{ \Move(#1,#2) { \EntryExit(1,0,0,0) \Text(--\strut\temp--) }
\Move(6,0) \EntryExit(-1,0,0,0) \Text(--\strut\tempa--) }}
\def\getlbl#1/#2////{\def\temp{#1}\def\tempa{#2}}
\Define\cent{\hbox{\rlap{$\,/$}c}}
%%%%%%%%%%%%%%%%% Debugging %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\TraceStateDiagramsOn{\Define\TraceState(1){\immediate\write16{..##1}}}
\def\TraceStateDiagramsOff{\Define\TraceState(1){}}
\TraceStateDiagramsOff
%%%%%%%%%%%%%%%%% specification for states %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \StateSpec( content?, xy-?,y-?, ...same for accept
% no xy,x content size
% both xy, x given size
% alone xy >80 symbol #
% \StateSpec(+,,,+,,) adjustable nodes with content
% \StateSpec(,106,,+,28,20) fixed no-content for regular states
% fixed internaloval(28,20)+content for accepting
% states denoted by nonnegative integer #'s. Initial state must be 0.
\Define\StateSpec(6){
\def\tempa{#1}
\def\tempb{#4}
\edef\temp{
\noexpand\DiagramSpec(
\ifx \tempa\empty \noexpand\StateAt \else \noexpand\StateBt \fi
\noexpand &
\ifx \tempb\empty \noexpand\AStateAt\else \noexpand\AStateBt \fi
\noexpand & \noexpand\TransEdge ) }
\temp
\def\temp{#2#3}
\ifx \temp\empty \let\StateNode=\OvalNode
\else \def\temp{#3}
\ifx \temp\empty \NewCIRCNode(\StateNode,#2,)
\else \NewNode(\StateNode,\MoveToOval){\DrawOval(#2,#3)}\fi
\fi
\def\temp{#5#6}
\ifx \temp\empty \let\AStateNode=\OOvalNode
\else \def\temp{#6}
\ifx \temp\empty
\I=#5; \ifx\tempb\empty \I-3; \else \I+3; \fi
\NewCIRCNode(\AStateNode,#5,\Val\I)
\else
\NewNode(\AStateNode,\MoveToOval){
\DrawOval(#5,#6)
\I=#5; \J=#6;
\ifx \tempb\empty \I-3; \J-3; \else
\I+3; \J+3; \fi
\DrawOval(\Val\I,\Val\J)
}
\fi
\fi
}
\catcode`\:=11
\NewNode(\OOvalNode,\MoveToOval){
\Units(1pt,1pt) \GetNodeSize \Va/0.707; \Vb/0.707;
\SetMinNodeSize
\if:circle
\IF \LtDec(\Va,\Vb) \THEN \Va=\Vb;
\ELSE \IF \LtDec(\Vb,\Va) \THEN \Vb=\Va;
\FI \FI
\fi { \:NodeArc(\Val\Va,\Val\Vb) (0,360) }
\Va+3; \Vb+3; \:NodeArc(\Val\Va,\Val\Vb) (0,360)
}
\catcode`\:=12
%%%%%%%%%%%%%%%%% pushdown machines %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Define\PdaDiagrams{
\StateDiagrams
\Define\trans(3){
\TraceState(##1..##2)
\K+1; \IF \EqInt(\K,4) \K=1; \MoveToLoc(o)
\Move(0,-25) \MarkLoc(o) \FI
\Object\OB{{ \Move(1,-5) \Line(8,20) }
\Tape(4,10,##1/)
\Tape(0, 0,##2)} \OB \cont{##3}}
\CycleEdgeSpec(30,20)
\LabelSpec(1){%
\PictLabel{\MarkLoc(o)\EntryExit(-1,-1,1,-1)\trans(##1,)}}
\def\cont##1{\IF \EqText(,##1)\ELSE \Text(--,~--)\trans(##1)\FI}
}
\Define\PdtDiagrams{
\StateDiagrams
\Define\trans(4){
\TraceState(##1..##2..##3)
\K+1; \IF \EqInt(\K,4) \K=1; \MoveToLoc(o)
\Move(0,-35) \MarkLoc(o) \FI
\Object\OB{{ \Move(1,-5) \Line(12,30) }
\Tape(8,20,##1/)
\Tape(4,10,##2)
\Tape(0, 0,/##3)} \OB \cont{##4}}
\CycleEdgeSpec(30,35)
\LabelSpec(1){%
\PictLabel{\MarkLoc(o)\EntryExit(-1,-1,1,-1)\trans(##1,)}}
\def\cont##1{\IF \EqText(,##1)\ELSE \Text(--,~--)\trans(##1)\FI}
}
%%%%%%%%%%%%%%%%% Turing machines %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Define\TmDiagrams(1){
\StateDiagrams
\ifcase #1
\or \Define\trans(3){ %1
\K+1; \IF \EqInt(\K,3) \K=1; \MoveToLoc(o)
\Move(0,-25) \MarkLoc(o) \FI
\Object\OB{{ \Move(1,-5) \Line(8,20) }
\Tape(4,10,##1)
\Tape(0, 0,##2)} \OB \cont{##3}}
\CycleEdgeSpec(30,20)
\or \Define\trans(4){ %2
\K+1; \IF \EqInt(\K,3) \K=1; \MoveToLoc(o)
\Move(0,-35) \MarkLoc(o) \FI
\Object\OB{{ \Move(1,-5) \Line(12,30) }
\Tape(8,20,##1)
\Tape(4,10,##2)
\Tape(0, 0,##3)} \OB \cont{##4}}
\CycleEdgeSpec(30,35)
\or \Define\trans(5){ %3
\K+1; \IF \EqInt(\K,3) \K=1; \MoveToLoc(o)
\Move(0,-45) \MarkLoc(o) \FI
\Object\OB{{ \Move(1,-5) \Line(16,40) }
\Tape(12,30,##1)
\Tape(8,20,##2)
\Tape(4,10,##3)
\Tape(0, 0,##4)} \OB \cont{##5}}
\CycleEdgeSpec(30,50)
\or \Define\trans(6){ %4
\K+1; \IF \EqInt(\K,3) \K=1; \MoveToLoc(o)
\Move(0,-55) \MarkLoc(o) \FI
\Object\OB{{ \Move(1,-5) \Line(20,50) }
\Tape(16,40,##1)
\Tape(12,30,##2)
\Tape(8,20,##3)
\Tape(4,10,##4)
\Tape(0, 0,##5)} \OB \cont{##6}}
\CycleEdgeSpec(30,65)
\fi
\LabelSpec(1){%
\PictLabel{\MarkLoc(o)\EntryExit(-1,-1,1,-1)\trans(##1,)}}
\def\cont##1{\IF \EqText(,##1)\ELSE \Text(--,~--)\trans(##1)\FI}
}
\endinput