%D \module
%D   [       file=ppchtex (m-chemie),
%D        version=1997.03.19,
%D          title=\CONTEXT\ Extra Modules,
%D       subtitle=\PPCHTEX\ (Plain Pictex Context cHemie \TEX),
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten},
%D    suggestions={Tobias Burnus, Dirk Kuypers \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

% option=test    => boxes
%        dummy   => file
%        final   => file / local run
%
% constante van phantom in definitie ONE: \setchemicaltextwidth 300
%
% it would be interesting to rewrite this module with todays
% experiences and new context functionality, mybe ...

% Deze module ondersteunt het zetten van chemische
% (structuur)formules. Hoewel de macro' zijn afgestemd op
% CONTEXT, zijn ze ook buiten deze zetomgeving te gebruiken.
%
% Dit is, afgezien van updates, de definitieve versie van
% PPCHTEX. Gebruikersgemak, eenvoud, flexibiliteit, en
% snelheid zijn inmiddels redelijk geoptimaliseerd. Dit neemt
% niet weg dat hier en daar nog verbetering mogelijk is. Dit
% zal dan ook nog gebeuren.
%
% Volgende versies zullen tenminste dezelfde functionaliteit
% hebben. We houden ons natuurlijk het recht voor de kwaliteit
% van de output te verbeteren. Daarnaast staan nog op het
% wensenlijstje:
%
% -  optimaliseren in termen van proces-tijd
% -  aanpassen naamgeving van interne macro's
% -  toevoegen van functionaliteit
% -  in \x!-vorm omzetten van GIVES, TB enz.
%
% De mix tussen engels en nederlands lijkt soms verwarrend.
% Meestal zijn verborgen macro's engels en zichtbare macro's
% nederlands. Het gebruik van [ ] en { } sluit aan op andere
% Context-macro's. Hetzelfde geldt voor instellingen en
% \start-\stop-constructies.
%
% De schijnbaar overbodige \bgroup-\egroup constructie
% garandeert aansluiting bij de Context-macro's voor het
% plaatsen van figuren, tabellen en andere floats.
%
% Binnen Context worden de macro's geladen met
% \gebruikextras[chemie]. Daarbij wordt een passende melding
% getoont. Buiten Context genereren we een melding:

\doifundefined{usemodule}
 {\writestatus{loading}{Context Chemical Macro's / 1996.3.1}}

% Er kan gebruik worden gemaakt van PiCTeX of PStricks. Een
% van deze pakketten moet van te voren zijn geladen.
%
% \input prepictex.tex (i.g.v. LaTeX)
% \input pictex.tex
% \input postpictex.tex (i.g.v. LaTeX)
%
% of:
%
% \input multido.tex
% \input pstricks.tex
% \input pst-plot.tex
%
% In \CONTEXT\ kan men de modules m-pictex en m-pstricks
% gebruiken. De eerste module laad of efficiente wijze PiCTeX
% en de tweede module koppelt het PSTRICKS kleurmechanisme
% aan dat van \CONTEXT.
%

% PSTricks: {-\chemicalangle} instead of {*0}, which produces
% faulty ps code when \chemicalangle=0

\startcommands dutch english german

   gotochemical:  naarchemie       gotochemical    zurchemie
  setupchemical:  stelchemiein     setupchemical   stellechemieein
  startchemical:  startchemie      startchemical   startchemie
   stopchemical:  stopchemie       stopchemical    stopchemie
 definechemical:  definieerchemie  definechemical  definierechemie
       chemical:  chemie           chemical        chemie
        toptext:  boventekst       toptext         textueber
        bottext:  ondertekst       bottext         textunter
        midtext:  middentekst      midtext         textmitte

\stopcommands

\doifundefined{fiverm}  % In the more recent LaTeX versions
 {\font\fiverm=cmr5 }  % \fiverm is no longer (pre)defined.

\doifdefinedelse{beginpicture}           % PiCTeX
 {\doifdefinedelse{startMPdrawing}
    {\chardef\chemicaldrawingmode=2 }   % MetaPost
    {\chardef\chemicaldrawingmode=0 }}  % raw
 {\doifdefinedelse{psaxes}
    {\chardef\chemicaldrawingmode=1 }   % PSTricks
    {\chardef\chemicaldrawingmode=3 }}  % unknown

\ifcase\chemicaldrawingmode
 \writestatus{ppchtex}{using PiCTeX}
\or
 \writestatus{ppchtex}{using PSTricks (still experimental)}
 \writestatus{ppchtex}{automatic sizing not (yet) supported}
\or
 \writestatus{ppchtex}{using PiCTeX and MetaPost}
\else
 \writestatus{ppchtex}{load PiCTeX (+pre/post) or PSTricks (+pst_plot) first}
 \bgroup
 \read16 to \exit
 \egroup
 \expandafter\endinput
\fi

% De onderstaande help-informatie (%I) kan worden opgeroepen
% in TeXEdit. De daaropvolgende setup-informatie (%S) kan
% nadat zij is uit deze file is gefilterd met TeXUtil, in
% handleidingen worden gebruikt. In deze file opgenomen
% documentatie (%D en %M) kan worden gebruikt voor een
% technische handleiding. Met %T kunnen templates worden
% gedefinieerd voor TeXEdit.

%I n=Chemie
%I c=\stelchemiein,\chemie
%I
%I Chemische formules kunnen worden gezet met behulp van de
%I onderstaande commando's:
%I
%I buiten $ en $$ :
%I
%I   \chemie[segmenten][symbolen]
%I
%I   \startchemie[instellingen]
%I     \chemie...
%I     \chemie...
%I   \stopchemie
%I
%I en binnen $ en $$:
%I
%I   \chemie{}{}
%I
%I Voor tekst, uitleg en voorbeelde verwijzen we vooralsnog
%I naar de handleiding.
%P
%I Het gedrag van de macro's kan worden ingesteld met:
%I
%I   \stelchemiein[breedte=,hoogte=,links=,rechts=,boven=,
%I     onder=,korps=,schaal=,status=,assenstelsel=,kader=,
%I     variant=,optie=,formaat=,tekstformaat=,resolutie=,
%I     offset=,letter=]
%I
%I Structuren kunnen worden voorgedefinieerd met het commando
%I
%I   \definieerchemie[naam]{\chemie...}

%S \startsetup
%S   \command
%S     [\!stelchemiein]
%S   \type
%S     [\c!vars!]
%S   \variable
%S     [\c!breedte]
%S     [\c!number!,\v!passend]
%S     [0]
%S   \variable
%S     [\c!hoogte]
%S     [\c!number!,\v!passend]
%S     [0]
%S   \variable
%S     [\c!links]
%S     [\c!number!]
%S     [0]
%S   \variable
%S     [\c!rechts]
%S     [\c!number!]
%S     [0]
%S   \variable
%S     [\c!boven]
%S     [\c!number!]
%S     [0]
%S   \variable
%S     [\c!onder]
%S     [\c!number!]
%S     [0]
%S   \variable
%S     [\c!resolutie]
%S     [\c!number!]
%S     [\outputresolution]
%S   \variable
%S     [\c!korps]
%S     [10pt,11pt,12pt]
%S     [\bodyfontsize]
%S   \variable
%S     [\c!schaal]
%S     [\v!klein,\v!middel,\v!groot]
%S     [\v!middel]
%S   \variable
%S     [\c!formaat]
%S     [\v!klein,\v!middel,\v!groot]
%S     [\v!groot]
%S   \variable
%S     [\c!tekstformaat]
%S     [\v!klein,\v!middel,\v!groot]
%S     [\v!groot]
%S   \variable
%S     [\c!status]
%S     [\v!start,\v!stop]
%S     [\v!start]
%S   \variable
%S     [\c!kader]
%S     [\v!aan,\v!uit]
%S     [\v!uit]
%S   \variable
%S     [\c!assenstelsel]
%S     [\v!aan,\v!uit]
%S     [\v!uit]
%S   \variable
%S     [\c!optie]
%S     [\v!test]
%S     []
%S   \variable
%S     [\c!variant]
%S     [1,2]
%S     [1]
%S   \variable
%S     [\c!offset]
%S     [HIGH,LOW]
%S     [LOW]
%S   \variable
%S     [\c!letter]
%S     [\c!command!]
%S     [\rm]
%S \stopsetup

%S \startsetup
%S   \command
%S     [\v!startchemie]
%S   \type
%S     [\c!vars!\c!stp!]
%S   \inheritvariable
%S     [\v!stelchemiein]
%S     []
%S \stopsetup

%S \startsetup
%S   \command
%S     [\v!chemie]
%S   \type
%S     [\c!vals!\c!vals!]
%S   \value
%S     [\c!list!]
%S     []
%S   \value
%S     [\c!list!]
%S     []
%S \stopsetup

%S \startsetup
%S   \command
%S     [definieerchemie]
%S   \type
%S     [\c!val!\c!arg!]
%S   \value
%S     [\c!text!]
%S     []
%S \stopsetup

\unprotect

% Om te voorkomen dat sub- en superscripts botsen passen we
% wat fontdimen's aan (Knuth, The TeXBook, p179). Helaas
% kunnen deze instellingen niet lokaal worden gehouden door
% groeperen, vandaar dat een en ander moet worden geset �n
% gereset.
%
% Er dient een relatie te worden gelegd met de afmetingen
% van de letters. In een eerdere versie werden daartoe de
% \fontdimen's opgehoogd. Omdat dit problemen gaf bij
% scaled fonts, is bij nader inzien gekozen voor de
% onderstaande oplossing, waarbij de nieuwe waarden worden
% afgeleid van de x-height (\fontdimen5). De factor 0.70
% is min of meer experimenteel vastgesteld. Soms worden de
% regels iets verder uit elkaar gezet. Jammer. Italic fonts
% hebben grotere cijfers en vallen min of meer uit de boot.

\newif\ifloweredsubscripts

% Due to some upward incompatibality of LaTeX to LaTeX2.09
% and/or LaTeX2e we had to force \@@dochemicalstyle. Otherwise
% some weird \nullfont error comes up.

\def\beginlatexmathmodehack%
 {\ifmmode
    \let\endlatexmathmodehack=\relax
  \else
    \def\endlatexmathmodehack{$}$\@@dochemicalstyle\empty
  \fi}

\def\setsubscripts%
 {\beginlatexmathmodehack
  \def\dosetsubscript##1##2##3%
    {\dimen0=##3\fontdimen5##2%
     \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
     ##1##2=\dimen0\relax}%
  \def\dodosetsubscript##1##2%
    {\dosetsubscript{##1}{\textfont        2}{##2}%
     \dosetsubscript{##1}{\scriptfont      2}{##2}%
     \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
 %\dodosetsubscript{\fontdimen14}{?}%
  \dodosetsubscript{\fontdimen16}{.7}%
  \dodosetsubscript{\fontdimen17}{.7}%
  \global\loweredsubscriptstrue
  \endlatexmathmodehack}

\def\resetsubscripts%
 {\ifloweredsubscripts
    \beginlatexmathmodehack
    \def\doresetsubscript##1##2%
      {\dimen0=\getvalue{@@\string##1\string##2}\relax
       ##1##2=\dimen0}%
    \def\dodoresetsubscript##1%
      {\doresetsubscript{##1}{\textfont2}%
       \doresetsubscript{##1}{\scriptfont2}%
       \doresetsubscript{##1}{\scriptscriptfont2}}%
    %\dodoresetsubscript{\fontdimen14}%
    \dodoresetsubscript{\fontdimen16}%
    \dodoresetsubscript{\fontdimen17}%
    \global\loweredsubscriptsfalse
    \endlatexmathmodehack
  \fi}

\def\doresetsubscripts%
 {\resetsubscripts}

\def\sethighsubscripts%
 {\resetsubscripts
  \let\dosetsubscripts=\relax}

\def\setlowsubscripts%
 {\def\dosetsubscripts{\setsubscripts}}

\setlowsubscripts

\newcount\horchemical % t.z.t. \newcounter
\newcount\verchemical % t.z.t. \newcounter
\newcount\txtchemical % t.z.t. \newcounter
\newcount\levchemical % t.z.t. \newcounter

\newif\ifinchemical            \inchemicalfalse
\newif\iffixedchemical         \fixedchemicalfalse

\newbox\chemicalsymbols

% Eigenlijk moeten de constanten en variabelen in cont-nl.tex
% staan. Dit pakket is echter relatief onafhankelijk van CONTEXT.

\definesystemvariable  {chemical}

\definesystemconstant  {chemical}

\definesystemconstant  {translate}
\definesystemconstant  {distance}
\definesystemconstant  {mirror}
\definesystemconstant  {rotate}
\definesystemconstant  {substitute}
\definesystemconstant  {angle}

\definesystemconstant  {executechemical}
\definesystemconstant  {chemicaltextelement}
\definesystemconstant  {chemicallinesegment}
\definesystemconstant  {chemicalcircsegment}

\def\chemicalspace     {\quad}

% begin van experiment:
%
% De onderstaande twee macro's kunnen worden gebruikt voor
% bijvoorbeeld een interactiemechanisme.
%
% \localgotochemical   {verwijzing} {tekst}
% \localthisischemical {verwijzing}

\def\dowithchemical%
 {}

\doifdefinedelse{@@iastate}
 {\def\localgotochemical#1#2{\naarbox{#2}[#1]}%
  \def\localthisischemical#1{\pagereference[#1]}}
 {\def\localgotochemical#1{}%
  \def\localthisischemical#1{}}

% eind van experiment

\def\setchemicalmaximum #1
 {\def\maxchemical{#1}}

\def\doifchemicalnumber#1#2#3%
 {\doifnumberelse{#1}
    {\ifnum#1>\maxchemical
       \writestatus{ppchtex}{number #1 is skipped}%
     \else
       #3%
     \fi}
    {\unknownchemical{#2}}}%

\newif\ifsmallchemicaltext

\let\@@localchemicalstyle\empty

\def\setupchemicalformat[#1]%
 {\processaction
    [\getvalue{#1\c!size}]
    [  \v!small=>\def\@@localchemicalformat{\scriptscriptstyle},
      \v!medium=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
         \v!big=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
     \s!unknown=>\def\@@localchemicalformat{\getvalue{#1\c!size}}]%
  \processaction
    [\getvalue{#1\c!textsize}]
    [  \v!small=>\def\@@localchemicalstyle{\scriptscriptstyle},
      \v!medium=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
         \v!big=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
     \s!unknown=>\def\@@localchemicalstyle{\getvalue{#1\c!textsize}}]%
  \processaction
    [\getvalue{#1\c!scale}]
    [  \v!small=>\def\@@localchemicalscale{500},
      \v!medium=>\def\@@localchemicalscale{625},
         \v!big=>\def\@@localchemicalscale{750},
     \s!unknown=>\def\@@localchemicalscale{\getvalue{#1\c!scale}}]}

\def\@@currentchemicalformat
 {\ifinchemical
    \@@localchemicalformat
  \else
    \@@localchemicalstyle
  \fi}

\def\dosetupchemical[#1]%
 {\getparameters[\??chemical\s!chemical][#1]%
  \doifelse{\@@chemicalchemicaloffset}{LOW}
    {\setlowsubscripts}
    {\sethighsubscripts}%
  \setupchemicalformat[\??chemical\s!chemical]%
  \ignorespaces}

\def\setupchemical
 {\dosingleargument\dosetupchemical}

\def\@@dochemicalstyle%       % default mapping
 {\@@chemicalstyle}

\def\@@dochemicalcolor%       % no mapping yet
 {}

\def\@@chemicalstyle         %  $inner-style$  % (overloaded)
 {\@@chemicalchemicalstyle} % $$outer-style$$

\def\@@writechemicalstate#1#2%
 {}

\def\@@beginchemicallocalpicture
 {\ifcase\chemicaldrawingmode
    \beginpicture
  \or
    \pspicture(0,0)(0,0) % is this permitted ?
  \or
    \pushMPdrawing
    \startMPdrawing
      %prologues := 1 ;
      %input mp-tool ;
      u := 10*\@@chemicalunit;
      bboxmargin := 0pt ;
      pickup pencircle scaled 2u ; % ???
    \stopMPdrawing
    \beginpicture
  \fi}

\def\@@endchemicallocalpicture#1#2%
 {\ifcase\chemicaldrawingmode
    \endpicture
  \or
    \endpspicture
  \or
    \resetchemicalcoordinates
    \setbox2\hbox{\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
    \wd2=\!!zeropoint
    \ht2=\!!zeropoint
    \dp2=\!!zeropoint
    \put {\box2} at 0 0
    \endpicture
    \popMPdrawing
  \fi}

\def\@@beginchemicalpicture#1#2#3#4%
 {\ifnum\chemicaldrawingmode=1
    \pspicture(#1,#3)(#2,#4)%
    \def\account##1##2{}%
    \psaxes[axesstyle=none,labels=none,ticks=none](#1,#3)(#2,#4)%
  \else
    \beginpicture
    \setplotarea
      x from {#1} to {#2},
      y from {#3} to {#4}
    \iffixedchemical
      \accountingon
      \def\account##1##2%
        {\put {} at {##1} {##2} }%
    \else
      \accountingoff
      \def\account##1##2{}%
    \fi
  \fi
  \ignorespaces}

\def\@@endchemicalpicture%
 {\ifcase\chemicaldrawingmode
    \put {\box\chemicalsymbols} at 0 0 %  elders
    \endpicture
  \or
    \rput(0,0){\box\chemicalsymbols}%
    \endpspicture
  \or
    \put {\box\chemicalsymbols} at 0 0 %  elders
    \ifMPdrawingdone
      \resetchemicalcoordinates
      \setbox2\hbox{\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
      \wd2=\!!zeropoint
      \ht2=\!!zeropoint
      \dp2=\!!zeropoint
      \put {\box2} at 0 0 %
    \fi
    \endpicture
  \fi}

\def\@@setchemicalcoordinatesystem#1%
 {\edef\@@chemicalunit{#1}%
  \ifcase\chemicaldrawingmode
    \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit> %
  \or
    \psset{unit=\@@chemicalunit}%
  \or
    \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit> %
    \startMPdrawing
     %input mp-tool ;
     %prologues := 1 ;
      u := 10*#1;
      bboxmargin := 0pt ;
      pickup pencircle scaled 2u ; % ???
    \stopMPdrawing
  \fi}

\def\@@setchemicalaxis#1#2#3#4%
 {\ifcase\chemicaldrawingmode
    \axis
      bottom shiftedto y=0
      ticks from {#1} to {#2} by 500 /
    \axis
      left shiftedto x=0
      ticks from {#3} to {#4} by 500 / %
  \or
    \psaxes[labels=none,Dx=500,Dy=500](0,0)(#1,#3)(#2,#4)%
  \or
    \global\MPdrawingdonetrue
    \startMPdrawing
       x1 := \MPdivten[#1]u ; x2 := \MPdivten[#2]u;
       y1 := \MPdivten[#3]u ; y2 := \MPdivten[#4]u;
       draw z1--(x2,y1)--z2--(x1,y2)--cycle ;
       d := 50u ; dd := 10u ;
       draw (x1,0)--(x2,0) ;
       draw (0,y1)--(0,y2) ;
       for i=d step -d until x1: draw (i,dd)--(i,-dd) ; endfor ;
       for i=d step  d until x2: draw (i,dd)--(i,-dd) ; endfor ;
       for i=d step -d until y1: draw (-dd,i)--(dd,i) ; endfor ;
       for i=d step  d until y2: draw (-dd,i)--(dd,i) ; endfor ;
    \stopMPdrawing
  \fi}

\def\@@setsecondchemicalplotsymbol%
 {\ifcase\chemicaldrawingmode
    \!!widtha=50.8mm
    \divide\!!widtha by \@@chemicalresolution\relax
    \plotsymbolspacing=\!!widtha
    \setplotsymbol({\vrule\!!height\!!widtha\!!width\!!widtha})%
  \fi}

% Something for Dirk:

\newcount \currentchemical

%\newif    \ifskipchemical

\def\setchemicaldimensions#1#2#3%
 {\bgroup
  \global\advance\currentchemical by 1
  \dimen0=#1\relax
  \dimen2=#2\relax
  \dimen4=#3\relax
  \setxvalue{chemical::\the\currentchemical}%
    {\noexpand\docommando{\the\dimen0}{\the\dimen2}{\the\dimen4}}%
  \egroup}

%\def\getchemicaldimensions#1#2#3%
%  {\global\advance\currentchemical by 1
%   \def\docommando##1##2##3%
%     {#1=##1\relax#2=##2\relax#3=##3\relax}%
%   \doifdefinedelse{chemical::\the\currentchemical}
%     {\getvalue{chemical::\the\currentchemical}}
%     {\docommando{6cm}{4cm}{0cm}}}
%
%\def\savechemicaldimensions%
%  {\bgroup
%   \writestatus{ppchtex}{saving dimensions in ppchtex.dim}%
%   \def\docommando##1##2##3%
%     {\immediate\write\scratchwrite
%        {\noexpand\setchemicaldimensions{##1}{##2}{##3}}}%
%   \immediate\openout\scratchwrite=ppchtex.dim
%   \scratchcounter=0
%   \loop
%     \ifnum\scratchcounter<\currentchemical
%       \advance\scratchcounter by 1
%       \getvalue{chemical::\the\scratchcounter}%
%   \repeat
%   \immediate\closeout\scratchwrite
%   \egroup}
%
%\def\loadchemicaldimensions% oh, how nice it would be to use
%  {\bgroup                 % one of the context read commands
%   \global\currentchemical=0
%   \immediate\openin\scratchread=./ppchtex.dim
%   \ifeof\scratchread
%     \immediate\closein\scratchread
%     \global\skipchemicalfalse
%   \else
%     \immediate\closein\scratchread
%     \input ./ppchtex.dim\relax
%     \ifnum\currentchemical>0
%       \writestatus{ppchtex}{loading dimensions from ppchtex.dim}%
%       \global\skipchemicaltrue
%     \else
%       \global\skipchemicalfalse
%     \fi
%     \global\currentchemical=0
%     \global\let\savechemicaldimensions=\relax
%   \fi
%   \egroup
%   \global\let\loadchemicaldimensions=\relax}

\ifx\normalchemicalframe\undefined
 \let\normalchemicalframe\hbox % hook for educational purposes
\fi

\unexpanded\def\complexstartchemical[#1]%
 {\copyparameters
    [\??chemical][\??chemical\s!chemical]
    [\c!width,\c!height,\c!left,\c!right,\c!top,\c!bottom,
     \c!bodyfont,\c!size,\c!scale,\c!state,\c!frame,\c!axis,
     \c!location,\c!option,\c!alternative,\c!resolution,\c!offset,\c!style,
     \c!color,\c!rulecolor,\c!rulethickness]%
  \getparameters
    [\??chemical]
    [#1]%
  %
  \setupchemicalformat[\??chemical]%
  %
  \ifnum\chemicaldrawingmode=2
    \resetMPdrawing
  \fi
  %
  \doif{\@@chemicalalternative}{2}
    {\@@setsecondchemicalplotsymbol}%
  %
  \doif{\@@chemicalaxis}\v!on
    {\let\chemicalframe\hbox}%
  %
  \!!counta=250000
  \divide\!!counta by \@@localchemicalscale
  \!!widtha=\@@chemicalbodyfont
  \divide\!!widtha by \!!counta
  \@@setchemicalcoordinatesystem{\the\!!widtha}%
  %
  % \!!counta = -x     \!!countc = -y
  % \!!countb = +x     \!!countd = +y
  %
  \def\calculateaxis##1##2##3##4##5%
    {##1=##3\relax
     ##2=##4\relax
     \ifnum##5=0
       \ifnum##3=0
         \ifnum##4=0
           ##1=2000
           ##2=2000
          \fi
       \fi
     \else
       \ifnum##3=0
         \ifnum##4=0
           ##1=##5\relax
           \divide##1 by 2
           ##2=##1\relax
         \else
           ##1=##5\relax
           \advance##1 by -##2\relax
         \fi
       \else
         \ifnum##4=0
           ##2=##5\relax
           \advance##2 by -##1\relax
         \fi
       \fi
     \fi}%
  \fixedchemicalfalse
  \doif\@@chemicalwidth\v!fit
    {\edef\@@chemicalwidth
       {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}%
     \fixedchemicaltrue}%
  \doif\@@chemicalheight\v!fit
    {\edef\@@chemicalheight
       {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}%
     \fixedchemicaltrue}%
  \doifelse\@@chemicallocation\v!intext
    {\!!counta=0 \!!countb=0
     \!!counta=0 \!!countd=0 }
    {\calculateaxis
       \!!counta\!!countb
       \@@chemicalleft\@@chemicalright\@@chemicalwidth
     \calculateaxis
       \!!countc\!!countd
       \@@chemicalbottom\@@chemicaltop\@@chemicalheight}%
  %
  \edef\@@chemheight   {\the\!!countc}%
  \edef\@@chemdepth    {\the\!!countd}%
  \edef\@@chemicaltop{\the\!!countc}%
  \edef\@@chemicalbottom{\the\!!countd}%
  %
  \doifinsetelse\v!on{\@@chemicalframe,\@@chemicalaxis}
    {\def\@@chemicalborder{\chemicalframe}}
    {\def\@@chemicalborder{\normalchemicalframe}}%
  %
  \setbox0=\hbox\bgroup    % this was a \vbox which took \hsize
  %
  \@@beginchemicalpicture
    {-\the\!!counta}{\the\!!countb}
    {-\the\!!countc}{\the\!!countd}%
  \doif{\@@chemicalstate}\v!start
    {\doif\@@chemicalaxis\v!on
       {\@@setchemicalaxis
          {-\the\!!counta}{\the\!!countb}
          {-\the\!!countc}{\the\!!countd}}}%
  \doifelse\@@chemicaloption\v!test
    {\def\@@writechemicalstate##1##2%
       {\convertargument##2\to\ascii
        \writestatus{##1}{\ascii}}}
    {\def\@@writechemicalstate##1##2{}}%
  \ignorespaces}

\def\dostartchemical%
 {\catcode`\^=\@@superscript% t.b.v. \enableduplication
  \catcode`\_=\@@subscript  % t.b.v. de zekerheid
  \begingroup
  \inchemicaltrue
  \def\toptext##1{\gdef\thetoptext{##1}\ignorespaces}\toptext{}%
  \def\bottext##1{\gdef\thebottext{##1}\ignorespaces}\bottext{}%
  \def\midtext##1{\gdef\themidtext{##1}\ignorespaces}\midtext{}%
  \def\@@chemicalpostponed{}%
  \complexorsimpleempty\startchemical}

\def\startchemical%
 {\bgroup % t.b.v. ungrouped floats
%   \loadchemicaldimensions
%   \ifskipchemical
%     \def\dostartchemical%
%       {\def\dummy[####1]{}\dosingleempty\dummy}%
%     \def\chemical%
%       {\def\dummy[####1][####2][####3]{}\dotripleempty\dummy}%
%     \def\toptext##1{}%
%     \def\midtext##1{}%
%     \def\bottext##1{}%
%   \fi
  \dostartchemical}

\def\stopchemical%
 {%\ifskipchemical
  %  \getchemicaldimensions{\dimen0}{\dimen2}{\dimen4}%
  %  \dimen8=\dimen2\advance\dimen8 by \dimen4
  %  \setbox0=\vbox to \dimen8
  %    {\vss\hbox to \dimen0{\hss\the\currentchemical\hss}\vss}%
  %  \wd0=\dimen0\ht0=\dimen2\dp0=\dimen4
  %  \chemicalframe{\box0}%
  %\else
    \checkchemicalpicture
    \@@endchemicalpicture
    \egroup
    \ifnum\chemicaldrawingmode=1
      \dimen0=\@@chemicalunit
      \setbox0=\hbox{\lower\@@chemdepth\dimen0\box0}%
      \ht0=\@@chemheight\dimen0
      \dp0=\@@chemdepth\dimen0
    \fi
    \dimen0=\ht0
    \advance\dimen0 by \dp0
    \inchemicalfalse % enables \chemie{} in text
    \setbox4=\alignedchemical\themidtext
    \setbox6=\alignedchemical\thetoptext
    \setbox8=\alignedchemical\thebottext
    \setbox4=\hbox to \wd0
      {\strut\hss$\vcenter{\box4}$\hss}%
    \setbox2=\vbox to \dimen0
      {\hbox to \wd0{\strut\hss\box6\hss}
       \vfill
       \hbox to \wd0{\strut\hss\box8\hss}
       \vss}% disables the depth
    \wd0=0pt  \wd4=0pt
    \ht2=\ht0 \dp2=\dp0
    \ht4=\ht0 \dp4=\dp0
   %\setchemicaldimensions{\wd2}{\ht2}{\dp2}%
    \@@chemicalborder{\box0\box4\box2}% text on top of chemicals
    \endgroup
  %\fi
  \ignorespaces
  \egroup}                  % t.b.v. ungrouped floats

\def\alignedchemical#1%
 {\vtop
    {\def\par{\egroup\hbox\bgroup\strut}%
     \let\\=\par
     \let\endgraf=\par
     \hbox\bgroup\strut#1\egroup}}

% \setchemicalcoordinates{#1}{#2}
%
% #1: verplaatsing in x-richting
% #2: verplaatsing in y-richting

\newif\ifchemicaldirection

\def\checkchemicaldirection#1#2%
 {\ifchemicaldirection
    \ifnum#1>0 \advance\horchemical -\chemicaldirection \fi
    \ifnum#1<0 \advance\horchemical +\chemicaldirection \fi
    \ifnum#2>0 \advance\verchemical -\chemicaldirection \fi
    \ifnum#2<0 \advance\verchemical +\chemicaldirection \fi
    \chemicaldirectionfalse
  \fi}

\def\processchemicaldirection%
 {\chemicaldirectiontrue\processchemicaltranslate}

\def\setchemicalcoordinates#1#2%
 {\advance\horchemical #1\relax
  \advance\verchemical #2\relax
  \checkchemicaldirection{#1}{#2}%
  \!!counta=-\horchemical\edef\chemicalxoffset{\the\!!counta}%
  \!!countb=-\verchemical\edef\chemicalyoffset{\the\!!countb}%
  \ifnum\chemicaldrawingmode=1
    % njet
  \else
    \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
  \fi}

\def\resetchemicalcoordinates%
 {\horchemical=0
  \verchemical=0
  \edef\chemicalxoffset{0}%
  \edef\chemicalyoffset{0}%
  \ifnum\chemicaldrawingmode=1
    % njet
  \else
    \setcoordinatesystem point at 0 0
  \fi}

\def\restorechemicalcoordinates%
 {%\writestatus{ppchtex}{restoring \the\horchemical,\the\verchemical}%
  \edef\chemicalxoffset{\the\horchemical}%
  \edef\chemicalyoffset{\the\verchemical}%
  \ifnum\chemicaldrawingmode=1
    % njet
  \else
    \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
  \fi}

\def\setchemicaltranslate #1 #2 #3
 {\setvalue{\s!translate#1}{\setchemicalcoordinates{#2}{#3}}}

\def\processchemicaltranslate#1%
 {\def\doprocess[##1##2]%
    {\doifchemicalnumber{##1}{MOV#1}
       {\ifnum##1=0
          \def\chemicaloffset{0}% incompatible change
          \resetchemicalcoordinates
        \else
          \getvalue{\s!translate##1}%
          \dochemicaloffset{##1}%
          \def\chemicaloffset{0}%
        \fi}}%
  \doprocess[#1]}

\def\setchemicaldistance #1
 {\setvalue{\s!distance1}{\setchemicalcoordinates{-#1}{  0}}%
  \setvalue{\s!distance2}{\setchemicalcoordinates{  0}{ #1}}%
  \setvalue{\s!distance3}{\setchemicalcoordinates{ #1}{  0}}%
  \setvalue{\s!distance4}{\setchemicalcoordinates{  0}{-#1}}}

\def\setchemicaldirection #1
 {\def\chemicaldirection{#1}}

\def\processchemicaldistance#1%
 {\def\doprocess[##1##2]%
    {\doifchemicalnumber{##1}{ADJ#1}
       {\ifnum##1=0
          \resetchemicalcoordinates
        \else
          \def\@@chemicalpostponed{\getvalue{\s!distance##1}}%
          \@@chemicalpostponed
        \fi}}%
  \doprocess[#1]}

\def\setchemicalsubstitute #1
 {\setvalue{\s!substitute1}{\setchemicalcoordinates{-#1}{  0}}%
  \setvalue{\s!substitute2}{\setchemicalcoordinates{  0}{ #1}}%
  \setvalue{\s!substitute3}{\setchemicalcoordinates{ #1}{  0}}%
  \setvalue{\s!substitute4}{\setchemicalcoordinates{  0}{-#1}}}

\def\processchemicalsubstitute#1%
 {\def\doprocess[##1##2]%
    {\doifchemicalnumber{##1}{SUB#1}
       {\ifnum##1=0
          \resetchemicalcoordinates
        \else
          \def\@@chemicalpostponed{\getvalue{\s!substitute##1}}%
          \@@chemicalpostponed
        \fi}}%
  \doprocess[#1]}

% Het is mogelijk een offset of move meerdere malen uit te
% voeren, door een nummer voor het commando te plaatsen.

\def\chemicalrepeat       {1}

\def\redoprocesschemical[#1#2]%
 {\doifinstringelse{#1}{0123456789.}
    {\edef\chemicalrepeat{\chemicalrepeat#1}%
     \redoprocesschemical[#2]}
    {\processchemical[#1#2]%
     \def\chemicalrepeat{1}}}

\def\doprocesschemical[#1#2]#3%
 {\doifinstringelse{#1}{0123456789.}
    {\def\chemicalrepeat{#1}%
     \redoprocesschemical[#2]}
    {#3}}

% \dochemicaloffset{#1}
%
% #1: binding

\def\chemicaloffset{0}

\def\processchemicaloffset#1%
 {\dimen0=62500 sp  % real calc on cardinals, funny number
  \dimen0=\chemicalrepeat\dimen0
  \divide\dimen0 by \@@localchemicalscale
  \!!counta=\dimen0
  \def\doprocess[##1##2]%
    {\doifinstringelse{##1}{128}
       {\edef\chemicaloffset{\the\!!counta}}
       {\doifinstringelse{##1}{456}
          {\edef\chemicaloffset{-\the\!!counta}}
          {\doifelse{##1}{0}
             {\edef\chemicaloffset{0}}
             {\unknownchemical{OFF#1}}}}}%
  \doprocess[#1]}

\def\dochemicaloffset#1%
 {\ifnum\chemicaloffset=0
    \def\undochemicaloffset{}%
  \else
    \setchemicalcoordinates{-\chemicaloffset}{0}%
    \def\undochemicaloffset%
      {\setchemicalcoordinates{\chemicaloffset}{0}%
       \def\undochemicaloffset{}}%
  \fi}

\def\processchemicalphantom#1#2%
 {\setbox0=\hbox
    {\def\splitoff##1????{##1}%
     $\@@dochemicalstyle{\@@localchemicalformat\splitoff#2}$}%
  \dimen0=.25\wd0
  \divide\dimen0 by \@@localchemicalscale
  \!!counta=\dimen0
  \doifinstringelse{#1}{128}
    {\edef\chemicaloffset{\the\!!counta}}
    {\doifinstringelse{#1}{456}
       {\edef\chemicaloffset{-\the\!!counta}}
       {\doifelse{#1}{0}
          {\edef\chemicaloffset{0}}
          {\unknownchemical{OF#1:#2}}}}}

% \dosetchemicalrotation{#1}{#2}
%
% #1: cos(phi)
% #2: sin(phi)

\def\chemicalrotation   {1}
\def\chemicalangle      {0}
\def\chemicalxoffset    {0}
\def\chemicalyoffset    {0}

\def\setchemicalmirror#1%
 {\setvalue{\s!mirror#1}{*}}

\def\resetchemicalmirror#1%
 {\resetvalue{\s!mirror#1}}

\def\togglechemicalmirror#1%
 {\doifelse{\getvalue{\s!mirror#1}}{*}
    {\resetchemicalmirror{#1}}
    {\setchemicalmirror{#1}}}

\def\setchemicalrotation #1 #2 #3 #4 #5 #6 #7 #8 #9
 {\setvalue{\s!rotate1.#1}{\dosetchemicalrotation{#2}{#3}}%
  \setvalue{\s!rotate2.#1}{\dosetchemicalrotation{#4}{#5}}%
  \setvalue{\s!rotate3.#1}{\dosetchemicalrotation{#6}{#7}}%
  \setvalue{\s!rotate4.#1}{\dosetchemicalrotation{#8}{#9}}}

\def\setchemicalangle #1 #2 #3 #4 #5
 {\setvalue{\s!angle1.#1}{\dosetchemicalangle{#2}}%
  \setvalue{\s!angle2.#1}{\dosetchemicalangle{#3}}%
  \setvalue{\s!angle3.#1}{\dosetchemicalangle{#4}}%
  \setvalue{\s!angle4.#1}{\dosetchemicalangle{#5}}}

\def\chemicalrotate[#1]%
 {\doifdefinedelse{\s!mirror#1}
    {\getvalue{\s!rotate\chemicalrotation.#1\getvalue{\s!mirror#1}}%
     \getvalue{\s!angle\chemicalrotation.#1\getvalue{\s!mirror#1}}}
    {\getvalue{\s!rotate\chemicalrotation.#1}%
     \getvalue{\s!angle\chemicalrotation.#1}}}

\def\dosetchemicalangle#1%   zwak zie onder
 {\def\chemicalangle{#1}}

\def\dosetchemicalrotation#1#2%
 {\ifnum\chemicaldrawingmode=1
    % njet
  \else
    \startrotation by {#1} {#2} %% \stoprotation (t.b.v. testen)
  \fi}

\def\doresetchemicalrotation
 {\ifnum\chemicaldrawingmode=1
    % njet
  \else
    \stoprotation
  \fi}

\def\processchemicalrotation#1%
 {\def\doprocess[##1##2]%
    {\doifnumberelse{##1}
       {\def\chemicalrotation{##1}}
       {\unknownchemical{ROT#1}}}%
  \doprocess[#1]}

% \filtertextelement[#1][#2][#3][#4]
%
% #1: volgnummer
% #2: offset in uitlijningen
% #3: lijst met uitlijningen -> \chemicalloca
% #4: lijst met teksten      -> \chemicaltext

\def\setchemicallocation#1%
 {\doifelse{#1}{}
    {\edef\chemicalloca{c}}
    {\edef\chemicalloca{#1}}}

\newif\iffixedchemicaltext

\def\filterchemicaltextelement[#1][#2][#3][#4]%
 {\ifchemicaltextconstant
    \def\chemicaltext{#4}%
    \setchemicallocation{}%
  \else
    \ifnum#1=0\relax
      \setchemicallocation{}%
    \else
      \iffixedchemicaltext
        \!!counta#2
      \else
        \!!counta=\chemicalrotation
        \advance\!!counta -1
        \multiply\!!counta #2
        \advance\!!counta #1
      \fi
      \getfromcommalist[#3][\the\!!counta]%
      \setchemicallocation\commalistelement
    \fi
    \ifchemicalpicture
      \let\chemicaltext\relax
    \else
      \advance\txtchemical 1
      \getfromcommalist[#4][\txtchemical]%
      \let\chemicaltext\commalistelement
    \fi
  \fi
  \fixedchemicaltextfalse}

% \putchemicaltext{#1}{#2}
%
% #1 : x-coordinaat
% #2 : y-coordinaat
%
% \chemicaltext en \chemicalloca worden met \gettextelement
% opgehaald uit de tweede set bij \chemie
%
% Ten behoeve van testdoeleinden wordt gebruik gemaakt van
% \chemicalframe in plaats van het meer sjieke, maar tevens
% meer trage \framed.

\ifx\ruledhbox\undefined
 \def\chemicalframe#1%
    {\hbox
       {\vrule\hskip-.4pt
        \vbox{\hrule\vskip-.4pt\hbox{#1}\vskip-.4pt\hrule}%
        \hskip-.4pt\vrule}}
\else
 \def\chemicalframe#1%
   {\ruledhbox{#1}}
\fi

\def\doputchemicaltext#1 [#2] at #3 #4 %
 {\ifnum\chemicaldrawingmode=1
    \rput
      {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
      {\expanded{\rput[#2]{\chemicalangle}(#3,#4){#1}}}%
  \else
    \put {#1} [#2] at {#3} {#4} %
  \fi}

\def\dodoifsinglelocation#1#2\\#3%
 {\ifx#2\relax#3\fi}

\def\doifsinglelocationelse#1%
 {\expandafter\dodoifsinglelocationelse#1\relax\\}

\def\putchemicaltext#1#2%
 {\enablechemicalspecials
  \ifchemicalpicture
    \setchemicalpicture{#1}{#2}%
  \else
    \doifelse\@@chemicaloption\v!test
      {\def\@@chemicalframe{\chemicalframe}}
      {\def\@@chemicalframe{}}%
    \dosetsubscripts
    \setbox2=\hbox{$\@@dochemicalstyle{\@@localchemicalformat \chemicaltext}$}%
    \setbox4=\hbox{$\@@dochemicalstyle{\@@localchemicalformat C_2^2}$}%
    \setbox6=\hbox{$\@@dochemicalstyle{\@@localchemicalformat O}$}% or C
    \doresetsubscripts
    \doifnot\@@chemicallocation\v!intext
      {\ht2=\ht4
       \dp2=\dp4}%
    \setbox2=\hbox{\@@chemicalframe{\@@dochemicalcolor\box2}}%
    \ifdim\wd2>\wd6
      \doifelse{#1}{0}
        {\doifnot{#2}{0}{\wd2=\wd6}}
        {%\doifsinglelocation\chemicalloca
           {\doifinset{\chemicalloca}{t,b}{\wd2=\wd6}}}% common ?
    \fi
    \expanded
      {\doputchemicaltext
         {\noexpand\dowithchemical{\copy2}}     % per se \copy2 i.p.v. \box2
         [\chemicalloca] at {#1} {#2} }
    \nomoreaccounting
  \fi
  \disablechemicalspecials}

\def\setchemicaltextelement #1 #2 #3
 {\setvalue{\s!chemicaltextelement#1}{\putchemicaltext{#2}{#3}}}

\def\getchemicalfixedtextelement%
 {\fixedchemicaltexttrue
  \getchemicaltextelement}

\def\getchemicaltextelement[#1][#2][#3][#4][#5]%
 {\filterchemicaltextelement[#2][#3][#4][#5]%
  \doifelse{#2}{0}
    {\dochemicaloffset{#2}%     % incompatible change
     \putchemicaltext{0}{0}%
     \undochemicaloffset}       % incompatible change
    {\chemicalrotate[#2]%
     \dochemicaloffset{#2}%
     \def\chemicaltextelementnumber{#2}%
     \getvalue{\s!chemicaltextelement#1}%
     \getvalue{\s!chemicaltextelement#11}%
     \getvalue{\s!chemicaltextelement#12}%
     \getvalue{\s!chemicaltextelement#13}%
     \undochemicaloffset}}

\def\processchemicaltextelement#1#2#3#4#5%
 {\def\doprocess[##1##2##3##4##5]%
    {\doifelse{##1}{?}
       {\doprocess[1..\maxchemical ????]}
       {\doifchemicalnumber{##1}{#1#2}
          {\doifelse{##2##3}{..}
             {\doifchemicalnumber{##4}{#1#2}
                {\getchemicaltextelement[#1][##1][#4][#5][#3]%
                 \doifnot{##1}{##4}
                   {\!!counta=##1\relax
                    \advance\!!counta by 1
                    \edef\nextsegment{\the\!!counta}%
                    \doprocess[\nextsegment..##4##5]}}}
             {\getchemicaltextelement[#1][##1][#4][#5][#3]%
              \doifnot{##2}{?}{\doprocess[##2##3##4##5]}}}}}%
  \doprocess[#2]%
  \smallchemicaltextfalse}

\def\processchemicalsmalltextelement%
 {\smallchemicaltexttrue\processchemicaltextelement}

\def\processchemicalsmalltextconstant%
 {\smallchemicaltexttrue\processchemicaltextconstant}

\def\processchemicalunrotatedtextelement#1#2#3#4#5#6%
 {\bgroup
  \xdef\@@xxx{0}%
  \xdef\@@yyy{0}%
  \def\putchemicaltext##1##2%
    {\xdef\@@xxx{##1}%
     \xdef\@@yyy{##2}}%
  \getvalue{\s!chemicaltextelement#1}%
  \egroup
  \bgroup
  \def\doputchemicaltext##1 [##2] at ##3 ##4 %
    {\ifnum\chemicaldrawingmode=1
       \rput
         {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
         {\rput{\chemicalangle}(\@@xxx,\@@yyy){\expanded{\rput[##2](##3,##4){##1}}}}%
     \else
       \put
         {\stoprotation \setcoordinatesystem point at 0 0
          \expanded{\put {##1} [##2] at {##3} {##4} }}
         at {\@@xxx} {\@@yyy}
     \fi}%
  \processchemicaltextelement{#2}{#3}{#4}{#5}{#6}%
  \egroup}

\newif\ifchemicaltextconstant

\def\processchemicaltextconstant#1#2#3#4%
 {\chemicaltextconstanttrue
  \let\@@oldchemicalframe\@@chemicalframe
  \let\@@chemicalframe\relax
  \processchemicaltextelement{#1}{#2}{#3}{#4}{}%
  \let\@@chemicalframe\@@oldchemicalframe
  \chemicaltextconstantfalse}

% \plotchemicalline{#1}{#2}{#3}{#4}
%
% #1: x-coordinaat beginpunt
% #2: y-coordinaat beginpunt
% #3: x-coordinaat eindpunt
% #4: y-coordinaat eindpunt

\chardef\chemicallinetype=0

\def\doplotchemicalline%
 {\!!counte=\!!countc \advance\!!counte by -\!!counta
  \!!countf=\!!countd \advance\!!countf by -\!!countb
  \bgroup
  \ifcase\chemicaldrawingmode
    \ifcase\chemicallinetype
    % 0 : normal line
      \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /%
    \or
    % 1 : normal arrow
      \arrow <5pt> [.2,.67] from {\!!counta} {\!!countb} to {\!!countc} {\!!countd}
    \or
    % 2 : reverse arrow
      \arrow <5pt> [.2,.67] from {\!!countc} {\!!countd} to {\!!counta} {\!!countb}
    \or
    % 3 : unrotated line
      \put {\stoprotation \setcoordinatesystem point at 0 0
            \plot 0 0 {\!!counte} {\!!countf} /}
           [\chemicallineposition] at {\!!counta} {\!!countb}
    \else
    % 4 : dashed line
      \findlength {\plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /}%
      \setdashesnear <2pt> for <\totalarclength>%
      \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} /%
    \fi
  \or
    \ifcase\chemicallinetype
      \rput
        {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
        {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
    \or
      \rput
        {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
        {\psline{->}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
    \or
      \rput
        {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
        {\psline{<-}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
    \or
      \rput
        {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
        {\expanded{\rput[\chemicallineposition]{-\chemicalangle}%
           (\!!counta,\!!countb){\psline(0,0)(\!!counte,\!!countf)}}}%
    \else
      \psset{linestyle=dashed}%
      \rput
        {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
        {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
    \fi
  \or
    \global\MPdrawingdonetrue
    \setchemicalattributes
    \startMPdrawing
       x0 := \MPdivten[\chemicalxoffset]u ;
       y0 := \MPdivten[\chemicalyoffset]u ;
       x1 := \MPdivten[\the\!!counta]u ;
       y1 := \MPdivten[\the\!!countb]u ;
       x2 := \MPdivten[\the\!!countc]u ;
       y2 := \MPdivten[\the\!!countd]u ;
       x3 := \MPdivten[\the\!!counte]u ;
       y3 := \MPdivten[\the\!!countf]u ;
       \ifcase\chemicallinetype
       % 0 : normal line
         draw ((z1--z2) rotatedaround(origin,-\chemicalangle))
           shifted z0 ;
       \or
       % 1 : normal arrow
         drawarrow ((z1--z2) rotatedaround(origin,-\chemicalangle))
           shifted z0 ;
       \or
       % 2 : reverse arrow
         drawarrow ((z2--z1) rotatedaround(origin,-\chemicalangle))
           shifted z0 ;
       \or
       % 3 : unrotated line  % nog \chemicalineposition: t/b
         draw (origin--z3)
           shifted (z1 rotatedaround(origin,-\chemicalangle))
           shifted z0 ;
       \else
       % 4 : dashed line
         draw ((z1--z2) rotatedaround(origin,-\chemicalangle))
%           shifted z0 dashed evenly ;
           shifted z0 dashed dashpattern(on 5.5u off 6u) ;
      \fi
    \stopMPdrawing
  \fi
  \egroup
  \account\!!counta\!!countb
  \account\!!countc\!!countd}

\def\plotchemicalline#1#2#3#4%
 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
  \doplotchemicalline}

\def\plotchemicalzline#1#2#3#4%
 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
  \ifnum\chemicaldrawingmode=2
    \global\MPdrawingdonetrue
    \setchemicalattributes
    \startMPdrawing
       x0 := \MPdivten[\chemicalxoffset]u ;
       y0 := \MPdivten[\chemicalyoffset]u ;
       x1 := \MPdivten[\the\!!counta]u ;
       y1 := \MPdivten[\the\!!countb]u ;
       x2 := \MPdivten[\the\!!countc]u ;
       y2 := \MPdivten[\the\!!countd]u ;
       filldraw ((
       \ifnum\chemicalangle>180
         z1--z2
       \else\ifnum\chemicalangle<90
         z1--(z2 shifted (-2u,+2u))--(z2 shifted (+2u,-2u))
       \else\ifnum\chemicalangle=90
         (z1 shifted (-2u,+2u))--(z1 shifted (+2u,-2u))--
         (z2 shifted (+2u,+2u))--(z2 shifted (-2u,-2u))
       \else
         (z1 shifted (+2u,+2u))--(z1 shifted (-2u,-2u))--z2
       \fi\fi\fi
       --cycle) rotatedaround(origin,-\chemicalangle)) shifted z0 ;
    \stopMPdrawing
  \else
    \doplotchemicalline
    \ifnum\chemicalangle>180 \else
      \ifnum\chemicalangle=90
         \advance\!!counta by -20 \advance\!!countc by -20
         \doplotchemicalline
         \advance\!!counta by  40 \advance\!!countc by  40
       \else\ifnum\chemicalangle<90
         \advance\!!countc by -20 \advance\!!countd by +20
         \doplotchemicalline
         \advance\!!countc by +40 \advance\!!countd by -40
       \else
         \advance\!!counta by  20 \advance\!!countb by  20
         \doplotchemicalline
         \advance\!!counta by -40 \advance\!!countb by -40
       \fi\fi
    \fi
    \doplotchemicalline
  \fi}

\def\plotchemicaldeltaline#1#2#3#4%
 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
  \ifnum\chemicaldrawingmode=2
    \global\MPdrawingdonetrue
    \setchemicalattributes
    \startMPdrawing
       x0 := \MPdivten[\chemicalxoffset]u ;
       y0 := \MPdivten[\chemicalyoffset]u ;
       x1 := \MPdivten[\the\!!counta]u ;
       y1 := \MPdivten[\the\!!countb]u ;
       x2 := \MPdivten[\the\!!countc]u ;
       y2 := \MPdivten[\the\!!countd]u ;
       filldraw ((z1--(z2 rotatedaround(z1,5))--(z2 rotatedaround(z1,-5))
                  --cycle) rotatedaround(origin,-\chemicalangle))
         shifted z0 ;
    \stopMPdrawing
    \account{#1}{#2}%
    \account{#3}{#4}%
  \else
    \doplotchemicalline
    \advance\!!countc by  16 \advance\!!countd by -21
    \doplotchemicalline
    \advance\!!countc by  -4 \advance\!!countd by   7
    \doplotchemicalline
    \advance\!!countc by  -4 \advance\!!countd by   7
    \doplotchemicalline
    \advance\!!countc by  -8 \advance\!!countd by  14
    \doplotchemicalline
    \advance\!!countc by  -4 \advance\!!countd by   7
    \doplotchemicalline
    \advance\!!countc by  -4 \advance\!!countd by   7
    \doplotchemicalline
    \advance\!!countc by  -4 \advance\!!countd by   7
    \doplotchemicalline
  \fi}

\def\setchemicallinesegment #1 #2 #3 #4 #5
 {\setvalue{\s!chemicallinesegment#1}{\plotchemicalline{#2}{#3}{#4}{#5}}}

\def\getchemicallinesegment[#1][#2]%
 {\chemicalrotate[#1]%
  \dochemicaloffset{#1}%
  \getvalue{\s!chemicallinesegment#2}%
  \getvalue{\s!chemicallinesegment#21}%
  \getvalue{\s!chemicallinesegment#22}%
  \undochemicaloffset}

\def\getprivatechemicallinesegment[#1][#2]%
 {\chemicalrotate[#1]%
  \getvalue{\s!chemicallinesegment#2#1}}

\def\doprocesschemicallinesegment#1#2#3#4#5%
 {\chardef\chemicallinetype=#1
  \def\chemicallineposition{#2}%
  \def\doprocess[##1##2##3##4##5]%
    {\doifelse{##1}{?}
       {\doprocess[1..\maxchemical ????]}
       {\doifchemicalnumber{##1}{#4#5}
          {\doifelse{##2##3}{..}
             {\doifchemicalnumber{##4}{#4#5}
                {#3[##1][#4]%
                 \doifnot{##1}{##4}
                   {\!!counta=##1\relax
                    \advance\!!counta by 1
                    \edef\nextsegment{\the\!!counta}%
                    \doprocess[\nextsegment..##4##5]}}}
             {#3[##1][#4]%
              \doifnot{##2}{?}
                {\doprocess[##2##3##4##5]}}}}}%
  \doprocess[#5]}

\def\processchemicallinesegment%
 {\doprocesschemicallinesegment0c\getchemicallinesegment}

\def\processchemicalzlinesegment#1#2%
 {%\doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
  \bgroup
  \def\plotchemicalline{\plotchemicalzline}%
  \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
  \egroup}

\def\processchemicaldeltalinesegment#1#2%
 {%\doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
  \bgroup
  \def\plotchemicalline{\plotchemicaldeltaline}%
  \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}%
  \egroup}

\def\processprivatechemicallinesegment%
 {\doprocesschemicallinesegment0c\getprivatechemicallinesegment}

\def\processchemicaldownarrowsegment%
 {\doprocesschemicallinesegment1c\getchemicallinesegment}

\def\processchemicaluparrowsegment%
 {\doprocesschemicallinesegment2c\getchemicallinesegment}

\def\processchemicalunrotatedlinesegment#1%
 {\doprocesschemicallinesegment3{#1}\getchemicallinesegment}

\def\processchemicaldashedlinesegment%
 {\doprocesschemicallinesegment4c\getchemicallinesegment}

\def\processchemicalopenend#1#2%
 {\doprocesschemicallinesegment0c\doprocesschemicalopenend{#1}{#2}}

\def\doprocesschemicalopenend[#1][#2]%
 {\chemicalrotate[#1]%
  \dochemicaloffset{#1}%
  \ifcase\chemicaldrawingmode
    \beginpicture
    \setquadratic\plot
      300 0  400   0
      500 0  550  75
      600 0  650 -75
      700 0  750  75
      800 0  850 -75
      900 0  950   0
            1050   0 /
    \endpicture
  \or
    \rput{-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
      {\psline(300,0)(500,0)%
       \rput(500,0){\psplot[yunit=75,plotstyle=curve]{0}{720}{x sin}}%
       \psline(950,0)(1050,0)}%
  \or
    \global\MPdrawingdonetrue
    \setchemicalattributes
    \startMPdrawing
      x0 := \MPdivten[\chemicalxoffset]u ;
      y0 := \MPdivten[\chemicalyoffset]u ;
      draw
       (((30.0u,0)--(50.0u,0){up}..(55.0u,7.5u)..
         (60.0u,0)..(65.0u,-7.5u)..(70.0u,0)..
         (75.0u,7.5u)..(80.0u,0)..(85.0u,-7.5u)..{up}
         (90.0u,0)--(105.0u,0)) rotatedaround(origin,-\chemicalangle))
       shifted z0 ;
    \stopMPdrawing
  \fi
  \undochemicaloffset}

% \plotchemicalcircle{#1}{#2}{#3}{#4}
%
% #1: lengte van de boog in graden
% #2: x-coordinaat eindpunt
% #3: y-coordinaat eindpunt

\newif\ifchemicaldotted

\def\plotchemicalcircle#1#2#3#4#5#6%
 {\bgroup
  \ifcase\chemicaldrawingmode
    \ifchemicaldotted
      \findlength{\circulararc {#4} degrees from {#5} {#6} center at {0} {0} }%
      \divide\totalarclength by 6
      \def\b{\the\totalarclength}%
      \divide\totalarclength by 2
      \def\a{\the\totalarclength}%
      \setdashpattern <\a,\b,\b,\b,\b,\b,\a>
    \fi
    \circulararc {#4} degrees from {#5} {#6} center at {0} {0} %
  \or
    \ifchemicaldotted
      \psset{linestyle=dashed}%
    \fi
    \rput
      {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
      {\psarc(0,0){#3}{#1}{#2}}%
  \or
    \global\MPdrawingdonetrue
    \setchemicalattributes
    \startMPdrawing
      r := \MPdivten[#3]*2u;
      x0 := \MPdivten[\chemicalxoffset]u ;
      y0 := \MPdivten[\chemicalyoffset]u ;
      draw ((subpath (#1/45,#2/45) of (fullcircle scaled (r)))
        rotatedaround (origin,\chemicalangle+150))
        shifted z0 \ifchemicaldotted dashed withdots \fi ;
    \stopMPdrawing
  \fi
  \egroup}

\def\setchemicalcircsegment #1 #2 #3 #4 #5 #6 #7
 {\setvalue{\s!chemicalcircsegment#1}{\plotchemicalcircle{#2}{#3}{#4}{#5}{#6}{#7}}}

\def\getchemicalcircsegment[#1][#2]%
 {\chemicalrotate[#1]%
  \getvalue{\s!chemicalcircsegment#2}}

\def\doprocesschemicalcircsegment#1#2%
 {\def\doprocess[##1##2##3##4##5]%
    {\doifelse{##1}{?}
       {\doprocess[1..\maxchemical ????]}
       {\doifchemicalnumber{##1}{#1#2}
          {\doifelse{##2##3}{..}
             {\doifchemicalnumber{##4}{#1#2}
                {\getchemicalcircsegment[##1][#1]%
                 \doifnot{##1}{##4}
                   {\!!counta=##1\relax
                    \advance\!!counta by 1
                    \edef\nextsegment{\the\!!counta}%
                    \doprocess[\nextsegment..##4##5]}}}
             {\getchemicalcircsegment[##1][#1]%
              \doifnot{##2}{?}
                {\doprocess[##2##3##4##5]}}}}}%
  \doprocess[#2]}

\def\processchemicalcircsegment%
 {\chemicaldottedfalse\doprocesschemicalcircsegment}

\def\processchemicaldottsegment%
 {\chemicaldottedtrue\doprocesschemicalcircsegment}

\let\endchemicalpicture   = \relax
\let\checkchemicalpicture = \relax
\let\nomoreaccounting     = \relax

\newif\ifchemicalpicture

\def\beginchemicalpicture#1% NO PSTRICKS SUPPORT YET
 {\checkchemicalpicture
  \bgroup                 % DOES NOT HANDLE AUTOWIDTH/HEIGHT
  \chemicalpicturetrue
  \processchemical[#1]}

\def\setchemicalpicture#1#2%
 {\chemicalpicturefalse
  \def\endchemicalpicture%
    {\@@endchemicallocalpicture{#1}{#2}%
     \egroup
     \ifnum\chemicaldrawingmode=1
       \rput
         {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
         {\expanded{\rput[\chemicalloca]{\chemicalangle}(#1,#2){\box\nextbox}}}%
     \else
       \expanded{\put{\box\nextbox}[\chemicalloca] at {#1} {#2} }
     \fi
     \egroup}%
  \def\checkchemicalpicture%
    {\ifx\endchemicalpicture\relax \else
       \writestatus{ppchtex}{missing end of picture (PE)}%
       \endchemicalpicture
     \fi}%
  \setbox\nextbox=\hbox\bgroup
  \@@beginchemicallocalpicture
  % alternatief: gewoon accounting, en zelf l,r afhandelen
  \ifnum\chemicaldrawingmode=1
    % njet
  \else
    \accountingon
    \let\nomoreaccounting=\accountingoff
  \fi}

\def\doskipchemical[#1][#2]%
 {{\tt[ppchtex]}}

\def\skipchemical%
 {\dodoubleargument\doskipchemical}

\def\complexchemical% met \expandafter
 {\ifinchemical
    \expandafter\dochemical
  \else
    \writestatus{ppchtex}{the [][]-alternative is not permitted here}%
    \expandafter\skipchemical
  \fi}

\newif\ifinnerchemical

\def\dosimplechemical#1#2#3%
 {\doifdefinedelse{\??chemical\c!location}
    {\writestatus{ppchtex}{the {}{}-alternative is not permitted here}}
    {\ifinnerchemical
       \let\chemicalsign         = \chemicalinnersign
       \let\chemicalmolecule     = \chemicalinnermolecule
       \let\chemicalsinglearrow  = \chemicalsingleinnerarrow
       \let\chemicaldoublearrow  = \chemicaldoubleinnerarrow
       \let\chemicaltwintiparrow = \chemicaltwintipinnerarrow
     \else
       \let\chemicalsign         = \chemicaloutersign
       \let\chemicalmolecule     = \chemicaloutermolecule
       \let\chemicalsinglearrow  = \chemicalsingleouterarrow
       \let\chemicaldoublearrow  = \chemicaldoubleouterarrow
       \let\chemicaltwintiparrow = \chemicaltwintipouterarrow
     \fi
     \disablechemicalspecials
     \unexpandedprocessallactionsinset
       [#1]
       [       HIGH=>\sethighsubscripts,
                LOW=>\setlowsubscripts,
               PLUS=>\chemicalsign{+},
              GIVES=>\chemicalsinglearrow{#2}{#3},
        EQUILIBRIUM=>\chemicaldoublearrow{#2}{#3},
          MESOMERIC=>\chemicaltwintiparrow{#2}{#3},
             SINGLE=>\singlechemicalbond,
             DOUBLE=>\doublechemicalbond,
             TRIPLE=>\triplechemicalbond,
                  +=>\chemicalsign{+},
                 ->=>\chemicalsinglearrow{#2}{#3},
                <->=>\chemicaldoublearrow{#2}{#3},
                 <>=>\chemicaltwintiparrow{#2}{#3},
                  -=>\singlechemicalbond,
                 --=>\doublechemicalbond,
                ---=>\triplechemicalbond,
         \s!unknown=>\enablechemicalspecials
                     \chemicalmolecule{\commalistelement}{#2}{#3}]}}

%\def\dosimplechemicalA#1#2#3%
%  {\let\chemicalspace=\relax
%   \def\dodosimplechemical##1%
%     {\dosimplechemical{##1}{}{}}%
%   \@EA\processcommalist\@EA[\@@chemicalchemicaloffset,#1]\dodosimplechemical
%   \egroup}

\def\dosimplechemicalA#1#2#3% % evt: {#1,\relax}
 {\let\chemicalspace=\relax
  \@EA\dosimplechemical\@EA{\@@chemicalchemicaloffset,#1}{#2}{#3}%
  \egroup}

\def\dosimplechemicalB#1#2#3%
 {\dosimplechemical{#1}{#2}{#3}%
  \egroup}

\def\dosimplechemicalC#1#2#3%
 {$\simplechemical{#1}{#2}{#3}$%
  \egroup} % erbij

\def\simplechemical%
 {\ifinner
    \innerchemicaltrue
  \else
    \innerchemicalfalse
  \fi
  \bgroup
  \catcode`\^=\@@superscript %  t.b.v. \enableduplication
  \catcode`\_=\@@subscript   %  t.b.v. de zekerheid
  \ifmmode
    \ifinnerchemical
      \def\next{\dotriplegroupempty\dosimplechemicalA}%
    \else
      \def\next{\dotriplegroupempty\dosimplechemicalB}%
    \fi
  \else
    \def\next{\dotriplegroupempty\dosimplechemicalC}%
  \fi
  \next}

\definecomplexorsimple\chemical

\def\dogotochemical#1#2%
 {\def\dowithchemical%                       % experiment
    {\localgotochemical{#1}}%                % experiment
  \chemical}                                 % experiment

\def\gotochemical%                            % experiment
 {\dosingleargument\dogotochemical}          % experiment

\def\dododochemical#1[#2][#3]%                % experiment
 {\def\simpledododochemical%                 % experiment
    {#1[#2][#3]}%                            % experiment
  \def\complexdododochemical[##1]%           % experiment
    {\def\dowithchemical%                    % experiment
       {\localthisischemical{#2}}%           % experiment
     #1[#3][##1]}%                           % experiment
  \complexorsimple\dododochemical}           % experiment

\def\dodochemical[#1][#2]%
 {\ignorespaces
  \ifinchemical
    \drawchemical[#1][#2]%
    \ignorespaces
  \else
    \startchemical[\c!location=\v!intext]%
      \drawchemical[#1][#2]%
    \expandafter\stopchemical
  \fi
  \ignorespaces}

\def\dochemical[#1]%
 {\def\simpledochemical%
    {\@@writechemicalstate{ppchtex}{[#1][]}%
     \dodochemical[#1][]}%
  %
  \def\complexdochemical[##1]%
    {\@@writechemicalstate{ppchtex}{[#1][##1]}%
     \txtchemical=0%
     \dodochemical[#1][##1]}%
  %
  \def\complexdochemical[##1]%                   % experiment
    {\@@writechemicalstate{ppchtex}{[#1][##1]}% % experiment
     \txtchemical=0%                             % experiment
     \dododochemical\dodochemical[#1][##1]}%     % experiment
  %
  \complexorsimple\dochemical}

% \processlocalchemicals{#1}
%
% #1: commando's

\def\dodoprocesschemical#1%
 {\processchemical[#1????]}

\def\processlocalchemicals#1%
 {\processcommalist[#1]\dodoprocesschemical}

% \drawchemical[#1][#2]
%
% #1: bindingen enz.
% #2: atomen enz.

\def\localdodochemical[#1][#2]%
 {\@@writechemicalstate{ppchtex}{[#1][#2]}%
  %\bgroup     % koppelen en afmetingen gaat fout, vandaar:
  \advance\levchemical 1
  \letvalue{\??chemical\s!unknown\the\levchemical}\unknownchemical
  \setevalue{\??chemical\c!text\the\levchemical}{\the\txtchemical}%
  \txtchemical=0
  \dodochemical[#1][#2]%
  % \@EA\txtchemical\@EA\csname\??chemical\c!text\the\levchemical\endcsname
  \txtchemical\csname\??chemical\c!text\the\levchemical\endcsname
  \@EA\let\@EA\unknownchemical\csname\??chemical\s!unknown\the\levchemical\endcsname
  \advance\levchemical -1
  %\egroup
  \ignorespaces}

\def\drawchemical[#1][#2]%
 {\ignorespaces
  \def\dodochemical[##1][##2]%
    {\drawchemical[##1][##2]%
     \ignorespaces}%
  \def\dochemical[##1]%
    {\def\simpledochemical%
       {\@@writechemicalstate{ppchtex}{[##1][#2]}%
        \dodochemical[##1][#2]%
        \ignorespaces}%
     \def\complexdochemical[####1]%
       {\dododochemical\localdodochemical[##1][####1,#2]}%
    \complexorsimple\dochemical}%
  \doif\@@chemicalstate\v!start
    {\doifelse\chemicalname\s!unknown
       {\getvalue{\s!executechemical\defaultchemical}[#2]}
       {\getvalue{\s!executechemical\chemicalname}[#2]}%
     \def\unknownchemical##1%
       {\processunknownchemical[##1][#2]}%
     \processcommalist[\@@chemicaloffset,#1]\dodoprocesschemical}%
  \ignorespaces}

\def\chemicaloxidation#1#2#3%
 {\chemicaltop
    {\ifnum#20=0
       0%
     \else
       #1\expandafter\uppercase\expandafter{\romannumeral#2}%
     \fi}
    {#3}}

\def\chemicaltfraction{\ifinchemical.60\else.8\fi}
\def\chemicalbfraction{\ifinchemical.45\else.6\fi}
\def\chemicallfraction{\ifinchemical.1\else.1\fi}
\def\chemicalrfraction{\ifinchemical.1\else.1\fi}

\def\chemicaltighttext%
 {\def\chemicaltfraction{\ifinchemical.3\else.6\fi}%
  \def\chemicalbfraction{\ifinchemical.2\else.4\fi}%
  \def\chemicallfraction{\ifinchemical0\else0\fi}%
  \def\chemicalrfraction{\ifinchemical0\else0\fi}}

\def\dochemicaltop#1#2#3#4%
 {\vbox
    {\@@dochemicalcolor
     \baselineskip=\chemicaltfraction\baselineskip \lineskip0pt
     \halign
       {#1###2\cr
        $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr
        $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr}}}

\def\dochemicalbottom#1#2#3#4%
 {\vtop
    {\@@dochemicalcolor
     \baselineskip=\chemicalbfraction\baselineskip \lineskip0pt
     \halign
       {#1###2\cr
        $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr
        $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr}}}

\def\chemicalleft#1#2%
 {\hbox
    {\@@dochemicalcolor
     $\@@dochemicalstyle{\scriptscriptstyle#1}$%
     $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}

\def\chemicalright#1#2%
 {\hbox
    {\@@dochemicalcolor
     $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
     $\@@dochemicalstyle{\scriptscriptstyle#1}$}}

\def\chemicalcentered#1%
 {\setbox0=\hbox{$\@@dochemicalstyle{\scriptscriptstyle#1}$}%
  \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
  \dimen0=.5\ht2
  \advance\dimen0 by -.5\ht0
  \advance\dimen0 by \dp0
  \hbox{\@@dochemicalcolor\raise\dimen0\box0}}

\def\chemicalleftcentered#1#2%
 {\hbox
    {\@@dochemicalcolor
     \chemicalcentered{#1}%
     $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}

\def\chemicalrightcentered#1#2%
 {\hbox
    {\@@dochemicalcolor
     $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
     \chemicalcentered{#1}}}

\def\chemicaltop          {\dochemicaltop    \hss   \hss  }
\def\chemicallefttop      {\dochemicaltop    \relax \hss  }
\def\chemicalrighttop     {\dochemicaltop    \hss   \relax}
\def\chemicalbottom       {\dochemicalbottom \hss   \hss  }
\def\chemicalleftbottom   {\dochemicalbottom \relax \hss  }
\def\chemicalrightbottom  {\dochemicalbottom \hss   \relax}

\def\chemicaltopleft    #1{\chemicalleft {\chemicallefttop   {#1}{}}}
\def\chemicalbottomleft #1{\chemicalleft {\chemicalleftbottom{#1}{}}}
\def\chemicaltopright   #1{\chemicalright{\chemicallefttop   {#1}{}}}
\def\chemicalbottomright#1{\chemicalright{\chemicalleftbottom{#1}{}}}

\def\chemicalsmashedleft#1%
 {\hbox\bgroup
  \@@dochemicalcolor
  \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
  \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
  \wd2=\wd0
  \box2
  \egroup}

\def\chemicalsmashedmiddle#1%
 {\hbox\bgroup
  \@@dochemicalcolor
  \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
  \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
  \hbox{\hskip-.5\wd2\hskip.5\wd0\box2}
  \egroup}

\def\chemicalsmashedright#1%
 {\hbox\bgroup
  \@@dochemicalcolor
  \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
  \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
  \hbox to \wd0{\hskip-\wd2\hskip\wd0\box2}%
  \egroup}

\def\+{\tabalign} % is \long in Plain

\def\chemicalforever#1#2%
 {\bgroup
  \setbox0=\hbox
    {\@@dochemicalcolor
     $\@@dochemicalstyle{\scriptscriptstyle\hskip-.15em#2}$}%
  \wd0=0pt
  \big#1_{\hskip.1em\box0}%
  \egroup}

\def\disablechemicalspecials%
 {\def\+##1{##1}\def\-##1{##1}%
  \def\[{[}\def\]{]}%
  \def\1{}\def\2{}\def\3{}\def\4{}\def\5{}\def\6{}\def\7{}%
  \def\X{}%
  \def\T{}\def\B{}\def\L{}\def\R{}\def\LC{}\def\RC{}%
  \def\TL{}\def\BL{}\def\TR{}\def\BR{}%
  \def\LT{}\def\LB{}\def\RT{}\def\RB{}%
  \def\SL{}\def\SM{}\def\SR{}}

\def\enablechemicalspecials%
 {\def\+{\dodoublegroupempty\chemicaloxidation{+}}% {} needed!
  \def\-{\dodoublegroupempty\chemicaloxidation{-}}% {} needed!
  \def\[{\dodoublegroupempty\chemicalforever  {[}}% {} needed!
  \def\]{\dodoublegroupempty\chemicalforever  {]}}% {} needed!
  \def\1{\chemicaloxidation\relax1}%
  \def\2{\chemicaloxidation\relax2}%
  \def\3{\chemicaloxidation\relax3}%
  \def\4{\chemicaloxidation\relax4}%
  \def\5{\chemicaloxidation\relax5}%
  \def\6{\chemicaloxidation\relax6}%
  \def\7{\chemicaloxidation\relax7}%
  \def\X{\chemicaltighttext}%
  \def\T{\chemicaltop}%
  \def\B{\chemicalbottom}%
  \def\L{\chemicalleft}%
  \def\LC{\chemicalleftcentered}%
  \def\R{\chemicalright}%
  \def\RC{\chemicalrightcentered}%
  \def\TL{\chemicaltopleft}%
  \def\BL{\chemicalbottomleft}%
  \def\TR{\chemicaltopright}%
  \def\BR{\chemicalbottomright}%
  \def\LT{\chemicallefttop}%
  \def\LB{\chemicalleftbottom}%
  \def\RT{\chemicalrighttop}%
  \def\RB{\chemicalrightbottom}%
  \def\SL{\chemicalsmashedleft}%
  \def\SM{\chemicalsmashedmiddle}%
  \def\SR{\chemicalsmashedright}}

% \reversechemical#1#2#3
%
% #1: prefix
% #2: volgnummer enz
% #3: tegengestelde volgnummers

\def\reversechemical#1#2#3%
 {\def\doprocess[##1##2]%
    {\doifchemicalnumber{##1}{#1#2}%
       {\getfromcommalist[#3][##1]%
        \let\reversechemicalaction=\commalistelement
        \processchemical[#1\reversechemicalaction##2]}}%
  \doprocess[#2]}

% \processunknownchemical[#1????][#2]
%
% #1: bindingen enz.
% #2: atomen enz.

\def\defaultchemical%
 {SIX}

\def\processunknownchemical[#1????][#2]%
 {\processaction
    [#1]
    [       SAVE=>\executechemicalSAVE,
         RESTORE=>\executechemicalRESTORE,
            HIGH=>\sethighsubscripts,
             LOW=>\setlowsubscripts,
     \s!default=>,
     \s!unknown=>\doifdefinedelse{\s!executechemical#1}
                   {\def\chemicalrotation{1}%
                    \def\chemicaloffset{0}%
                    \doifdefined{\s!executechemical#1}
                      {\getvalue{\s!executechemical#1}[#2]}%
                    \@@chemicalpostponed}
                   {\getpredefinedchemical{#1}}]}

\newcount\chemicalstack % tzt \newwounter

\setvalue{\s!chemical\c!x1}{0}
\setvalue{\s!chemical\c!y1}{0}

\def\executechemicalSAVE%
 {%\writestatus{ppchtex}{saving \the\horchemical,\the\verchemical}%
  \advance\chemicalstack by 1
  \letvalue {\s!chemical n\the\chemicalstack}=\chemicalname
  %\letvalue {\s!chemical p\the\chemicalstack}=\@@chemicalpostponed
  \setevalue{\s!chemical x\the\chemicalstack}{\the\horchemical}%
  \setevalue{\s!chemical y\the\chemicalstack}{\the\verchemical}}

\def\restorechemicalvalues#1%
 {\let\oldprocesschemical=\processchemical
  \doifdefined{\s!executechemical#1}{\getvalue{\s!executechemical#1}[]}%
  \let\processchemical=\oldprocesschemical}

\def\executechemicalRESTORE%
 {\ifnum\chemicalstack=0\relax
    \horchemical=\getvalue{\s!chemical x1}\relax
    \verchemical=\getvalue{\s!chemical y1}\relax
  \else
    \restorechemicalvalues{\getvalue{\s!chemical n\the\chemicalstack}}%
    %\@EA\let\@EA\@@chemicalpostponed\@EA=\csname\s!chemical p\the\chemicalstack\endcsname
    \let\@@chemicalpostponed=\relax
    \horchemical=\getvalue{\s!chemical x\the\chemicalstack}\relax
    \verchemical=\getvalue{\s!chemical y\the\chemicalstack}\relax
    \advance\chemicalstack by -1
  \fi
  \restorechemicalcoordinates}

% De onderstaande macro's zijn verantwoordelijk voor het zetten
% van de + en pijlen. De +, en dus ook de pijlen, worden omhoog
% gehaald. Dit oogt m.i. fraaier.

\def\chemicalinnerclip#1%
 {{\setbox0=\hbox{#1}\ht0\ht\strutbox\dp0\dp\strutbox\box0}}

\def\chemicalraise#1#2%
 {\chemicalinnerclip
    {\setbox0=\hbox{$#1+$}%
     \raise\dp0\hbox{$#1#2$}}}

\def\chemicalinnersign#1% todo: \@@chemicaltextcolor
 {\chemicalraise{\@@localchemicalstyle}{#1}}

\def\chemicaloutersign#1%
 {\chemicalraise{}{\@@dochemicalcolor#1}}

\def\chemicalsingleinnerarrow#1#2%
 {\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}

\def\chemicaldoubleinnerarrow#1#2% todo: \@@chemicaltextcolor
 {\chemicalinnerclip
    {\lower.2ex\hbox
       {\setbox0=\hbox{$\@@localchemicalstyle\longrightarrow$}%
        \setbox2=\hbox{$\@@localchemicalstyle\longleftarrow$}%
        \wd0=0pt\raise\ht0\box0\box2}}}

\def\chemicaltwintipinnerarrow#1#2% todo: \@@chemicaltextcolor
 {\chemicalinnerclip
    {\setbox0=\hbox{\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}%
     \setbox2=\hbox{\chemicalraise{\@@localchemicalstyle}{\longleftarrow}}%
     \wd0=0pt\box0\box2}}

\def\dochemicalouterarrow#1#2#3%
 {\bgroup
  \setbox0=\hbox{$\longrightarrow$}%
  \setbox2=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#2\quad}$}%
  \setbox4=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#3\quad}$}%
  \dimen2=\wd0 % \dimen0 is used elsewhere
  \ifdim\wd2>\dimen2 \dimen0=\wd2 \fi
  \ifdim\wd4>\dimen2 \dimen0=\wd4 \fi
  \chemicaloutermolecule
    {#1}
    {\ifdim\ht2>\!!zeropoint\box2\fi}  % expands to \empty in test
    {\ifdim\ht4>\!!zeropoint\box4\fi}% % expands to \empty in test
  \egroup}

\def\chemicalsingleouterarrow%
 {\dochemicalouterarrow
    {\hbox to \dimen2{\rightarrowfill}}}

\def\chemicaldoubleouterarrow%
 {\dochemicalouterarrow
    {\lower.5\ht0\vbox
       {\offinterlineskip
        \hbox to \dimen2{\rightarrowfill}
        \hbox to \dimen2{\leftarrowfill}}}}

\def\chemicaltwintipouterarrow%
 {\dochemicalouterarrow
    {\hbox
       {\hbox to \dimen2{\rightarrowfill}%
        \hskip-\dimen2
        \hbox to \dimen2{\leftarrowfill}}}}

\def\chemicalinnermolecule#1#2#3% no mathop here, can generate space
 {\chemicalspace               % todo: \@@chemicaltextcolor
  \chemicalinnerclip
    {\dosetsubscripts
     $\@@dochemicalstyle{\@@localchemicalstyle\strut#1}$%
     \doresetsubscripts}%
  \chemicalspace}

\def\chemicaloutermolecule#1#2#3%
 {\chemicalspace
  \bgroup
  \@@dochemicalcolor
  \setbox0=\hbox % else the font is reset
    {\dosetsubscripts
     \hbox{$\@@dochemicalstyle{\strut#1}$}%
     \doresetsubscripts}%
  \mathop{\box0}%
  \ifthirdargument
    \doifnot{#2}{}
      {^{\@@dochemicalstyle{\strut#2}}}%
    \doifnot{#3}{}
      {_{\@@dochemicalstyle{\strut#3}}}%
  \else
    \doifnot{#2}{}
      {_{\@@dochemicalstyle{\strut#2}}}%
  \fi
  \egroup
  \chemicalspace}

\def\chemicalsinglepicturearrow#1%
 {\lower.5ex\hbox
     {\@@dochemicalstyle
      $\chemicalspace
       \buildrel
         \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
       \over{\overrightarrow
         {\hphantom{\@chemicalstyle{\scriptstyle\quad#1\quad}}}}%
       \chemicalspace$}}

\def\chemicaldoublepicturearrow#1%
 {\lower.5ex\hbox
    {\@@dochemicalstyle
     $\chemicalspace
      \buildrel
        \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
      \over{\overrightarrow{\overleftarrow
        {\hphantom{\@@dochemicalstyle{\scriptstyle\quad#1\quad}}}}}%
      \chemicalspace$}}

% Bij de in-line bindingen wordt gebruik gemaakt van
% een \hrule. De maatvoering wordt bepaald door een
% kunstmatige em (\wd0).

\def\somechemicalbond%
 {\hrule width \wd0 height .4pt}

\def\dochemicalbonds#1#2#3% todo: \@@chemicaltextstyle
 {{\setbox0=\hbox
     {${\@@localchemicalstyle M}$}%
   \vbox to \ht0
     {\@@dochemicalcolor
      \hsize\wd0
      \vskip.1\wd0#1\vfill#2\vfill#3\vskip.1\wd0}}}

\def\singlechemicalbond%
 {\dochemicalbonds{}{\somechemicalbond}{}}

\def\doublechemicalbond%
 {\dochemicalbonds{\somechemicalbond}{}{\somechemicalbond}}

\def\triplechemicalbond%
 {\dochemicalbonds{\somechemicalbond}{\somechemicalbond}{\somechemicalbond}}

% In plaats van \def\naam{\chemie[...]...} kan beter gebruik
% worden gemaakt van het commando
%
%   \definieerchemie[naam]{commando's}
%
% De naam krijgt, om problemen met bestaande macro's te
% voorkomen, een prefix. Bij het ophalen van een commando
% worden beide definities afgehandeld.

\def\dodefinechemical[#1]#2%
 {\doifdefined{\??chemical#1}
    {\writestatus{ppchtex}{chemical definition #1 is redefined}}%
  \setvalue{\??chemical#1}{#2}}

\def\definechemical%
 {\dosingleargument\dodefinechemical}

\def\getpredefinedchemical#1%
 {\doifdefinedelse{\??chemical#1}
    {\getvalue{\??chemical#1}}
    {\doifdefinedelse{#1}
       {\getvalue{#1}}
       {\writestatus{ppchtex}{unknown chemical definition #1}}}}

% Hieronder zijn de definities van de structuren opgenomen. De
% naam van de structuur is als volgt opgebouwd:
%
%   \executechemicalNUMBER[#1]
%
% waarbij [#1] betrekking heeft op de tekstelementen van \chemie,
% de [tweede lijst] dus.
%
% De aan \chemie[#1][#2] meegegeven lijst van segmenten wordt
% deels door de in \execute gedefinieerde macro's afgehandeld,
% deels door algemene macro's. Segmenten hebben de vorm:
%
%   [+|-|]identifier[X|XYZ|X..Y]
%
% Voorbeelden van segmenten zijn:
%
%   R1
%   R1..4
%   R135
%   -R1
%   +R35

\setchemicalmaximum 0

\def\processchemical[#1]%
 {\unknownchemical{#1}}

\def\setchemicalname#1 %
 {\def\chemicalname{#1}}

\let\chemicalname=\s!unknown

% Vooruitlopend op een gedetailleerde documentatie, zijn hier
% vast enkele gebruikte afmetingen:
%
% lengte radikalen          :  500
% afstand radikalen         :  100
% afstand dubbele radikalen :  260
% afstand substituenten     : +125

\def\executechemicalONE[#1]%
 {\setchemicalname ONE
  %
  \setchemicalmaximum      8
  \setchemicaldistance     0
  \setchemicalsubstitute 625
  \setchemicaldirection  303
  %
  \setchemicalrotation 1  1      0      1      0      1      0      1      0
  \setchemicalrotation 2  0.707 -0.707  0.707 -0.707  0.707 -0.707  0.707 -0.707
  \setchemicalrotation 3  0     -1      0     -1      0     -1      0     -1
  \setchemicalrotation 4 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707 -0.707
  \setchemicalrotation 5 -1      0     -1      0     -1      0     -1      0
  \setchemicalrotation 6 -0.707  0.707 -0.707  0.707 -0.707  0.707 -0.707  0.707
  \setchemicalrotation 7  0      1      0      1      0      1      0      1
  \setchemicalrotation 8  0.707  0.707  0.707  0.707  0.707  0.707  0.707  0.707
  %
  \setchemicalangle 1   0  90 180 270
  \setchemicalangle 2  45 135 225 315
  \setchemicalangle 3  90 180 270   0
  \setchemicalangle 4 135 225 315  45
  \setchemicalangle 5 180 270   0  90
  \setchemicalangle 6 225 315  45 135
  \setchemicalangle 7 270   0  90 180
  \setchemicalangle 8 315  45 135 225
  %
  \setchemicaltranslate 1 -1000     0
  \setchemicaltranslate 2 -1000  1000
  \setchemicaltranslate 3     0  1000
  \setchemicaltranslate 4  1000  1000
  \setchemicaltranslate 5  1000     0
  \setchemicaltranslate 6  1000 -1000
  \setchemicaltranslate 7     0 -1000
  \setchemicaltranslate 8 -1000 -1000
  %
  \setchemicallinesegment  SB  300   0 700    0
  \setchemicallinesegment DB1  300  50 700   50
  \setchemicallinesegment DB2  300 -50 700  -50
  %
  \setchemicallinesegment  EP  200 125 200 -125
  \setchemicaltextelement  ES  200   0
  \setchemicaltextelement ED1  200  50
  \setchemicaltextelement ED2  200 -50
  \setchemicaltextelement ET1  200  75
  \setchemicaltextelement ET2  200   0
  \setchemicaltextelement ET3  200 -75
  \setchemicaltextelement HB1  300   0
  \setchemicaltextelement HB2  475   0
  \setchemicaltextelement HB3  650   0
  %
  \setchemicaltextelement   Z  800    0
  \setchemicaltextelement  RZ  950    0
  \setchemicaltextelement  ZN  500    0
  \setchemicaltextelement ZTN  500  150
  \setchemicaltextelement ZBN  500 -150
  %
  \def\processchemical[##1##2##3##4##5]%
    {\doprocesschemical[##1##2##3##4##5]
       {\processaction
          [##1##2##3##4##5]
          [    PB:##4##5=>\beginchemicalpicture{##4##5},
                  PE????=>\endchemicalpicture,
               SUB##4##5=>\processchemicalsubstitute{##4##5},
               ADJ##4##5=>\processchemicaldistance{##4##5},
               MOV##4##5=>\processchemicaltranslate{##4##5},
               DIR##4##5=>\processchemicaldirection{##4##5},
               OFF##4##5=>\processchemicaloffset{##4##5},
CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
               LDD##4##5=>\processchemicaldashedlinesegment{DB1}{##4##5}%
                          \processchemicallinesegment{DB2}{##4##5},
               RDD##4##5=>\processchemicallinesegment{DB1}{##4##5}%
                          \processchemicaldashedlinesegment{DB2}{##4##5},
               OF##3:##5=>\processchemicalphantom{##3}{##5},
             OE##3##4##5=>\processchemicalopenend{OE}{##3##4##5},
             EP##3##4##5=>\processchemicallinesegment{EP}{##3##4##5},
             ES##3##4##5=>\processchemicaltextconstant{ES}{##3##4##5}{\hbox{$\cdot$}}{0},
             ED##3##4##5=>\processchemicaltextconstant{ED}{##3##4##5}{\hbox{$\cdot$}}{0},
             ET##3##4##5=>\processchemicaltextconstant{ET}{##3##4##5}{\hbox{$\cdot$}}{0},
             HB##3##4##5=>\processchemicaltextconstant{HB}{##3##4##5}{\hbox{$\cdot$}}{0},
             SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
             DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
             SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
             BB##3##4##5=>\processchemicaldeltalinesegment{SB}{##3##4##5},
             SD##3##4##5=>\processchemicaldashedlinesegment{SB}{##3##4##5},
             TB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5}%
                          \processchemicallinesegment{DB}{##3##4##5},
             CZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{0}{},
               ZTN##4##5=>\processchemicalsmalltextconstant{ZTN}{##4##5}{\chemicaltextelementnumber}{0},
               ZTT##4##5=>\processchemicalsmalltextelement{ZTN}{##4##5}{#1}{0}{},
               ZBN##4##5=>\processchemicalsmalltextconstant{ZBN}{##4##5}{\chemicaltextelementnumber}{0},
               ZBT##4##5=>\processchemicalsmalltextelement{ZBN}{##4##5}{#1}{0}{},
             ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
             ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
           Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}
                            {l,l,t,r,r,r,b,l},
           \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}}

\def\executechemicalTHREE[#1]%
 {\setchemicalname THREE
  %
  \setchemicalmaximum      3
  \setchemicaldistance   289
  \setchemicalsubstitute 952
  %
  \setchemicalrotation 1  1    0      0     -1   -1    0      0      1
  \setchemicalrotation 2 -0.5 -0.866 -0.866  0.5  0.5  0.866  0.866 -0.5
  \setchemicalrotation 3 -0.5  0.866  0.866  0.5  0.5 -0.866 -0.866 -0.5
  %
  \setchemicalangle 1   0  90 180 270
  \setchemicalangle 2 120 210 300  30
  \setchemicalangle 3 240 330  60 150
  %
  \setchemicaltranslate 1 -1000     0
  \setchemicaltranslate 2     0  1000
  \setchemicaltranslate 3  1000     0
  \setchemicaltranslate 4     0 -1000
  %
  \setchemicallinesegment   B   577     0  -289  -500
  \setchemicallinesegment  SB   352  -130   -64  -370
  \setchemicallinesegment -SB   352  -130  -289  -500
  \setchemicallinesegment +SB   577     0   -64  -370
  \setchemicallinesegment DB1   327   -87   -89  -327
  \setchemicallinesegment DB2   377  -172   -39  -413
  \setchemicallinesegment   R   577     0  1077     0
  \setchemicallinesegment  -R   577     0  1010   250
  \setchemicallinesegment  +R   577     0  1010  -250
  \setchemicallinesegment ER1   577    50  1077    50
  \setchemicallinesegment ER2   577   -50  1077   -50
  \setchemicallinesegment  SR   837     0  1077     0
  \setchemicallinesegment -SR   802   130  1010   250
  \setchemicallinesegment +SR   802  -130  1010  -250
  \setchemicallinesegment DR1   837    50  1077    50
  \setchemicallinesegment DR2   837   -50  1077   -50
  %
  \setchemicaltextelement   Z   577     0
  \setchemicaltextelement  RZ  1177     0
  \setchemicaltextelement -RZ  1097   300
  \setchemicaltextelement +RZ  1097  -300
  \setchemicaltextelement CRZ  1077     0
  %
  \def\processchemical[##1##2##3##4]%
    {\processaction
       [##1##2##3##4]
       [    ROT##4=>\processchemicalrotation{##4},
            MOV##4=>\processchemicaltranslate{##4},
            SUB##4=>\processchemicalsubstitute{##4},
            ADJ##4=>\processchemicaldistance{##4},
            -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{3}
                      {l,t,r, l,r,l, r,b,l, r,l,r},
            +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{3}
                      {l,r,b, r,r,l, r,l,t, l,l,r},
            -SB##4=>\processchemicallinesegment{-SB}{##4},
            +SB##4=>\processchemicallinesegment{+SB}{##4},
            -SR##4=>\processchemicallinesegment{-SR}{##4},
            +SR##4=>\processchemicallinesegment{+SR}{##4},
            CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}
                      {},
          DB##3##4=>\processchemicallinesegment{DB}{##3##4},
          DR##3##4=>\processchemicallinesegment{DR}{##3##4},
          RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{3}
                      {l,r,r, t,r,l, r,l,l, b,l,r},
          ER##3##4=>\processchemicallinesegment{ER}{##3##4},
          SB##3##4=>\processchemicallinesegment{SB}{##3##4},
          SR##3##4=>\processchemicallinesegment{SR}{##3##4},
          -R##3##4=>\processchemicallinesegment{-R}{##3##4},
          +R##3##4=>\processchemicallinesegment{+R}{##3##4},
        B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
        R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
        Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
        \s!unknown=>\unknownchemical{##1##2##3##4}]}}

\def\executechemicalFOUR[#1]%
 {\setchemicalname FOUR
  %
  \setchemicalmaximum      4
  \setchemicaldistance   500
  \setchemicalsubstitute   0
  %
  \setchemicalrotation 1  1  0  0 -1 -1  0  0  1
  \setchemicalrotation 2  0 -1 -1  0  0  1  1  0
  \setchemicalrotation 3 -1  0  0  1  1  0  0 -1
  \setchemicalrotation 4  0  1  1  0  0 -1 -1  0
  %
  \setchemicalangle 1   0  90 180 270
  \setchemicalangle 2  90 180 270   0
  \setchemicalangle 3 180 270   0  90
  \setchemicalangle 4 270   0  90 180
  %
  \setchemicaltranslate 1 -1000     0
  \setchemicaltranslate 2     0  1000
  \setchemicaltranslate 3  1000     0
  \setchemicaltranslate 4     0 -1000
  %
  \setchemicallinesegment   B  500  500  500 -500
  \setchemicallinesegment  SB  500  240  500 -240
  \setchemicallinesegment -SB  500  240  500 -500
  \setchemicallinesegment +SB  500  500  500 -240
  \setchemicallinesegment DB1  450  240  450 -240
  \setchemicallinesegment DB2  550  240  550 -240
  \setchemicallinesegment  EB  360  300  360 -300
  \setchemicallinesegment   R  500  500  854  854
  \setchemicallinesegment  -R  500  500  500 1000
  \setchemicallinesegment  +R  500  500 1000  500
  \setchemicallinesegment ER1  465  535  819  889
  \setchemicallinesegment ER2  535  465  889  819
  \setchemicallinesegment  SR  684  684  854  854
  \setchemicallinesegment -SR  500  760  500 1000
  \setchemicallinesegment +SR  760  500 1000  500
  \setchemicallinesegment DR1  649  719  819  889
  \setchemicallinesegment DR2  719  649  889  819
  %
  \setchemicaltextelement   Z  500  500
  \setchemicaltextelement  RZ  925  925
  \setchemicaltextelement -RZ  500 1100
  \setchemicaltextelement +RZ 1100  500
  \setchemicaltextelement CRZ 1038 1038
  %
  \setchemicaltextelement  ZN  350  350
  %
  \def\processchemical[##1##2##3##4]%
    {\processaction
       [##1##2##3##4]
       [    PB:##4=>\beginchemicalpicture{##4},
            PE????=>\endchemicalpicture,
            ROT##4=>\processchemicalrotation{##4},
            SUB##4=>\processchemicalsubstitute{##4},
            ADJ##4=>\processchemicaldistance{##4},
            MOV##4=>\processchemicaltranslate{##4},
            -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{4}
                      {b,l,t,r, l,t,r,b, t,r,b,l, r,b,l,t},
            +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{4}
                      {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
            -SB##4=>\processchemicallinesegment{-SB}{##4},
            +SB##4=>\processchemicallinesegment{+SB}{##4},
            -SR##4=>\processchemicallinesegment{-SR}{##4},
            +SR##4=>\processchemicallinesegment{+SR}{##4},
            CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
          ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
          ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
          DB##3##4=>\processchemicallinesegment{DB}{##3##4},
          DR##3##4=>\processchemicallinesegment{DR}{##3##4},
          EB##3##4=>\processchemicallinesegment{EB}{##3##4},
          ER##3##4=>\processchemicallinesegment{ER}{##3##4},
          RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{4}
                      {lb,lt,rt,rb, lt,rt,rb,lb, rt,rb,lb,lt, rb,lb,lt,rt},
          SB##3##4=>\processchemicallinesegment{SB}{##3##4},
          SR##3##4=>\processchemicallinesegment{SR}{##3##4},
          -R##3##4=>\processchemicallinesegment{-R}{##3##4},
          +R##3##4=>\processchemicallinesegment{+R}{##3##4},
        B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
        R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
        Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
        \s!unknown=>\unknownchemical{##1##2##3##4}]}}

\def\executechemicalFIVE[#1]%
 {\setchemicalname FIVE
  %
  \setchemicalmaximum       5
  \setchemicaldistance    688
  \setchemicalsubstitute 1226
  %
  \setchemicalrotation 1  1      0      0     -1     -1      0      0      1
  \setchemicalrotation 2  0.309 -0.951 -0.951 -0.309 -0.309  0.940  0.951  0.309
  \setchemicalrotation 3 -0.809 -0.588 -0.588  0.809  0.809  0.588  0.588 -0.809
  \setchemicalrotation 4 -0.809  0.588  0.588  0.809  0.809 -0.588 -0.588 -0.809
  \setchemicalrotation 5  0.309  0.951  0.951 -0.309 -0.309 -0.951 -0.951  0.309
  %
  \setchemicalangle 1   0  90 180 270
  \setchemicalangle 2  72 162 252 342
  \setchemicalangle 3 144 234 324  54
  \setchemicalangle 4 216 306  36 126
  \setchemicalangle 5 288  18 108 198
  %
  \setchemicaltranslate 1 -1376     0
  \setchemicaltranslate 2  -425  1304
  \setchemicaltranslate 3  1113   809
  \setchemicaltranslate 4  1113  -809
  \setchemicaltranslate 5  -425 -1304
  %
  \setchemicallinesegment   A 1188  500 1188 -500
  \setchemicallinesegment   B  688  500  688 -500
  \setchemicallinesegment   S -263  808  688 -500
  \setchemicallinesegment  SS -116  606  541 -298
  \setchemicallinesegment -SS -263  808  541 -298
  \setchemicallinesegment +SS -116  606  688 -500
  \setchemicallinesegment  SB  688  240  688 -240
  \setchemicallinesegment -SB  688  240  688 -500
  \setchemicallinesegment +SB  688  500  688 -240
  \setchemicallinesegment DB1  638  240  638 -240
  \setchemicallinesegment DB2  738  240  738 -240
  \setchemicallinesegment  EB  548  340  548 -340
  \setchemicallinesegment   R  688  500 1093  794
  \setchemicallinesegment  -R  688  500  688 1000
  \setchemicallinesegment  +R  688  500 1163  345
  \setchemicallinesegment ER1  659  540 1064  834
  \setchemicallinesegment ER2  727  460 1122  754
  \setchemicallinesegment  SR  898  653 1093  794
  \setchemicallinesegment -SR  688  760  688 1000
  \setchemicallinesegment +SR  935  420 1163  345
  \setchemicallinesegment DR1  869  693 1064  834
  \setchemicallinesegment DR2  927  613 1122  754
  %
  \setchemicaltextelement   Z  688  500
  \setchemicaltextelement  RZ 1188  863
  \setchemicaltextelement -RZ  688 1100
  \setchemicaltextelement +RZ 1258  315
  \setchemicaltextelement CRZ 1323  947
  %
  \setchemicalcircsegment   C -36 36 590 72 475 -345
  \setchemicalcircsegment  CC -72  0 590 72 182 -561
  %
  \setchemicaltextelement  ZN  468  350
  \setchemicaltextelement  RN  860  625 % 1.25 Z
  \setchemicaltextelement  RTN 785  728 % .12 / 103 75
  \setchemicaltextelement  RBN 935  522
  %
  \def\processchemical[##1##2##3##4]%
    {\processaction
       [##1##2##3##4]
       [ FRONT????=>{\executechemicalFIVEFRONT[#1]},
            PB:##4=>\beginchemicalpicture{##4},
            PE????=>\endchemicalpicture,
            ROT##4=>\processchemicalrotation{##4},
            SUB##4=>\processchemicalsubstitute{##4},
            ADJ##4=>\processchemicaldistance{##4},
            MOV##4=>\processchemicaltranslate{##4},
            -RZ##4=>\processchemicaltextelement{-RZ}{##4}{#1}{5}
                      {b,l,t,r,r, l,t,r,r,l, t,r,r,l,l, r,b,l,t,r},
            +RZ##4=>\processchemicaltextelement{+RZ}{##4}{#1}{5}
                      {l,t,r,r,b, t,r,r,l,l, r,r,l,l,r, b,l,l,r,r},
            -SB##4=>\processchemicallinesegment{-SB}{##4},
            +SB##4=>\processchemicallinesegment{+SB}{##4},
            -SR##4=>\processchemicallinesegment{-SR}{##4},
            +SR##4=>\processchemicallinesegment{+SR}{##4},
            -RD##4=>\processchemicaldashedlinesegment{-R}{##4},
            +RD##4=>\processchemicaldashedlinesegment{+R}{##4},
            -RB##4=>\processchemicaldeltalinesegment{-R}{##4},
            +RB##4=>\processchemicaldeltalinesegment{+R}{##4},
            CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
RTN##4=>\processchemicaltextconstant{RTN}{##4}{\chemicaltextelementnumber}{0},
RTT##4=>\processchemicaltextelement{RTN}{##4}{#1}{0}{},
RBN##4=>\processchemicaltextconstant{RBN}{##4}{\chemicaltextelementnumber}{0},
RBT##4=>\processchemicaltextelement{RBN}{##4}{#1}{0}{},
            -SS##4=>\processchemicallinesegment{-SS}{##4},
            +SS##4=>\processchemicallinesegment{+SS}{##4},
            CCD##4=>\processchemicaldottsegment{CC}{##4},
          SS##3##4=>\processchemicallinesegment{SS}{##3##4},
          RD##3##4=>\processchemicaldashedlinesegment{R}{##3##4},
          RB##3##4=>\processchemicaldeltalinesegment{R}{##3##4},
          ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
          ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
RN##3##4=>\processchemicaltextconstant{RN}{##3##4}{\chemicaltextelementnumber}{0},
RT##3##4=>\processchemicaltextelement{RN}{##3##4}{#1}{0}{},
          AU##3##4=>\processchemicaluparrowsegment{A}{##3##4},
          AD##3##4=>\processchemicaldownarrowsegment{A}{##3##4},
          CC##3##4=>\processchemicalcircsegment{CC}{##3##4},
          CD##3##4=>\processchemicaldottsegment{C}{##3##4},
          DB##3##4=>\processchemicallinesegment{DB}{##3##4},
          DR##3##4=>\processchemicallinesegment{DR}{##3##4},
          EB##3##4=>\processchemicallinesegment{EB}{##3##4},
          ER##3##4=>\processchemicallinesegment{ER}{##3##4},
          RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{5}
                      {l,l,r,r,r, l,r,r,b,l, r,r,b,l,t, r,l,l,t,r},
          SB##3##4=>\processchemicallinesegment{SB}{##3##4},
          SR##3##4=>\processchemicallinesegment{SR}{##3##4},
          -R##3##4=>\processchemicallinesegment{-R}{##3##4},
          +R##3##4=>\processchemicallinesegment{+R}{##3##4},
        B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
        C##2##3##4=>\processchemicalcircsegment{C}{##2##3##4},
        R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
        S##2##3##4=>\processchemicallinesegment{S}{##2##3##4},
        Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
        \s!unknown=>\unknownchemical{##1##2##3##4}]}}

\def\executechemicalSIX[#1]%
 {\setchemicalname SIX
  %
  \setchemicalmaximum       6
  \setchemicalsubstitute 1375
  \setchemicaldistance    866
  %
  \setchemicalrotation 1  1    0   0 -1     -1    0    0      1
  \setchemicalrotation 2  0.5 -0.866 -0.866 -0.5 -0.5  0.866  0.866  0.5
  \setchemicalrotation 3 -0.5 -0.866 -0.866  0.5  0.5  0.866  0.866 -0.5
  \setchemicalrotation 4 -1    0      0      1    1    0      0     -1
  \setchemicalrotation 5 -0.5  0.866  0.866  0.5  0.5 -0.866 -0.866 -0.5
  \setchemicalrotation 6  0.5  0.866  0.866 -0.5 -0.5 -0.866 -0.866  0.5
  %
  \setchemicalangle 1   0  90 180 270
  \setchemicalangle 2  60 150 240 330
  \setchemicalangle 3 120 210 300  30
  \setchemicalangle 4 180 270   0  90
  \setchemicalangle 5 240 330  60 150
  \setchemicalangle 6 300  30 120 210
  %
  \setchemicaltranslate 1 -1732     0
  \setchemicaltranslate 2  -866  1500
  \setchemicaltranslate 3   866  1500
  \setchemicaltranslate 4  1732     0
  \setchemicaltranslate 5   866 -1500
  \setchemicaltranslate 6  -866 -1500
  %
  \setchemicallinesegment    A 1386   500 1386 -500
  \setchemicallinesegment    S    0  1000  866 -500
  \setchemicallinesegment   SS  125   783  741 -283
  \setchemicallinesegment  -SS    0  1000  741 -283
  \setchemicallinesegment  +SS  125   783  866 -500
  \setchemicallinesegment    B  866   500  866 -500
  \setchemicallinesegment   SB  866   240  866 -240
  \setchemicallinesegment  -SB  866   240  866 -500
  \setchemicallinesegment  +SB  866   500  866 -240
  \setchemicallinesegment  DB1  816   240  816 -240
  \setchemicallinesegment  DB2  916   240  916 -240
  \setchemicallinesegment   EB  726   340  726 -340
  \setchemicallinesegment    R  866   500 1299  750
  \setchemicallinesegment   -R  866   500  866 1000
  \setchemicallinesegment   +R  866   500 1299  250
  \setchemicallinesegment  ER1  841   543 1274  793
  \setchemicallinesegment  ER2  891   457 1324  707
  \setchemicallinesegment   SR 1091   630 1299  750
  \setchemicallinesegment  -SR  866   740  866 1000
  \setchemicallinesegment  +SR 1091   370 1299  250
  \setchemicallinesegment  DR1 1066   673 1274  793
  \setchemicallinesegment  DR2 1116   588 1324  707
  \setchemicallinesegment MID1    0  1000 -150  200
  \setchemicallinesegment MID2    0 -1000 -150 -200
  \setchemicallinesegment MIDS1   0  1000 -180    0
  \setchemicallinesegment MIDS2   0 -1000 -180    0
  %
  \setchemicalcircsegment   C -30 30 700 60 600 -346
  \setchemicalcircsegment  CC -60  0 700 60 350 -606
  %
  \setchemicaltextelement    Z  866  500
  \setchemicaltextelement   RZ 1386  800
  \setchemicaltextelement  -RZ  866 1100
  \setchemicaltextelement  +RZ 1386  200
  \setchemicaltextelement  CRZ 1524  880
  \setchemicaltextelement MIDZ -150    0
  %
  \setchemicaltextelement  ZN   589 350
  \setchemicaltextelement  RN  1083 625  % 1.25 Z
  \setchemicaltextelement  RTN 1008 755  % .12 / 130 75
  \setchemicaltextelement  RBN 1158 495
  %
  \def\processchemical[##1##2##3##4##5]%
    {\processaction
       [##1##2##3##4##5]
       [    FRONT????=>{\executechemicalSIXFRONT[#1]},
              MID????=>\processchemicallinesegment{MID}{1????},
             MIDS????=>\processchemicallinesegment{MIDS}{1????},
             MIDZ????=>\processchemicaltextelement{MIDZ}{1????}{#1}{0}{},
            PB:##4##5=>\beginchemicalpicture{##4##5},
               PE????=>\endchemicalpicture,
            ROT##4##5=>\processchemicalrotation{##4##5},
            SUB##4##5=>\processchemicalsubstitute{##4##5},
            ADJ##4##5=>\processchemicaldistance{##4##5},
            MOV##4##5=>\processchemicaltranslate{##4##5},
            -RZ##4##5=>\processchemicaltextelement{-RZ}{##4##5}{#1}{6}
                      {b,l,l,t,r,r, l,l,r,r,r,l, t,r,r,b,l,l, r,r,l,l,l,r},
            +RZ##4##5=>\processchemicaltextelement{+RZ}{##4##5}{#1}{6}
                      {l,t,r,r,b,l, r,r,r,l,l,l, r,b,l,l,t,r, l,l,l,r,r,r},
            -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
            +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
            -SR##4##5=>\processchemicallinesegment{-SR}{##4##5},
            +SR##4##5=>\processchemicallinesegment{+SR}{##4##5},
            -RD##4##5=>\processchemicaldashedlinesegment{-R}{##4##5},
            +RD##4##5=>\processchemicaldashedlinesegment{+R}{##4##5},
            -RB##4##5=>\processchemicaldeltalinesegment{-R}{##4##5},
            +RB##4##5=>\processchemicaldeltalinesegment{+R}{##4##5},
            CRZ##4##5=>\processchemicaltextelement{CRZ}{##4##5}{#1}{0}{},
            -SS##4##5=>\processchemicallinesegment{-SS}{##4##5},
            +SS##4##5=>\processchemicallinesegment{+SS}{##4##5},
            CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
RTN##4##5=>\processchemicaltextconstant{RTN}{##4##5}{\chemicaltextelementnumber}{0},
RTT##4##5=>\processchemicaltextelement{RTN}{##4##5}{#1}{0}{},
RBN##4##5=>\processchemicaltextconstant{RBN}{##4##5}{\chemicaltextelementnumber}{0},
RBT##4##5=>\processchemicaltextelement{RBN}{##4##5}{#1}{0}{},
          SS##3##4##5=>\processchemicallinesegment{SS}{##3##4##5},
          RD##3##4##5=>\processchemicaldashedlinesegment{R}{##3##4##5},
          RB##3##4##5=>\processchemicaldeltalinesegment{R}{##3##4##5},
          ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
          ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
RN##3##4##5=>\processchemicaltextconstant{RN}{##3##4##5}{\chemicaltextelementnumber}{0},
RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
          AU##3##4##5=>\processchemicaluparrowsegment{A}{##3##4##5},
          AD##3##4##5=>\processchemicaldownarrowsegment{A}{##3##4##5},
          CD##3##4##5=>\processchemicaldottsegment{C}{##3##4##5},
          CC##3##4##5=>\processchemicalcircsegment{CC}{##3##4##5},
          DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
          EB##3##4##5=>\processchemicallinesegment{EB}{##3##4##5},
          ER##3##4##5=>\processchemicallinesegment{ER}{##3##4##5},
          RZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{6}
                      {l,l,t,r,r,b, l,r,r,r,l,l, r,r,b,l,l,t, r,l,l,l,r,r},
          SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
          SR##3##4##5=>\processchemicallinesegment{SR}{##3##4##5},
          DR##3##4##5=>\processchemicallinesegment{DR}{##3##4##5},
          -R##3##4##5=>\processchemicallinesegment{-R}{##3##4##5},
          +R##3##4##5=>\processchemicallinesegment{+R}{##3##4##5},
        B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
        C##2##3##4##5=>\processchemicalcircsegment{C}{##2##3##4##5},
        R##2##3##4##5=>\processchemicallinesegment{R}{##2##3##4##5},
        S##2##3##4##5=>\processchemicallinesegment{S}{##2##3##4##5},
        Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
           \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}

\def\executechemicalSEVEN[#1]% incomplete !
 {\setchemicalname SEVEN
  %
  \setchemicalmaximum        7
  \setchemicalsubstitute     -
  \setchemicaldistance    1038
  %
  \setchemicalrotation 1  .623  .782 - - - - - -
  \setchemicalrotation 2 -.223  .975 - - - - - -
  \setchemicalrotation 3 -.901  .434 - - - - - -
  \setchemicalrotation 4 -.901 -.434 - - - - - -
  \setchemicalrotation 5 -.223 -.975 - - - - - -
  \setchemicalrotation 6  .623 -.782 - - - - - -
  \setchemicalrotation 7     1     0 - - - - - -
  %
  \setchemicalangle 1       0 - - -
  \setchemicalangle 2  51.429 - - -
  \setchemicalangle 3 102.857 - - -
  \setchemicalangle 4 154.286 - - -
  \setchemicalangle 5 205.714 - - -
  \setchemicalangle 6 257.143 - - -
  \setchemicalangle 7 308.571 - - -
  %
  \setchemicaltranslate 1 - -
  \setchemicaltranslate 2 - -
  \setchemicaltranslate 3 - -
  \setchemicaltranslate 4 - -
  \setchemicaltranslate 5 - -
  \setchemicaltranslate 6 - -
  \setchemicaltranslate 7 - -
  %
  \setchemicallinesegment   B 1038 500 1038 -500
  \setchemicallinesegment  SB 1038 240 1038 -240
  \setchemicallinesegment -SB 1038 240 1038 -500
  \setchemicallinesegment +SB 1038 500 1038 -240
  %
  \setchemicaltextelement Z 1038 500
  %
  \def\processchemical[##1##2##3##4##5]%
    {\processaction
       [##1##2##3##4##5]
       [    PB:##4##5=>\beginchemicalpicture{##4##5},
               PE????=>\endchemicalpicture,
           %ROT##4##5=>\processchemicalrotation{##4},
           %SUB##4##5=>\processchemicalsubstitute{##4##5},
           %ADJ##4##5=>\processchemicaldistance{##4##5},
           %MOV##4##5=>\processchemicaltranslate{##4##5},
            -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
            +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
          SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
        B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
        Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
           \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}

\def\executechemicalEIGHT[#1]% incomplete !
 {\setchemicalname EIGHT
  %
  \setchemicalmaximum       8
  %\setchemicalsubstitute 1307
  \setchemicaldistance    1207
  %
  \setchemicalrotation 1  .707  .707 - - - - - -
  \setchemicalrotation 2     0     1 - - - - - -
  \setchemicalrotation 3 -.707  .707 - - - - - -
  \setchemicalrotation 4    -1     0 - - - - - -
  \setchemicalrotation 5 -.707 -.707 - - - - - -
  \setchemicalrotation 6    0     -1 - - - - - -
  \setchemicalrotation 7  .707 -.707 - - - - - -
  \setchemicalrotation 8     1     0 - - - - - -
  %
  \setchemicalangle 1  45 - - -
  \setchemicalangle 2  90 - - -
  \setchemicalangle 3 135 - - -
  \setchemicalangle 4 180 - - -
  \setchemicalangle 5 225 - - -
  \setchemicalangle 6 270 - - -
  \setchemicalangle 7 315 - - -
  \setchemicalangle 8   0 - - -
  %
  \setchemicaltranslate 1 -2414     0
  \setchemicaltranslate 2 -1706  1706
  \setchemicaltranslate 3     0  2414
  \setchemicaltranslate 4  1706  1706
  \setchemicaltranslate 5  2414     0
  \setchemicaltranslate 6  1706 -1706
  \setchemicaltranslate 7     0 -2414
  \setchemicaltranslate 8 -1706 -1706
  %
  \setchemicallinesegment    B 1207 500 1207 -500
  \setchemicallinesegment   SB 1207 240 1207 -240
  \setchemicallinesegment  -SB 1207 240 1207 -500
  \setchemicallinesegment  +SB 1207 500 1207 -240
  %
  \setchemicaltextelement    Z 1207 500
  %
  \def\processchemical[##1##2##3##4##5]%
    {\processaction
       [##1##2##3##4##5]
       [    PB:##4##5=>\beginchemicalpicture{##4##5},
               PE????=>\endchemicalpicture,
           %SUB##4##5=>\processchemicalsubstitute{##4##5},
            ADJ##4##5=>\processchemicaldistance{##4##5},
            MOV##4##5=>\processchemicaltranslate{##4##5},
            -SB##4##5=>\processchemicallinesegment{-SB}{##4##5},
            +SB##4##5=>\processchemicallinesegment{+SB}{##4##5},
          SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
        B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
        Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
           \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}

\def\executechemicalFIVEFRONT[#1]%
 {\executechemicalFIVE[]%
  %
  \setchemicalname FIVEFRONT
  %
  \setchemicallinesegment  -R 688 500 688 100
  \setchemicallinesegment  +R 688 500 688 900
  %
  \setchemicaltextelement -RZ   0 -1300
  \setchemicaltextelement +RZ   0  1300
  %
  \def\processchemical[##1##2##3##4]%
    {\def\chemicalrotation{2}%
     \processaction
       [##1##2##3##4]
       [    -RZ##4=>\processchemicalunrotatedtextelement{Z}{-RZ}{##4}{#1}{5}
                      {,,,,, t,t,t,t,t},
            +RZ##4=>\processchemicalunrotatedtextelement{Z}{+RZ}{##4}{#1}{5}
                      {,,,,, b,b,b,b,b},
            -SB##4=>\processchemicallinesegment{-SB}{##4},
            +SB##4=>\processchemicallinesegment{+SB}{##4},
          SB##3##4=>\processchemicallinesegment{SB}{##3##4},
          -R##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##3##4},
          +R##3##4=>\processchemicalunrotatedlinesegment{b}{+R}{##3##4},
          BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
        R##2##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##2##3##4}%
                    \processchemicalunrotatedlinesegment{b}{+R}{##2##3##4},
        B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
        Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
        \s!unknown=>\unknownchemical{##1##2##3##4}]}}

\def\executechemicalSIXFRONT[#1]%
 {\executechemicalSIX[]%
  %
  \setchemicalname SIXFRONT
  %
  \setchemicallinesegment -R 866 500 866 100
  \setchemicallinesegment +R 866 500 866 900
  %
  \setchemicaltextelement -RZ 0 -1300
  \setchemicaltextelement +RZ 0  1300
  %
  \def\processchemical[##1##2##3##4]%
    {\def\chemicalrotation{2}%
     \processaction
       [##1##2##3##4]
       [    -RZ##4=>\processchemicalunrotatedtextelement{Z}{-RZ}{##4}{#1}{6}
                      {,,,,,, t,t,t,t,t,t},
            +RZ##4=>\processchemicalunrotatedtextelement{Z}{+RZ}{##4}{#1}{6}
                      {,,,,,, b,b,b,b,b,b},
            -SB##4=>\processchemicallinesegment{-SB}{##4},
            +SB##4=>\processchemicallinesegment{+SB}{##4},
          SB##3##4=>\processchemicallinesegment{SB}{##3##4},
          -R##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##3##4},
          +R##3##4=>\processchemicalunrotatedlinesegment{b}{+R}{##3##4},
          BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
        R##2##3##4=>\processchemicalunrotatedlinesegment{t}{-R}{##2##3##4}%
                    \processchemicalunrotatedlinesegment{b}{+R}{##2##3##4},
        B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
        Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
       \s!unknown=>\unknownchemical{##1##2##3##4}]}}

% 1  :    0
% 2  : -115
% 3* : -195
% 3  : -165
% 4  : -245

\def\executechemicalCARBON[#1]%
 {\setchemicalname CARBON
  %
  \setchemicalmaximum    4
  \setchemicaldistance   0
  \setchemicalsubstitute 0
  %
  \setchemicalrotation 1   1      0      0     -1     -1      0      0      1
  \setchemicalrotation 2  -0.423 -0.906 -0.906  0.423  0.423  0.906  0.906 -0.423
  \setchemicalrotation 3  -0.966 -0.259 -0.259  0.966  0.966  0.259  0.259 -0.966
  \setchemicalrotation 3* -0.966  0.259  0.259  0.966  0.966 -0.259 -0.259 -0.966
  \setchemicalrotation 4  -0.423  0.906  0.906  0.423  0.423 -0.906 -0.906 -0.423
  %
  \setchemicalangle 1     0  90 180 270
  \setchemicalangle 2   115 205 295  25
  \setchemicalangle 3   165 255 345  75
  \setchemicalangle 3*  195 285  15 105
  \setchemicalangle 4   245 335  65 155
  %
  \setchemicaltranslate 1 -1500     0
  \setchemicaltranslate 2     0  1500
  \setchemicaltranslate 3  1500     0
  \setchemicaltranslate 4     0 -1500
  %
  \setchemicallinesegment B1   500 0  1000 0
  \setchemicallinesegment B2   300 0  1000 0
  \setchemicallinesegment B3   500 0  1000 0
  \setchemicallinesegment B4   300 0  1000 0
  %
  \setchemicaltextelement  Z  1100 0
  %
  \setchemicalcircsegment  C  0 360 500 360 0  -500
  %
  \def\processchemical[##1##2##3##4##5]%
    {\processaction
       [##1##2##3##4##5]
       [      MIR????=>\setchemicalmirror{3},
             -MIR????=>\resetchemicalmirror{3},
             *MIR????=>\togglechemicalmirror{3},
               CB????=>\processlocalchemicals{B,C,Z},
                C????=>\processchemicalcircsegment{C}{1????},
              -ROT##5=>\reversechemical{ROT}{##5}{3,4,1,2},
            ROT##4##5=>\processchemicalrotation{##4##5},
            MOV##4##5=>\processchemicaltranslate{##4##5},
          CB##3##4##5=>\processlocalchemicals
                         {ROT##3,C,B,Z2..4,
                          MOV##3,*MIR,-ROT##3,C,B,Z2..4},
        B##2##3##4##5=>\processprivatechemicallinesegment{B}{##2##3##4##5},
        Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{4}
                         {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
           \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}

% 1:   45      2:  -90      3: -225
% 4:  -45      5: -135      6: -270

\newif\ifNEWMANstagger  \NEWMANstaggertrue

\def\executechemicalNEWMANSTAGGER%
 {\NEWMANstaggertrue\executechemicalNEWMAN}

\def\executechemicalNEWMANECLIPSE%
 {\NEWMANstaggerfalse\executechemicalNEWMAN}

\def\executechemicalNEWMAN[#1]%
 {\setchemicalname NEWMAN
  %
  \setchemicalmaximum    6
  \setchemicaldistance   0
  \setchemicalsubstitute 0
  %
  \ifNEWMANstagger
    \setchemicalrotation 1  0.707  0.707  0.707 -0.707 -0.707 -0.707 -0.707  0.707
    \setchemicalrotation 2  0     -1     -1      0      0      1      1      0
    \setchemicalrotation 3 -0.707  0.707  0.707  0.707  0.707 -0.707 -0.707 -0.707
  \else
    \setchemicalrotation 1  .866 -.5   -.5   -.866 -.866  .5    .5    .866
    \setchemicalrotation 2 -.259  .966  .966  .259  .259 -.966 -.966 -.259
    \setchemicalrotation 3 -.5   -.866 -.866  .5    .5    .866  .866 -.5
  \fi
  \setchemicalrotation 4  0.707 -0.707 -0.707 -0.707 -0.707  0.707  0.707  0.707
  \setchemicalrotation 5 -0.707 -0.707 -0.707  0.707  0.707  0.707  0.707 -0.707
  \setchemicalrotation 6  0      1      1      0      0     -1     -1      0
  %
  \ifNEWMANstagger
    \setchemicalangle 1 315  45 135 225
    \setchemicalangle 2  90 180 270   0
    \setchemicalangle 3 225 315  45 135
  \else
    \setchemicalangle 1  30 120 210 300
    \setchemicalangle 2 255 345  75 165
    \setchemicalangle 3 120 210 300  30
  \fi
  \setchemicalangle 4  45 135 225 315
  \setchemicalangle 5 135 225 315  45
  \setchemicalangle 6 270   0  90 180
  %
  \setchemicaltranslate 1 -1500     0
  \setchemicaltranslate 2     0  1500
  \setchemicaltranslate 3  1500     0
  \setchemicaltranslate 4     0 -1500
  %
  \setchemicallinesegment B1    0 0  1000 0
  \setchemicallinesegment B2    0 0  1000 0
  \setchemicallinesegment B3    0 0  1000 0
  \setchemicallinesegment B4  500 0  1000 0
  \setchemicallinesegment B5  500 0  1000 0
  \setchemicallinesegment B6  500 0  1000 0
  %
  \setchemicaltextelement  Z 1100 0
  %
  \setchemicalcircsegment  C 0 360 500 360 0 -500
  %
  \def\processchemical[##1##2##3##4]%
    {\processaction
       [##1##2##3##4]
       [STAGGER????=>{\executechemicalNEWMANSTAGGER[#1]},
        ECLIPSE????=>{\executechemicalNEWMANECLIPSE[#1]},
              B????=>\processlocalchemicals{B1..6},
             CB????=>\processlocalchemicals{B1..6,C,Z1..6},
              C????=>\processchemicalcircsegment{C}{1????},
             ROT##4=>\processchemicalrotation{##4},
             MOV##4=>\processchemicaltranslate{##4},
         B##2##3##4=>\processprivatechemicallinesegment{B}{##2##3##4},
         Z##2##3##4=>\ifNEWMANstagger
                       \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
                         {l,t,r,l,r,b, l,r,l,r,r,l, r,b,l,r,l,t, r,l,r,l,l,r}%
                     \else
                       \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
                         {l,r,t,t,r,b, t,b,r,r,b,l, r,l,b,b,l,t, b,t,l,l,t,r}%
                     \fi,
         \s!unknown=>\unknownchemical{##1##2##3##4}]}}

\def\executechemicalCHAIR[#1]% smaller
 {\setchemicalname CHAIR
  %
  \setchemicalmaximum 6
  %
  \setchemicallinesegment  B1  1600  800  2800 -800
  \setchemicallinesegment  B2  2800 -800   800    0
  \setchemicallinesegment  B3   800    0 -1600 -800
  \setchemicallinesegment  B4 -1600 -800 -2800  800
  \setchemicallinesegment  B5 -2800  800  -800    0
  \setchemicallinesegment  B6  -800    0  1600  800
  %
  \setchemicallinesegment +R1  1600  800  1600  1600
  \setchemicallinesegment +R2  2800 -800  2800 -1600
  \setchemicallinesegment +R3   800    0   800   800
  \setchemicallinesegment +R4 -1600 -800 -1600 -1600
  \setchemicallinesegment +R5 -2800  800 -2800  1600
  \setchemicallinesegment +R6  -800    0  -800  -800
  %
  \setchemicallinesegment -R1  1600  800  2350  522 % 750 278
  \setchemicallinesegment -R2  2800 -800  3493 -400
  \setchemicallinesegment -R3   800    0  1329 -600 % 528 600
  \setchemicallinesegment -R4 -1600 -800 -2350 -522 % 750 278
  \setchemicallinesegment -R5 -2800  800 -3493  400
  \setchemicallinesegment -R6  -800    0 -1329  600 % 528 600
  %
  \setchemicaltextelement +RZ1  1600  1800
  \setchemicaltextelement +RZ2  2800 -1800
  \setchemicaltextelement +RZ3   800  1000
  \setchemicaltextelement +RZ4 -1600 -1800
  \setchemicaltextelement +RZ5 -2800  1800
  \setchemicaltextelement +RZ6  -800 -1000
  %
  \setchemicaltextelement -RZ1  2538  453 % 200 lang
  \setchemicaltextelement -RZ2  3666 -300
  \setchemicaltextelement -RZ3  1460 -750
  \setchemicaltextelement -RZ4 -2538 -453
  \setchemicaltextelement -RZ5 -3666  300
  \setchemicaltextelement -RZ6 -1460  750
  %
  \def\processchemical[##1##2##3##4##5]%
    {\def\chemicalrotation{1}%
     \processaction
       [##1##2##3##4##5]
       [      B????=>\processlocalchemicals{B1,B2,B3,B4,B5,B6},
             -R????=>\processlocalchemicals{-R1,-R2,-R3,-R4,-R5,-R6},
             +R????=>\processlocalchemicals{+R1,+R2,+R3,+R4,+R5,+R6},
           B##2????=>{\getchemicallinesegment[0][B##2]},
         -RZ##4????=>{\getchemicalfixedtextelement[-RZ##4][1][##4][l,l,tc,r,r,bc][#1]},
         +RZ##4????=>{\getchemicalfixedtextelement[+RZ##4][1][##4][c][#1]},
          -R##3????=>{\getchemicallinesegment[0][-R##3]},
          +R##3????=>{\getchemicallinesegment[0][+R##3]},
         \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}

\def\executechemicalarrow#1#2[#3]%
 {\dogetcommalistelement1\from#3\to\toptext
  \dogetcommalistelement2\from#3\to\bottext
  \def\dochemicaltext##1%
    {\dosetsubscripts%
     $\@@dochemicalstyle{\@@localchemicalformat\strut##1}$%
     \doresetsubscripts}%
  \doifelse\@@chemicallocation\v!intext
    {#1{\dochemicaltext\toptext}}%
    {\setbox\chemicalsymbols=\hbox
       {\box\chemicalsymbols
        \vbox{\halign{##\cr
          \hbox to 3em{\hss\dochemicaltext{\toptext}\hss}\cr
          #2%
          \hbox to 3em{\hss\dochemicaltext{\bottext}\hss}\cr}}}}}

\def\executechemicalGIVES
 {\executechemicalarrow
    {\chemicalsinglepicturearrow}% nodig
    {\rightarrowfill\cr}}

\def\executechemicalEQUILIBRIUM
 {\executechemicalarrow
    {\chemicaldoublepicturearrow}%  nodig
    {\rightarrowfill\cr\leftarrowfill\cr}}

\def\executechemicalMESOMERIC
 {\executechemicalarrow
    {\chemicalsinglepicturearrow}%  nodig
    {$\leftarrow\hskip-1em$\rightarrowfill\cr}}

\def\executechemicalsign#1[#2]%
 {\doifelse\@@chemicallocation\v!intext
    {\dosetsubscripts
     $\@@dochemicalstyle{\@@localchemicalformat#1}$%
     \doresetsubscripts}
    {\setbox\chemicalsymbols\hbox
       {\box\chemicalsymbols
        \dosetsubscripts
        $\@@dochemicalstyle{\@@localchemicalformat#1}$%
        \doresetsubscripts}}}

\def\executechemicalPLUS
 {\executechemicalsign{+}}

\def\executechemicalMINUS
 {\executechemicalsign{-}}

\def\executechemicalEQUAL
 {\executechemicalsign{=}}

\def\executechemicalSPACE[#1]%
 {\doifnot\@@chemicallocation\v!intext
    {\setbox\chemicalsymbols\hbox
       {\box\chemicalsymbols
        \quad}}}

\def\executechemicalCHEM[#1]%
 {\doifnot\@@chemicallocation\v!intext
    {\setbox\chemicalsymbols\hbox
       {\box\chemicalsymbols
        $\@@dochemicalstyle{\@@localchemicalformat#1}$}}}

\def\executechemicalTEXT[#1]%
 {\doifnot\@@chemicallocation\v!intext
    {\setbox\chemicalsymbols\hbox
       {\box\chemicalsymbols#1}}}

%\def\executechemicalLOW[#1]%
%  {\setlowsubscripts}
%
%\def\executechemicalHIGH[#1]%
%  {\sethighsubscripts}

\def\putchemicalrule#1#2#3#4%
 {\ifcase\chemicaldrawingmode
    \putrule from {#1} {#2} to {#3} {#4}
  \or
    \psline(#1,#2)(#3,#4)%
  \or
    \bgroup
    \!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
    \global\MPdrawingdonetrue
    \setchemicalattributes
    \startMPdrawing
      x1 := \MPdivten[\the\!!counta]u ;
      y1 := \MPdivten[\the\!!countb]u ;
      x2 := \MPdivten[\the\!!countc]u ;
      y2 := \MPdivten[\the\!!countd]u ;
      draw z1--z2 ;
    \stopMPdrawing
    \egroup
  \fi}

\def\executechemicalcomplex#1%
 {\bgroup
  \putchemicalrule {0} {-\@@chemicalbottom}     {0}  {\@@chemicaltop}%
  \putchemicalrule {0}  {\@@chemicaltop}    {#1150}  {\@@chemicaltop}%
  \putchemicalrule {0} {-\@@chemicalbottom} {#1150} {-\@@chemicalbottom}%
  \egroup}

\def\executechemicalOPENCOMPLEX[#1]%
 {\executechemicalcomplex+\ignorespaces
  \executechemicalSPACE[]}

\def\executechemicalCLOSECOMPLEX[#1]%
 {\executechemicalSPACE[]%
  \executechemicalcomplex-\ignorespaces}

% nog niet door midden as!

\def\executechemicalverticalsymbol#1#2%
 {\executechemicalTEXT
    [$\left#1\relax
      \dimen0=\@@chemicalunit
      \scratchcounter=\@@chemicaltop
      \advance\scratchcounter by \@@chemicalbottom
      \dimen0=\scratchcounter\dimen0
      \vcenter to \dimen0{}
      \dimen2=\@@chemicalunit
      \dimen2=\@@chemicalright\dimen0
      \vcenter{\leftskip1em\hsize\dimen2\relax\strut#2\strut}%
      \right.$]}%

\def\executechemicalUPARROW[#1]%
 {\executechemicalverticalsymbol\uparrow{#1}}

\def\executechemicalDOWNARROW[#1]%
 {\executechemicalverticalsymbol\downarrow{#1}}

\def\executechemicalUPDOWNARROW[#1]%
 {\executechemicalverticalsymbol\updownarrow{#1}}

\let\setchemicalattributes\relax

\setupchemical
 [\c!width=0,
  \c!height=0,
  \c!left=0,
  \c!right=0,
  \c!top=0,
  \c!bottom=0,
  \c!bodyfont=\the\bodyfontsize,
  \c!resolution=\outputresolution,
  \c!scale=\v!medium,
  \c!size=\v!medium,
  \c!textsize=\v!big,
  \c!frame=\v!off,
  \c!axis=\v!off,
  \c!state=\v!start,
  \c!style=\rm,
  \c!location=,
  \c!option=,
  \c!offset=LOW,
  \c!alternative=1,
  \c!color=,
  \c!rulethickness=,
  \c!rulecolor=]

% Tijdelijk plaatsen we deze extra macro's hier.
%
% mathontop: \mtop {} {}
% textontop: \ttop {} {}

\def\putontop#1#2%
 {\vbox
    {\halign
       {\strut\hss##\hss\cr
        #1\cr
        #2\cr}}}

\def\ttop#1#2%
 {\putontop{\tx#1}{#2}}

\def\mtop#1#2%
 {\vbox
    {\offinterlineskip
     \halign
       {\hss##\hss\cr
        $\scriptscriptstyle#1$\cr
        \noalign{\vskip.5ex}%
        $#2$\cr}}}

\def\ctop#1#2%
 {\vbox
    {\offinterlineskip
     \halign
       {\hss##\hss\cr
        $\@@dochemicalstyle{\@@localchemicalformat\scriptscriptstyle#1}$\cr
        \noalign{\vskip.5ex}%
        $\@@dochemicalstyle{\@@localchemicalformat#2}$\cr}}}

%D Here are a couple of \CONTEXT\ goodies:
%D
%D \startitemize
%D \item styles hooked into \CONTEXT\ style mechanism
%D \item support for color and rulethickness (mp mode only)
%D \item position tracking
%D \stopopsoming

\ifCONTEXT \else \protect \endinput \fi

\def\setchemicalattributes
 {\scratchdimen\@@chemicalchemicalrulethickness
  \def\chemicalattributes
    {withpen pencircle scaled \the\scratchdimen\space
     withcolor }%
  \doifelsenothing\@@chemicalchemicalrulecolor
    {\edef\chemicalattributes{\chemicalattributes black}}
    {\edef\chemicalattributes
       {\chemicalattributes \MPcolor{\@@chemicalchemicalrulecolor}}}%
  \startMPdrawing
    drawoptions (\chemicalattributes) ;
  \stopMPdrawing}

\let\@@chemicalcolor\empty

\def\@@dochemicalcolor
 {\doifsomething\@@chemicalcolor{\color[\@@chemicalcolor]}}

\def\@@dochemicalstyle
 {\doconvertfont\@@chemicalstyle}

\setupchemical
 [\c!rulethickness=\linewidth,
  \c!rulecolor=,
  \c!color=]

\def\cpos#1#2%
 {\iftrialtypesetting
    #2%
  \else
    \bgroup
    \globalpushmacro\dowithchemical
    \gdef\dowithchemical##1{\hpos{#1}{##1}\globalpopmacro\dowithchemical}%
    #2%
    \egroup
 \fi}

\protect \endinput