\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