% --------------------------------------------------------------------------
% the MYCHEMISTRY package
%
%   create reaction schemes with LaTeX and chemfig
%
% --------------------------------------------------------------------------
% Clemens Niederberger
% Web:    https://www.bitbucket.org/cgnieder/mychemistry
% E-Mail: contact@mychemistry.eu
% --------------------------------------------------------------------------
% If you have any ideas, questions, suggestions or bugs to report, please
% feel free to contact me.
% --------------------------------------------------------------------------
% Copyright 2011--2012 Clemens Niederberger
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Clemens Niederberger.
%
% This work consists of the files mychemistrysty, mychemistry_en.tex,
% README and the derived file mychemistry_en.pdf.
% --------------------------------------------------------------------------
\ProvidesPackage{mychemistry}[2012/09/20 v1.99a create reaction schemes with LaTeX and chemfig]
\RequirePackage{etoolbox,float,xkeyval,chemfig,chemmacros}
\usetikzlibrary{
  arrows,
  positioning,
  decorations.pathmorphing,
  shapes,
  calc,
  matrix,
  chains,
  scopes,
  intersections}

% --------------------------------------------------------------------------
% Tools
\newif\ifmCh@strict
\newif\ifmCh@draft
\def\mCh@if@strict{%
  \ifmCh@strict\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}

\def\mCh@error#1#2{%
  \mCh@if@strict
    {\PackageError{mychemistry}{#1}{#2}}
    {\PackageWarning{mychemistry}{#1}{#2}}}

\def\mCh@strict@error#1#2{%
  \begingroup
    \mCh@stricttrue
    \mCh@error{#1}{#2}%
  \endgroup}

\def\mCh@def#1{%
  \ifdef{#1}{%
    \mCh@strict@error{already defined}{mychemistry tries to define \string#1 but
      it seems it is already defined. Please contact the author.}%
      \@gobble
  }{\def#1}}

% "variablen" definieren
\mCh@def\mCh@strip@bs{\expandafter\@gobble\string}
\mCh@def\mCh@ifis@variable#1#2#3{%
  \ifcsdef{mCh@variable@\mCh@strip@bs#1}
    {#2}
    {\mCh@error{variable \string#1 undefined}{}#3}}
\mCh@def\mCh@new@variable#1{%
  \ifcsdef{mCh@variable@\mCh@strip@bs#1}
    {\mCh@error{variable \string#1 already defined. I'm doing nothing!}{}}
    {\csdef{mCh@variable@\mCh@strip@bs#1}{}\csdef{mCh@\mCh@strip@bs#1}{}}}
\mCh@def\mCh@set@variable#1#2{%
  \mCh@ifis@variable{#1}{\csdef{mCh@\mCh@strip@bs#1}{#2}}{\@gobble}}
\mCh@def\mCh@xset@variable#1#2{%
  \mCh@ifis@variable{#1}{\csedef{mCh@\mCh@strip@bs#1}{#2}}{\@gobble}}
\mCh@def\mCh@clear@variable#1{%
  \mCh@ifis@variable{#1}{\csdef{mCh@\mCh@strip@bs#1}{}}{}}
\mCh@def\mCh@let@variable#1#2{%
  \mCh@ifis@variable{#1}{\mCh@ifis@variable{#2}
    {\csletcs{mCh@\mCh@strip@bs#1}{mCh@\mCh@strip@bs#2}}{}}{}}
\mCh@def\mCh@empty@variable#1{%
  \mCh@ifis@variable{#1}{\cslet{mCh@\mCh@strip@bs#1}\@empty}{}}
\mCh@def\mCh@ifeq@variable#1#2#3#4{%
  \mCh@ifis@variable{#1}{\mCh@ifis@variable{#2}
    {\ifcsequal{mCh@\mCh@strip@bs#1}{mCh@\mCh@strip@bs#2}{#3}{#4}}{}}{}}
\mCh@def\mCh@ifempty@variable#1#2#3{%
  \ifcsequal{mCh@\mCh@strip@bs#1}{@empty}{#2}{#3}}

\mCh@new@variable\true
\mCh@new@variable\false

\mCh@set@variable\true{true}
\mCh@set@variable\false{false}

% Optional Argument Analysis
% is #2 part of #1? (inspired by \CF@if@instr by Christian Tellechea)
\mCh@def\mCh@if@instr#1#2{%
  \def\mCh@if@instr@i##1#2##2\@nil{%
    \ifstrempty{##2}{\@secondoftwo}{\@firstoftwo}}%
  \mCh@if@instr@i#1\@@nil#2\@nil
}

\mCh@new@variable\firstarg
\mCh@new@variable\secondarg
\mCh@new@variable\thirdarg

% Am ersten , splitten, #1 in #3 speichern, #2 in \mCh@remainargs
% (das Makro ist eine Kopie von \CF@analyze@movearg in chemfig.tex von Christian Tellechea)
\mCh@def\mCh@splitfirst#1,#2\@nil#3{%
  \def#3{#1}\def\mCh@remainargs{#2}%
}

% ein durch , in 3 Teile getrenntes Argument splitten
% (das Makro ist eine Abwandlung von \CF@analyze@movearg in chemfig.tex von Christian Tellechea)
\mCh@def\mCh@splitarg#1{%
  \mCh@if@instr{#1}{,}
    {\expandafter\mCh@splitfirst#1\@nil\mCh@firstarg}
    {\mCh@set@variable\firstarg{#1}}%
  \expandafter\mCh@if@instr\expandafter{\mCh@remainargs}{,}
    {\expandafter\mCh@splitfirst\mCh@remainargs\@nil\mCh@secondarg}{\expandafter\mCh@set@variable\expandafter\secondarg\expandafter{\mCh@remainargs}}%
  \ifx\mCh@remainargs\mCh@secondarg
    \mCh@empty@variable\thirdarg
  \else
    \expandafter\mCh@set@variable\expandafter\thirdarg\expandafter{\mCh@remainargs}%
  \fi
}

% --------------------------------------------------------------------------
% options
\define@key[MC]{mychemistry.sty}{strict}{\mCh@stricttrue}
\DeclareOptionX[MC]{strict}{\mCh@stricttrue}

\define@key[MC]{mychemistry.sty}{draft}{\mCh@stricttrue\mCh@drafttrue}
\DeclareOptionX[MC]{draft}{\mCh@stricttrue\mCh@drafttrue}

\define@key[MC]{mychemistry.sty}{final}{\mCh@strictfalse\mCh@draftfalse}
\DeclareOptionX[MC]{final}{\mCh@strictfalse\mCh@draftfalse}

\mCh@new@variable\rs@placement
\mCh@new@variable\rs@currentplacement

\mCh@set@variable\rs@placement{hpt}
\mCh@let@variable\rs@currentplacement\rs@placement

\define@key[MC]{mychemistry.sty}{placement}{%
  \mCh@set@variable\rs@placement{#1}}

\ProcessOptionsX[MC]

% --------------------------------------------------------------------------
% language settings
\mCh@new@variable\rs@name
\mCh@set@variable\rs@name{Reaction scheme}

\IfFileExists{translator.sty}{%
  \RequirePackage{translator}
  \usedictionary{translator-basic-dictionary}
  \languagealias{ngerman}{German}
  \languagealias{german}{German}
  \languagealias{austrian}{German}
  \languagealias{naustrian}{German}
  \languagealias{french}{French}
  \languagealias{canadien}{French}
  \languagealias{italian}{Italian}
  \languagealias{spanish}{Spanish}
  \providetranslation[to=English]{reaction-scheme-(caption-title)}{Reaction scheme}
  \providetranslation[to=BritishEnglish]{reaction-scheme-(caption-title)}{Reaction scheme}
  \providetranslation[to=AmericanEnglish]{reaction-scheme-(caption-title)}{Reaction scheme}
  \providetranslation[to=French]{reaction-scheme-(caption-title)}{Sch\'{e}ma r\'{e}actionnel}
  \providetranslation[to=German]{reaction-scheme-(caption-title)}{Reaktionsschema}
  \providetranslation[to=Italian]{reaction-scheme-(caption-title)}{Reazione Scheme}
  \providetranslation[to=Spanish]{reaction-scheme-(caption-title)}{Esquema de Reacci\'{o}n}
  \mCh@set@variable\rs@name{\translate{reaction-scheme-(caption-title)}}
}{}

% --------------------------------------------------------------------------
% Direction Analysis
% Richtungen:
\mCh@new@variable\r
\mCh@new@variable\ar
\mCh@new@variable\a
\mCh@new@variable\al
\mCh@new@variable\l
\mCh@new@variable\br
\mCh@new@variable\b
\mCh@new@variable\bl

\mCh@set@variable\r{right}
\mCh@set@variable\ar{above right}
\mCh@set@variable\a{above}
\mCh@set@variable\al{above left}
\mCh@set@variable\l{left}
\mCh@set@variable\br{below right}
\mCh@set@variable\b{below}
\mCh@set@variable\bl{below left}

\mCh@new@variable\vert@i
\mCh@new@variable\vert@ii
\mCh@new@variable\vert@iii

\mCh@set@variable\vert@i{90}
\mCh@set@variable\vert@ii{-90}
\mCh@set@variable\vert@iii{270}

% Richtung in Bezug auf node oder nicht?
\mCh@new@variable\direction

\mCh@def\mCh@split@angle#1.#2\@nil#3{%
  \def#3{#1}\mCh@set@variable\direction{#2}}
\mCh@def\mCh@wowo@node#1{%
  \mCh@if@instr{#1}{.}
    {\expandafter\mCh@split@angle#1\@nil\mCh@referred@node}
    {\mCh@set@variable\direction{#1}}}

% Winkel bestimmen:
\mCh@new@variable\angle
\mCh@new@variable\referred@node

\mCh@def\mCh@analyze@angle#1{%
  \mCh@empty@variable\angle
  \mCh@empty@variable\referred@node
  \mCh@wowo@node{#1}%
  \mCh@ifeq@variable\direction\r  {\mCh@set@variable\angle{0}}{}%
  \mCh@ifeq@variable\direction\ar {\mCh@set@variable\angle{45}}{}%
  \mCh@ifeq@variable\direction\a  {\mCh@set@variable\angle{90}}{}%
  \mCh@ifeq@variable\direction\al {\mCh@set@variable\angle{135}}{}%
  \mCh@ifeq@variable\direction\l  {\mCh@set@variable\angle{180}}{}%
  \mCh@ifeq@variable\direction\bl {\mCh@set@variable\angle{225}}{}%
  \mCh@ifeq@variable\direction\b  {\mCh@set@variable\angle{270}}{}%
  \mCh@ifeq@variable\direction\br {\mCh@set@variable\angle{315}}{}%
  \mCh@ifempty@variable\angle{%
    \pgfmathparse{\mCh@direction <0 ? int(\mCh@direction+360) : int(\mCh@direction) }%
    \mCh@xset@variable\angle{\pgfmathresult}%
  }{}%
}
% --------------------------------------------------------------------------
% PFEILE
% \arrow[<pos>,<type>,<length factor>,<name>,both,<tikz>]{<above>}{<below>}
% Pfeiltypen:
\mCh@new@variable\arrow@type@def
\mCh@new@variable\arrow@type@eqv
\mCh@new@variable\arrow@type@back
\mCh@new@variable\arrow@type@eq
\mCh@new@variable\arrow@type@eqq
\mCh@new@variable\arrow@type@eeq
\mCh@new@variable\arrow@type@not
\mCh@new@variable\arrow@type@pm

\mCh@set@variable\arrow@type@def{->}
\mCh@set@variable\arrow@type@eqv{<->}
\mCh@set@variable\arrow@type@back{<-}
\mCh@set@variable\arrow@type@eq{<=>}
\mCh@set@variable\arrow@type@eqq{<=>>}
\mCh@set@variable\arrow@type@eeq{<<=>}
\mCh@set@variable\arrow@type@not{-|>}
\mCh@set@variable\arrow@type@pm{-+>}

% Voreinstellungen
% Pfeillänge
\mCh@new@variable\arrow@length@def
\mCh@new@variable\arrow@length
\mCh@new@variable\arrow@factor

\mCh@set@variable\arrow@length@def{4em}
\let\mCh@arrow@length\mCh@arrow@length@def
\mCh@set@variable\arrow@factor{1}

\newrobustcmd\setarrowlength[1]{%
  \ifblank{#1}
    {\mCh@let@variable\arrow@length\arrow@length@def}
    {\mCh@set@variable\arrow@length{#1}}}

% Label-Abstand
\mCh@new@variable\arrow@label@dist@def
\mCh@new@variable\arrow@label@dist

\mCh@set@variable\arrow@label@dist@def{.2em}
\mCh@let@variable\arrow@label@dist\arrow@label@dist@def

\newrobustcmd\setarrowlabel[1]{%
  \ifblank{#1}
    {\mCh@let@variable\arrow@label@dist\arrow@label@dist@def}
    {\mCh@set@variable\arrow@label@dist{#1}}}

% Pfeildicke
\mCh@new@variable\arrow@linethickness@default
\mCh@new@variable\arrow@linethickness

\mCh@set@variable\arrow@linethickness@default{semithick}
\mCh@let@variable\arrow@linethickness\arrow@linethickness@default

\newrobustcmd\setarrowline[1]{%
  \ifblank{#1}
    {\mCh@let@variable\arrow@linethickness\arrow@linethickness@default}
    {\mCh@set@variable\arrow@linethickness{#1}}}

% Winkel untersuchen, um Label richtig anzubringen
\mCh@new@variable\beta
\mCh@new@variable\arrow@label@anchor@up
\mCh@new@variable\arrow@label@anchor@down
\mCh@new@variable\arrow@label@anchor@add
\mCh@new@variable\arrow@label@anchor@sub
\newcount\mCh@alpha

\mCh@def\mCh@evaluate@angle#1{
  \mCh@alpha=#1
  \pgfmathparse{cos(\mCh@alpha) > 0}
  \ifnum\pgfmathresult=1
    \mCh@set@variable\beta{#1}%
    \mCh@set@variable\arrow@label@anchor@up{south}%
    \mCh@set@variable\arrow@label@anchor@down{north}%
    \ifnum\mCh@alpha<180
      \mCh@set@variable\arrow@label@anchor@add{east}%
      \mCh@set@variable\arrow@label@anchor@sub{south}%
    \else
      \mCh@set@variable\arrow@label@anchor@add{south}%
      \mCh@set@variable\arrow@label@anchor@sub{west}%
    \fi
  \else
    \pgfmathparse{cos(\mCh@alpha) == 0}%
    \ifnum\pgfmathresult=1
      \mCh@set@variable\beta{0}%
      \ifnum\mCh@alpha=90
        \mCh@set@variable\arrow@label@anchor@up{east}%
        \mCh@set@variable\arrow@label@anchor@down{west}%
        \mCh@set@variable\arrow@label@anchor@add{east}%
        \mCh@set@variable\arrow@label@anchor@sub{east}%
      \else
        \mCh@set@variable\arrow@label@anchor@up{west}%
        \mCh@set@variable\arrow@label@anchor@down{east}%
        \mCh@set@variable\arrow@label@anchor@add{west}%
        \mCh@set@variable\arrow@label@anchor@sub{west}%
      \fi
    \else
      \mCh@set@variable\arrow@label@anchor@up{north}%
      \mCh@set@variable\arrow@label@anchor@down{south}%
      \ifnum\mCh@alpha=180
        \mCh@set@variable\beta{180-#1}%
        \mCh@set@variable\arrow@label@anchor@add{north}%
        \mCh@set@variable\arrow@label@anchor@sub{north}%
      \fi
      \ifnum\mCh@alpha>180
        \mCh@set@variable\beta{180+#1}%
        \mCh@set@variable\arrow@label@anchor@add{west}%
        \mCh@set@variable\arrow@label@anchor@sub{north}%
      \fi
      \ifnum\mCh@alpha<180
        \mCh@set@variable\beta{180+#1}%
        \mCh@set@variable\arrow@label@anchor@add{north}%
        \mCh@set@variable\arrow@label@anchor@sub{east}%
      \fi
    \fi
  \fi
}

% Maße der Nodes der Pfeilargumente bestimmen, größere später an Pfeil weitergeben
\mCh@new@variable\arrow@both
\mCh@set@variable\arrow@both{both}

\newlength{\mCh@height@A}
\newlength{\mCh@height@B}
\newlength{\mCh@arrow@label@height}
\newlength{\mCh@width@A}
\newlength{\mCh@width@B}
\newlength{\mCh@arrow@label@width}

\mCh@def\mCh@savenode{%
  \global\let\mCh@minx=\pgfpositionnodelaterminx
  \global\let\mCh@maxx=\pgfpositionnodelatermaxx
  \global\let\mCh@miny=\pgfpositionnodelaterminy
  \global\let\mCh@maxy=\pgfpositionnodelatermaxy
}

% der nächste Befehl benötigt pgf v2.10!
\mCh@def\mCh@largernode#1#2{%
  \ifdef\pgfpositionnodelater{%
    \pgfpositionnodelater{\mCh@savenode}%
    \node{#1};
    \deflength{\mCh@width@A}{\mCh@maxx-\mCh@minx}%
    \deflength{\mCh@height@A}{\mCh@maxy-\mCh@miny}%
    \node{#2};
    \deflength{\mCh@width@B}{\mCh@maxx-\mCh@minx}%
    \deflength{\mCh@height@B}{\mCh@maxy-\mCh@miny}%
    \pgfmathsetlength{\mCh@arrow@label@width}{max(\mCh@width@A,\mCh@width@B)}%
    \pgfmathsetlength{\mCh@arrow@label@height}{max(\mCh@height@A,\mCh@height@B)}%
    \global\mCh@arrow@label@width=\mCh@arrow@label@width
    \global\mCh@arrow@label@height=\mCh@arrow@label@height
  }{%
    \mCh@error{%
      The command \string\pgfpositionnodelater\space is undefined. Make sure,
      you have installed the latest version of pgf}{}%
  }%
}

% Pfeil zeichnen:
\newrobustcmd\mCh@arrow[3][]{%
  \ifstrempty{#1}
    {\mCh@arrow@i}{\mCh@arrow@ii[#1]}
  {#2}{#3}}

\mCh@def\mCh@arrow@i#1#2{%
  \node[on chain=going {at=(\tikzchainprevious.0)},
    minimum size=0,
    inner sep=3pt,
    outer sep=0,
    anchor=180,
    shift=(0:.5*\mCh@rxn@node@distance)] (@mCh@arrow@start){};
  \node[on chain=going {at=(\tikzchainprevious.0),
    shift=($(0:.5*\mCh@arrow@factor*\mCh@arrow@length)$)},
    minimum size=0,
    inner sep=3pt,
    outer sep=0] (@mCh@arrow@end){};
  \draw[-mCtip,\mCh@arrow@linethickness]
    let \n1={0}, \n2={180}
    in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center){}
      ++($(0:\mCh@arrow@factor*\mCh@arrow@length)$);
  \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
    rotate=0,
    anchor=south,
    inner sep=0]
    at ($(mCh@arrow@center)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#1};
  \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
    rotate=0,
    anchor=north,
    inner sep=0]
    at ($(mCh@arrow@center)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#2};
}

\mCh@new@variable\arrow@plusminus
\mCh@new@variable\anchor
\mCh@new@variable\arrow@tikz
\mCh@new@variable\arrow@type@valid
\mCh@new@variable\arrow@type
\mCh@new@variable\arrow@type@actual
\mCh@new@variable\arrow@name

\mCh@def\mCh@arrow@ii[#1]#2#3{%
  \mCh@empty@variable\arrow@plusminus
  \mCh@empty@variable\arrow@type
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}%
  \mCh@ifempty@variable\firstarg{% erste Option: Richtung
    \mCh@set@variable\angle{0}%
    \mCh@set@variable\beta{0}%
    \mCh@set@variable\arrow@label@anchor@up{south}%
    \mCh@set@variable\arrow@label@anchor@down{north}%
    \mCh@set@variable\arrow@label@anchor@add{south}%
    \mCh@set@variable\arrow@label@anchor@sub{south}%
    \mCh@set@variable\anchor{180}%
    \mCh@empty@variable\referred@node
  }{%
    \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}%
    \mCh@set@variable\anchor{180+\mCh@angle}%
    \mCh@evaluate@angle{\mCh@angle}%
  }
  \mCh@ifempty@variable\referred@node{%
    \mCh@set@variable\referred@node{\tikzchainprevious}%
  }{}%
  \mCh@ifempty@variable\secondarg{}{% zweite Option: Typ
    \mCh@set@variable\arrow@type{true}
    \mCh@let@variable\arrow@type@actual\secondarg
  }%
  \let\mCh@remainargs\@empty%
  \expandafter\mCh@splitarg\expandafter{\mCh@thirdarg}%
  \mCh@ifempty@variable\firstarg{% dritte Option: Längenfaktor
    \mCh@set@variable\arrow@factor{1}%
  }{%
    \mCh@xset@variable\arrow@factor{\mCh@firstarg}%
  }%
  \mCh@ifempty@variable\secondarg{% vierte Option: Name
    \mCh@set@variable\arrow@name{mCh@arrow@center}%
  }{%
    \mCh@xset@variable\arrow@name{\mCh@secondarg}%
  }%
  \let\mCh@remainargs\@empty%
  \expandafter\mCh@splitarg\expandafter{\mCh@thirdarg}%
  \mCh@ifeq@variable\arrow@both\firstarg% fünfte Option: both
    {{\mCh@largernode{#2}{#3}}}%
    {%
      \deflength{\mCh@arrow@label@width}{0pt}%
      \deflength{\mCh@arrow@label@height}{0pt}%
    }%
  \mCh@ifempty@variable\secondarg{% sechste Option: tikz
    \mCh@empty@variable\arrow@tikz
  }{%
    \mCh@xset@variable\arrow@tikz{\mCh@secondarg,\mCh@thirdarg}%
  }%
  \node[on chain=going {at=(\mCh@referred@node.\mCh@angle)},
    minimum size=0,
    inner sep=3pt,
    outer sep=0,
    anchor=\mCh@anchor,
    shift=(\mCh@angle:.5*\mCh@rxn@node@distance)] (@mCh@arrow@start){};
  \node[on chain=going {at=(\tikzchainprevious.\mCh@angle),
    shift=($(\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$)},
    minimum size=0,
    inner sep=3pt,
    outer sep=0] (@mCh@arrow@end){};
  \mCh@ifeq@variable\arrow@type\true{%
    \mCh@let@variable\arrow@type@valid\false
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@eq{% <=>
      \mCh@let@variable\arrow@type@valid\true
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        -mChtip,
        \mCh@arrow@linethickness]
        let \n1={20+\mCh@angle}, \n2={160+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@up){}
          ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        mChtip-,
        \mCh@arrow@linethickness]
        let \n1={-20+\mCh@angle}, \n2={200+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@down){}
          ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \draw[draw=none]
        let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
          ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@up,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0]
        at ($(mCh@arrow@center@up)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2};
      \expandafter\node[\expandafter\mCh@arrow@downlabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@down,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0]
        at ($(mCh@arrow@center@down)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3};
    }{}%
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@eqq{% <=>>
      \mCh@let@variable\arrow@type@valid\true
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        -mChtip,
        \mCh@arrow@linethickness]
        let \n1={20+\mCh@angle}, \n2={160+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@up){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        mChtip-,
        \mCh@arrow@linethickness]
        let \n1={-20+\mCh@angle}
        in ($(@mCh@arrow@start.\n1)+(\mCh@angle:.25*\mCh@arrow@factor*\mCh@arrow@length)$)
          --node[pos=.5,inner sep=0](mCh@arrow@center@down){}
          ++($(\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$);
      \draw[draw=none] let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@up,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0]
        at ($(mCh@arrow@center@up)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2};
      \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@down,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0]
        at ($(mCh@arrow@center@down)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3};
    }{}%
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@eeq{% <<=>
      \mCh@let@variable\arrow@type@valid\true
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        -mChtip,
        \mCh@arrow@linethickness]
        let \n1={20+\mCh@angle}, \n2={160+\mCh@angle}
        in ($(@mCh@arrow@start.\n1)+(\mCh@angle:.25*\mCh@arrow@factor*\mCh@arrow@length)$)
        --node[pos=.5,inner sep=0](mCh@arrow@center@up){}
        ++($(\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        mChtip-,
        \mCh@arrow@linethickness]
        let \n1={-20+\mCh@angle}, \n2={200+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@down){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \draw[draw=none]
        let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@up,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0]
        at ($(mCh@arrow@center@up)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2};
      \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@down,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0]
        at ($(mCh@arrow@center@down)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3};
    }{}%
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@def{% ->
      \mCh@let@variable\arrow@type@valid\true
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        -mCtip,
        \mCh@arrow@linethickness,
        \mCh@arrow@tikz]
        let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@up,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height]
        at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2};
      \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@down,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height]
        at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3};
    }{}%
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@eqv{% <->
      \mCh@let@variable\arrow@type@valid\true
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        mCtip-mCtip,
        \mCh@arrow@linethickness]
        let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@up,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,inner sep=0]
        at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2};
      \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@down,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,inner sep=0]
        at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3};
    }{}%
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@back{% <-
      \mCh@let@variable\arrow@type@valid\true
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        mCtip-,
        \mCh@arrow@linethickness]
        let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@up,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0] at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2};
      \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@down,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0]
        at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3};
    }{}%
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@not{% -|>
      \mCh@let@variable\arrow@type@valid\true
      \expandafter\draw\expandafter[\mCh@arrow@tikz,
        -mCtip,
        \mCh@arrow@linethickness]
        let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
      \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@up,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,
        inner sep=0] at ($(\mCh@arrow@name)!.8em!90:(@mCh@arrow@end)$){#2};
      \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
        rotate=\mCh@beta,
        anchor=\mCh@arrow@label@anchor@down,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height,inner sep=0]
        at ($(\mCh@arrow@name)!.8em!-90:(@mCh@arrow@end)$){#3};
      \draw ($(mCh@arrow@center)!.6em!-110:(@mCh@arrow@end)+(\mCh@angle:.1em)$)
        --($(mCh@arrow@center)!.6em!70:(@mCh@arrow@end)+(\mCh@angle:.1em)$);
      \draw ($(mCh@arrow@center)!.6em!-110:(@mCh@arrow@end)+(180+\mCh@angle:.1em)$)
        --($(mCh@arrow@center)!.6em!70:(@mCh@arrow@end)+(180+\mCh@angle:.1em)$);
    }{}%
    \mCh@ifeq@variable\arrow@type@actual\arrow@type@pm{% -+>
      \mCh@let@variable\arrow@type@valid\true
      \mCh@let@variable\arrow@plusminus\true
      \draw[-mCtip,\mCh@arrow@linethickness]
        let \n1={\mCh@angle}, \n2={180+\mCh@angle}
        in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
        ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
    }{}%
    \mCh@ifeq@variable\arrow@type@valid\false
      {\mCh@error{Unknown arrow type `\mCh@arrow@type@actual'}{}}{}%
  }{% default: ->
    \expandafter\draw\expandafter[\mCh@arrow@tikz,
      -mCtip,
      \mCh@arrow@linethickness]
      let \n1={\mCh@angle}, \n2={180+\mCh@angle}
      in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){}
      ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$);
    \expandafter\node\expandafter[\mCh@arrow@uplabel@visible,
      rotate=\mCh@beta,
      anchor=\mCh@arrow@label@anchor@up,
      minimum width=\mCh@arrow@label@width,
      minimum height=\mCh@arrow@label@height,inner sep=0]
      at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2};
    \expandafter\node\expandafter[\mCh@arrow@downlabel@visible,
      rotate=\mCh@beta,
      anchor=\mCh@arrow@label@anchor@down,
      minimum width=\mCh@arrow@label@width,
      minimum height=\mCh@arrow@label@height,inner sep=0]
      at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3};
  }%
  \mCh@ifempty@variable\arrow@plusminus{}{%
    \ifstrempty{#2}{}{%
      \draw (\mCh@arrow@name.base) edge[bend left]
        ++(${0.6667}*(146.3+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$);
      \node[anchor=\mCh@arrow@label@anchor@add,
        inner sep=\mCh@arrow@label@dist,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height]
        at ($(\mCh@arrow@name.base)+{0.6667}*(146.3+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$) {#2};
    }%
    \ifstrempty{#3}{}{%
      \draw (\mCh@arrow@name.base) edge[bend right,-mCtip]
        ++(${0.6667}*(33.7+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$);
      \node[anchor=\mCh@arrow@label@anchor@sub,
        inner sep=\mCh@arrow@label@dist,
        minimum width=\mCh@arrow@label@width,
        minimum height=\mCh@arrow@label@height]
        at ($(\mCh@arrow@name.base)+{0.6667}*(33.7+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$) {#3};
    }%
  }%
  \mCh@set@variable\arrow@factor{1}%
}

% eigene Pfeilspitze ------------------------------------------------------------------ %
\pgfarrowsdeclare{mCtip}{mCtip}
  {%
    \arrowsize=0.2pt
    \advance\arrowsize by .5\pgflinewidth
    \pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth}%
    \pgfarrowsrightextend{.5\pgflinewidth}%
  }
  {%
    \pgfsetdash{}{0pt}% do not dash
    \pgfsetroundjoin% fix join
    \pgfsetroundcap% fix cap
    \pgfpathmoveto{\pgfpointorigin}%
    \pgfpathlineto{\pgfpoint{-3pt}{1pt}}%
    \pgfpathlineto{\pgfpoint{-1.5pt}{0pt}}%
    \pgfpathlineto{\pgfpoint{-3pt}{-1pt}}%
    \pgfpathlineto{\pgfpoint{0pt}{0pt}}%
    \pgfusepathqfillstroke
  }

\pgfarrowsdeclare{mChtip}{mChtip}
  {%
    \arrowsize=0.2pt
    \advance\arrowsize by .5\pgflinewidth
    \pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth}%
    \pgfarrowsrightextend{.5\pgflinewidth}%
  }
  {%
    \pgfsetdash{}{0pt}% do not dash
    \pgfsetroundjoin% fix join
    \pgfsetroundcap% fix cap
    \pgfpathmoveto{\pgfpoint{0pt}{0pt}}%
    \pgfpathlineto{\pgfpoint{-3pt}{1pt}}%
    \pgfpathlineto{\pgfpoint{-1.5pt}{0pt}}%
    \pgfpathlineto{\pgfpoint{0pt}{0pt}}%
    \pgfusepathqfillstroke
  }

% --------------------------------------------------------------------------
% MERGE
% \merge[<label>,<pos>,<length>]{<target>}{<start a>}{<start b>}
\mCh@new@variable\merge@length
\mCh@new@variable\merge@length@default
\mCh@new@variable\merge@length@value
\mCh@new@variable\merge@arg
\mCh@new@variable\merge@to
\mCh@new@variable\merge@from@one
\mCh@new@variable\merge@from@two

\mCh@set@variable\merge@length@default{3em}
\mCh@let@variable\merge@length@value\merge@length@default

% Basisbefehle
\mCh@def\mCh@merge@right{%
  \draw[mCtip-,\mCh@arrow@linethickness]
    ($(\mCh@merge@to.west)+(-\mCh@rxn@node@distance,0)$)
    --node[midway,above,yshift=.1em]{\mCh@merge@arg}
    ++(-\mCh@merge@length,0) node(crossing) {};
  \draw[\mCh@arrow@linethickness]
    ($(\mCh@merge@from@one.east)+(\mCh@rxn@node@distance,0)$) -| (crossing.base);
  \draw[\mCh@arrow@linethickness]
    ($(\mCh@merge@from@two.east)+(\mCh@rxn@node@distance,0)$) -| (crossing.base);
}

\mCh@def\mCh@merge@above{%
  \draw[mCtip-,\mCh@arrow@linethickness]
    ($(\mCh@merge@to.south)+(0,-\mCh@rxn@node@distance)$)
    --node[midway,right,xshift=.1em]{\mCh@merge@arg}
    ++(0,-\mCh@merge@length) node(crossing) {};
  \draw[\mCh@arrow@linethickness]
    (crossing.base) -| ($(\mCh@merge@from@one.north)+(0,\mCh@rxn@node@distance)$);
  \draw[\mCh@arrow@linethickness]
    (crossing.base) -| ($(\mCh@merge@from@two.north)+(0,\mCh@rxn@node@distance)$);
}

\mCh@def\mCh@merge@left{%
  \draw[mCtip-,\mCh@arrow@linethickness]
    ($(\mCh@merge@to.east)+(\mCh@rxn@node@distance,0)$)
    --node[midway,above,yshift=.1em]{\mCh@merge@arg}
    ++(\mCh@merge@length,0) node(crossing) {};
  \draw[\mCh@arrow@linethickness]
    ($(\mCh@merge@from@one.west)+(-\mCh@rxn@node@distance,0)$) -| (crossing.base);
  \draw[\mCh@arrow@linethickness]
    ($(\mCh@merge@from@two.west)+(-\mCh@rxn@node@distance,0)$) -| (crossing.base);
}

\mCh@def\mCh@merge@below{%
  \draw[mCtip-,\mCh@arrow@linethickness]
    ($(\mCh@merge@to.north)+(0,\mCh@rxn@node@distance)$)
    --node[midway,right,xshift=.1em]{\mCh@merge@arg}
    ++(0,\mCh@merge@length) node(crossing) {};
  \draw[\mCh@arrow@linethickness]
    (crossing.base) -| ($(\mCh@merge@from@one.south)+(0,-\mCh@rxn@node@distance)$);
  \draw[\mCh@arrow@linethickness]
    (crossing.base) -| ($(\mCh@merge@from@two.south)+(0,-\mCh@rxn@node@distance)$);
}

% eigentlicher Befehl ----------------------------------------------------------------- %
\newrobustcmd\mCh@merge[4][]{%
  \ifblank{#1}
    {\mCh@merge@i}{\mCh@merge@ii[#1]}
  {#2}{#3}{#4}}

\mCh@def\mCh@merge@i#1#2#3{%
  \mCh@let@variable\merge@length\merge@length@value
  \mCh@empty@variable\merge@arg
  \mCh@set@variable\merge@to{#1}%
  \mCh@set@variable\merge@from@one{#2}%
  \mCh@set@variable\merge@from@two{#3}%
  \mCh@merge@below
}

\mCh@def\mCh@merge@ii[#1]#2#3#4{%
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}%
  \mCh@ifempty@variable\firstarg
    {\mCh@empty@variable\merge@arg}
    {\mCh@let@variable\merge@arg\firstarg}%
  \mCh@ifempty@variable\thirdarg
    {\mCh@let@variable\merge@length\merge@length@value}
    {\mCh@set@variable\merge@length{\mCh@thirdarg}}%
  \mCh@set@variable\merge@to{#2}%
  \mCh@set@variable\merge@from@one{#3}%
  \mCh@set@variable\merge@from@two{#4}%
  \mCh@ifempty@variable\secondarg
    {\mCh@merge@below}
    {\csuse{mCh@merge@\mCh@secondarg}}%
}

\newrobustcmd\setmergelength[1]{%
  \ifblank{#1}
    {\mCh@let@variable\merge@length@value\merge@length@default}
    {\mCh@set@variable\merge@length@value{#1}}}

% --------------------------------------------------------------------------
% REAKTIONSSCHEMA
\newlength\mCh@rxn@node@distance@default
\newlength\mCh@rxn@node@distance

\deflength\mCh@rxn@node@distance@default{1em}
\deflength\mCh@rxn@node@distance{\mCh@rxn@node@distance@default}

\newrobustcmd\setrcndist[1]{%
  \ifblank{#1}
    {\deflength\mCh@rxn@node@distance{\mCh@rxn@node@distance@default}}
    {\deflength\mCh@rxn@node@distance{#1}}}

% Schema
% \begin{rxnscheme}[<label>,<placement>,<align>,<scale factor>,<name>]{<caption>}
\mCh@new@variable\rs@scale
\mCh@new@variable\rs@currentscale

\mCh@set@variable\rs@scale{1.0}
\mCh@set@variable\rs@currentscale{\mCh@rs@scale}

\newrobustcmd\setschemename[1]{%
  \mCh@set@variable\rs@name{#1}}

\mCh@new@variable\rs@caption
\mCh@new@variable\rs@label
\mCh@new@variable\rs@currentlabel
\mCh@new@variable\rs@align
\mCh@new@variable\rs@right
\mCh@new@variable\rs@center
\mCh@new@variable\rs@left

\mCh@let@variable\rs@currentlabel\rs@label
\mCh@set@variable\rs@align{center}
\mCh@set@variable\rs@right{right}
\mCh@set@variable\rs@center{center}
\mCh@set@variable\rs@left{left}

\newrobustcmd\setschemealign[1]{%
  \ifblank{#1}
    {\mCh@set@variable\rs@align{center}}
    {\mCh@set@variable\rs@align{#1}}}

% Gleitumgebung
\floatstyle{ruled}
\newfloat{rxnfloat}{\mCh@rs@currentplacement}{rxnscheme}
\floatname{rxnfloat}{\mCh@rs@name}% Name ändern

% eigentliche Umgebung:
\newrobustcmd\mCh@rxnscheme[2][]{%
  \ifblank{#1}
    {\mCh@rxnscheme@i}
    {\mCh@empty@variable\rs@currentlabel\mCh@rxnscheme@ii[#1]}%
  {#2}}

\mCh@def\mCh@rxnscheme@ii[#1]#2{% [<label>,<placement>,<align>,<scale>,<name>]
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}%
  \mCh@ifempty@variable\firstarg% erste Option
    {\mCh@empty@variable\rs@currentlabel}
    {\mCh@let@variable\rs@currentlabel\firstarg}%
  \mCh@ifempty@variable\secondarg% zweite Option
    {\mCh@let@variable\rs@currentplacement\rs@placement}
    {\mCh@let@variable\rs@currentplacement\secondarg}%
  \let\mCh@remainargs\@empty
  \expandafter\mCh@splitarg\expandafter{\mCh@thirdarg}%
  \mCh@ifempty@variable\firstarg% dritte Option
    {\mCh@set@variable\rs@align{center}}
    {\mCh@let@variable\rs@align\firstarg}%
  \mCh@ifempty@variable\secondarg% vierte Option
    {\mCh@set@variable\rs@currentscale{1}}
    {\mCh@let@variable\rs@currentscale\secondarg}%
  \mCh@ifempty@variable\thirdarg{}% fünfte Option
    {\mCh@let@variable\rs@name\thirdarg}%
  \mCh@rxnscheme@i{#2}%
}

\mCh@def\mCh@scheme@enable{%
  \let\arrow\mCh@arrow
  \let\reactant\mCh@reactant
  \let\mesomeric\mCh@mesomeric
  \let\transition\mCh@transition
  \let\anywhere\mCh@anywhere
  \let\dummy\mCh@dummy
  \let\branch\mCh@branch
  \let\chemand\mCh@chemand
  \let\merge\mCh@merge
%   \let\elmove\mCh@elmove
}

\mCh@def\mCh@scheme@disable{%
  \let\arrow\relax
  \let\reactant\relax
  \let\mesomeric\relax
  \let\transition\relax
  \let\anywhere\relax
  \let\dummy\relax
  \let\branch\relax
  \let\chemand\relax
  \let\merge\relax
%   \let\elmove\relax
}

\mCh@def\mCh@rxnscheme@i#1{%
  \mCh@scheme@enable
  \mCh@set@variable\rs@caption{#1}%
  \rxnfloat
  \mCh@ifeq@variable\rs@align\rs@center{\centering}{}%
  \mCh@ifeq@variable\rs@align\rs@left{\raggedright}{}%
  \mCh@ifeq@variable\rs@align\rs@right{\raggedleft}{}%
  \mCh@atomsize\mCh@bondlength\mCh@bondshape
  \tikzpicture[
    every picture/.style={scale=\mCh@rs@currentscale},
    start chain,
    node distance=\mCh@rxn@node@distance,
    inner sep=0pt,
    outer sep=0pt]
  \mCh@dummy
}

\newenvironment{rxnscheme}{\mCh@rxnscheme}{%
  \endtikzpicture
  \caption{\mCh@rs@caption}%
  \mCh@ifempty@variable\rs@currentlabel{}
     {\label{\mCh@rs@currentlabel}}%
  \endrxnfloat
  \mCh@scheme@disable
}

% ----------------------------------------------------------------------------
% einfache Reaktion
% \begin{rxn}[<align>,<scalefactor>]
\mCh@new@variable\reaction@scale
\mCh@new@variable\reaction@align

\mCh@set@variable\reaction@scale{1.0}
\mCh@set@variable\reaction@align{center}

\newrobustcmd\setrxnalign[1]{%
  \ifblank{#1}
    {\mCh@set@variable\reaction@align{center}}
    {\mCh@set@variable\reaction@align{#1}}}

\mCh@new@variable\reaction@right
\mCh@new@variable\reaction@center
\mCh@new@variable\reaction@left

\mCh@set@variable\reaction@right{right}
\mCh@set@variable\reaction@center{center}
\mCh@set@variable\reaction@left{left}

\newrobustcmd\mCh@rxn[1][]{%
  \ifblank{#1}
    {\mCh@rxn@i}{\mCh@rxn@ii[#1]}}

\mCh@def\mCh@rxn@ii[#1]{%
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}%
  \mCh@ifempty@variable\firstarg
    {\mCh@let@variable\reaction@align\reaction@center}
    {\mCh@let@variable\reaction@align\firstarg}%
  \mCh@ifempty@variable\secondarg
    {\mCh@set@variable\reaction@scale{1}}
    {\mCh@let@variable\reaction@scale\secondarg}%
  \mCh@rxn@i
}

\mCh@def\mCh@rxn@i{%
  \mCh@scheme@enable
  \hspace*{0pt}%
  \mCh@ifeq@variable\reaction@align\reaction@center{\center}{}%
  \mCh@ifeq@variable\reaction@align\reaction@left{\flushleft}{}%
  \mCh@ifeq@variable\reaction@align\reaction@right{\flushright}{}%
  \mCh@bondlength\mCh@bondshape\mCh@atomsize
  \begin{tikzpicture}[
    every picture/.style={scale=\mCh@reaction@scale},
    start chain,
    node distance=\mCh@rxn@node@distance,
    inner sep=0pt,
    outer sep=0pt]
  \mCh@dummy
}

\newenvironment{rxn}{\mCh@rxn}{%
  \end{tikzpicture}%
  \mCh@ifeq@variable\reaction@align\reaction@center{\endcenter}{}%
  \mCh@ifeq@variable\reaction@align\reaction@left{\endflushleft}{}%
  \mCh@ifeq@variable\reaction@align\reaction@right{\endflushright}{}%
  \mCh@scheme@disable
}

% --------------------------------------------------------------------------
% REAKTANDEN
% Standardreaktand
% \reactant[<pos>,<name>,<tikz>]{<something>}
\newrobustcmd\mCh@reactant[2][]{%
  \ifblank{#1}
    {\mCh@reactant@i}{\mCh@reactant@ii[#1]}
  {#2}}

\mCh@def\mCh@reactant@i#1{%
  \expandafter\node\expandafter[%
    \mCh@reactant@visible,
    on chain=going {at=(\tikzchainprevious.0)},
    anchor=180,
    shift=(0:\mCh@rxn@node@distance)]{\scantokens{\relax#1}};
}

\mCh@def\mCh@reactant@ii[#1]#2{%
  \let\mCh@remainargs\@empty\mCh@splitarg{#1}%
  \mCh@ifempty@variable\firstarg{% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz>
    \mCh@set@variable\angle{0}%
    \mCh@set@variable\anchor{180}%
    \mCh@empty@variable\referred@node
  }{%
    \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}%
    \mCh@set@variable\anchor{180+\mCh@angle}%
  }%
  \mCh@ifempty@variable\referred@node
    {\mCh@set@variable\referred@node{\tikzchainprevious}}{}%
  \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[%
    \expandafter\mCh@thirdarg\expandafter,%
    \mCh@reactant@visible,
    on chain=going {at=(\mCh@referred@node.\mCh@angle)},
    anchor=\mCh@anchor,shift=(\mCh@angle:\mCh@rxn@node@distance)]
    (\mCh@secondarg){\scantokens{\relax#2}};
}

% Mesomerie
% \mesomeric[<pos>,<name>,<tikz>]{<something>}
\newrobustcmd\mCh@mesomeric[2][]{%
  \ifblank{#1}
    {\mCh@mesomeric@i}{\mCh@mesomeric@ii[#1]}
  {#2}}

\mCh@def\mCh@mesomeric@i#1{%
  \node[on chain=going {at=(\tikzchainprevious.0),
    shift=($(0:\mCh@rxn@node@distance)$)},
    anchor=180,shift=(0:\mCh@rxn@node@distance),
    inner sep=1pt,
    left delimiter={[},
    right delimiter={]}]
    {\tikzpicture[start branch]\scantokens{\relax#1}\endtikzpicture};
}

\mCh@def\mCh@mesomeric@ii[#1]#2{%
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}%
  \mCh@ifempty@variable\firstarg{% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz>
    \mCh@set@variable\angle{0}%
    \mCh@set@variable\anchor{180}%
    \mCh@empty@variable\referred@node
  }{%
    \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}%
    \mCh@set@variable\anchor{180+\mCh@angle}%
  }%
  \mCh@ifempty@variable\referred@node
    {\mCh@set@variable\referred@node{\tikzchainprevious}}{}%
  \expandafter\node\expandafter[\mCh@thirdarg,
    on chain=going {at=(\mCh@referred@node.\mCh@angle)},
    anchor=\mCh@anchor,
    shift=(\mCh@angle:\mCh@rxn@node@distance),
    inner sep=1pt,
    left delimiter={[},
    right delimiter={]}]
    (\mCh@secondarg){\tikzpicture[start branch]\scantokens{\relax#2}\endtikzpicture};
}

% Mesomerie-Pfeil
% \marrow[<pos>]
\newrobustcmd\marrow[1][]{\arrow[#1,<->,.5]{}{}}

% Anywhere
% \anywhere{<pos>,<name>,<tikz>}{<something>}
\mCh@new@variable\anywhere@positioning

\newrobustcmd\mCh@anywhere[2]{%
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz>
  \mCh@ifempty@variable\firstarg{%
    \mCh@error{\string\anywhere: positioning missing}{}%
  }{%
    \expandafter\mCh@if@instr\expandafter{\mCh@firstarg}{=}{%
      \mCh@xset@variable\anywhere@positioning{\mCh@firstarg}%
    }{%
      \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}%
      \mCh@set@variable\anchor{180+\mCh@angle}%
      \mCh@ifempty@variable\referred@node{%
        \mCh@error{You can't use `angle' to position \string\anywhere.
        You need to use `name.angle'}%
      }{%
        \mCh@set@variable\anywhere@positioning{%
          at=(\mCh@referred@node.\mCh@angle),anchor=\mCh@anchor}%
      }%
    }%
  }%
  \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[%
    \expandafter\mCh@thirdarg\expandafter,%
    \mCh@anywhere@positioning](\mCh@secondarg){#2};
}

% Dummy
% \dummy[<name>]
\newrobustcmd\mCh@dummy[1][]{%
  \ifblank{#1}
    {\draw node[on chain,xshift=-\mCh@rxn@node@distance]{};}
    {\draw node[on chain,xshift=-\mCh@rxn@node@distance](#1){};}}

% Uebergangszustand
% \transition[<pos>,<name>,<tikz>]{<something>}
\mCh@new@variable\transition@name

\newrobustcmd\mCh@transition[2][]{%
  \ifblank{#1}
    {\mCh@transition@i}{\mCh@transition@ii[#1]}
  {#2}}

\mCh@def\mCh@transition@i#1{%
  \expandafter\node\expandafter[\mCh@reactant@visible,
    on chain=going {at=(\tikzchainprevious.0)},
    anchor=180,
    shift=(0:\mCh@rxn@node@distance),
    anchor=180,
    inner sep=3pt,
    left delimiter={[},
    right delimiter={]}]
    (mCh@transition@name){\scantokens{\relax#1}};
  \node at ($(mCh@transition@name.north east)+(.7em,0)$) {$\transitionstatesymbol$};
}

\mCh@def\mCh@transition@ii[#1]#2{%
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}%
  \mCh@ifempty@variable\firstarg{% erste Option: <pos>
    \mCh@set@variable\angle{0}%
    \mCh@set@variable\anchor{180}%
    \mCh@empty@variable\referred@node
  }{%
    \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}%
    \mCh@set@variable\anchor{180+\mCh@angle}%
  }%
  \mCh@ifempty@variable\secondarg% zweite Option: <name>, dritte Option: <tikz>
    {\mCh@set@variable\transition@name{mCh@transition@name}}
    {\mCh@let@variable\transition@name\secondarg}%
  \mCh@ifempty@variable\referred@node
    {\mCh@set@variable\referred@node{\tikzchainprevious}}{}%
  \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[%
    \mCh@reactant@visible\expandafter,%
    \mCh@thirdarg,
    on chain=going {at=(\mCh@referred@node.\mCh@angle)},
    anchor=\mCh@anchor,
    shift=(\mCh@angle:\mCh@rxn@node@distance),
    inner sep=3pt,
    left delimiter={[},
    right delimiter={]}]
    (\mCh@transition@name){\scantokens{\relax#2}};
  \node at ($(\mCh@transition@name.north east)+(.7em,0)$) {$\transitionstatesymbol$};
}

% Abzweigung
% \branch[<pos>,<name>,<tikz>]{<formulae>}
% <pos>: default: on chain=going "right" (0°)
%        on chain=going <somewhere>
%        <somewhere>=of <name>
%        <angle> (sitzt auf der Kette)
%        <name>.<angle> (sitzt nicht auf der Kette)
\mCh@new@variable\branch@positioning

\newrobustcmd\mCh@branch[2][]{%
  \ifblank{#1}
    {\mCh@branch@i}{\mCh@branch@ii[#1]}
  {#2}}

\mCh@def\mCh@branch@i#1{%
  \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible,
    on chain=going {at=(\tikzchainprevious.0)},
    anchor=180,
    shift=(0:\mCh@rxn@node@distance)}%
  \mCh@empty@variable\secondarg
  \mCh@empty@variable\thirdarg
  \mCh@branch@iii{#1}}

\mCh@def\mCh@branch@ii[#1]#2{%
  \let\mCh@remainargs\@empty
  \mCh@splitarg{#1}% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz>
  \mCh@ifempty@variable\firstarg{%
    \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible,
      on chain=going {at=(\tikzchainprevious.0)},
      anchor=180,
      shift=(0:\mCh@rxn@node@distance)}%
  }{%
    \expandafter\mCh@if@instr\expandafter{\mCh@firstarg}{=}{%
      \mCh@xset@variable\branch@positioning{\mCh@branch@visible,\mCh@firstarg}%
    }{%
      \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}%
      \mCh@set@variable\anchor{180+\mCh@angle}%
      \mCh@ifempty@variable\referred@node{%
        \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible,
          on chain=going {at=(\tikzchainprevious.\mCh@angle)},
          anchor=\mCh@anchor,
          shift=(\mCh@angle:\mCh@rxn@node@distance)}%
      }{%
        \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible,
          at=(\mCh@referred@node.\mCh@angle),
          anchor=\mCh@anchor,
          shift=(\mCh@angle:\mCh@rxn@node@distance)}%
      }%
    }%
  }%
  \mCh@branch@iii{#2}}

\mCh@def\mCh@branch@iii#1{%
  \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[%
    \expandafter\mCh@branch@positioning\expandafter,%
    \mCh@thirdarg]
    (\mCh@secondarg){\tikzpicture[start branch]\scantokens{\relax#1}\endtikzpicture};}%
    % scantokens nötig, da sonst eine Dreifachbindung ~ vor () mit falschem
    % catcode interpretiert wird

% --------------------------------------------------------------------------
% Sonstiges
% Elektronenverschiebungspfeile
\mCh@new@variable\elmove@default@tikz
\mCh@new@variable\elmove@tikz

\tikzset{mCh@elmove/.style={->,red,shorten <=3pt,shorten >=1pt}}
\mCh@set@variable\elmove@default@tikz{mCh@elmove}
\mCh@let@variable\elmove@tikz\elmove@default@tikz

\newrobustcmd\elmove[5][]{%
  \chemmove{
    \expandafter\draw\expandafter[\mCh@elmove@tikz,#1]
    (#2).. controls +(#3) and +(#5)..(#4);
  }}

\newrobustcmd\setelmove[1]{%
  \ifblank{#1}
    {\mCh@let@variable\elmove@tikz\elmove@default@tikz}
    {\mCh@set@variable\elmove@tikz{#1}}}

% Plus
\newrobustcmd\mCh@chemand[1][]{%
  \ifblank{#1}
    {\reactant{\chemsign[0pt]{+}}}
    {\reactant[#1]{\chemsign[0pt]{+}}}}

% --------------------------------------------------------------------------
% Setup myChemistry
% Bindungslänge
\mCh@new@variable\bondlength@default
\mCh@new@variable\bondlength

\mCh@set@variable\bondlength@default{1.8em}
\mCh@set@variable\bondlength{\setatomsep{\mCh@bondlength@default}}

\newrobustcmd\setbondlength[1]{%
 \ifblank{#1}
   {\mCh@set@variable\bondlength{\setatomsep{\mCh@bondlength@default}}}
   {\mCh@set@variable\bondlength{\setatomsep{#1}}}}

% Keilbindungen
\mCh@new@variable\bondshape@one
\mCh@new@variable\bondshape@two
\mCh@new@variable\bondshape@three

\mCh@set@variable\bondshape@one{3pt}
\mCh@set@variable\bondshape@two{.5pt}
\mCh@set@variable\bondshape@three{1pt}

\newrobustcmd\setbondshape[3]{%
 \ifblank{#1}
   {\mCh@set@variable\bondshape@one{3pt}}
   {\mCh@set@variable\bondshape@one{#1}}%
 \ifblank{#2}
   {\mCh@set@variable\bondshape@two{.5pt}}
   {\mCh@set@variable\bondshape@two{#2}}%
 \ifblank{#3}
   {\mCh@set@variable\bondshape@three{1pt}}
   {\mCh@set@variable\bondshape@three{#3}}%
}

\mCh@new@variable\bondshape
\mCh@set@variable\bondshape{%
  \setcrambond{\mCh@bondshape@one}{\mCh@bondshape@two}{\mCh@bondshape@three}}

% Atomgröße
\mCh@new@variable\atomsize@default
\mCh@new@variable\atomsize

\mCh@set@variable\atomsize@default{\small}
\mCh@let@variable\atomsize\atomsize@default

\newrobustcmd\setatomsize[1]{%
 \ifblank{#1}
   {\mCh@let@variable\atomsize\atomsize@default}
   {\mCh@set@variable\atomsize{#1}}}

% allg. Setup
\newrobustcmd\mCsetup[1]{\setkeys{mCh@setup}{#1}}

\define@key{mCh@setup}{arrowlabel}[\mCh@arrow@label@dist@def]{%
  \setarrowlabel{#1}}
\define@key{mCh@setup}{arrowlength}[\mCh@arrow@length@def]{%
  \setarrowlength{#1}}
\define@key{mCh@setup}{arrowline}[\mCh@arrow@linethickness@default]{%
  \setarrowline{#1}}
\define@key{mCh@setup}{atomsize}[\mCh@atomsize@default]{%
  \setatomsize{#1}}
\define@key{mCh@setup}{bondlength}[\mCh@bondlength@default]{%
  \setbondlength{#1}}
\define@key{mCh@setup}{rcndist}[\mCh@rxn@node@distance@default]{%
  \setrcndist{#1}}
\define@key{mCh@setup}{rxnalign}[center]{%
  \setrxnalign{#1}}
\define@key{mCh@setup}{schemealign}[center]{%
  \setschemealign{#1}}
\define@key{mCh@setup}{align}[center]{%
  \setrxnalign{#1}
  \setschemealign{#1}}
\define@key{mCh@setup}{mergelength}[\mCh@merge@length@default]{%
  \setmergelength{#1}}
\define@key{mCh@setup}{elmove}[\mCh@elmove@default@tikz]{%
  \setelmove{#1}}
\define@key{mCh@setup}{reset}[]{%
  \setarrowlabel{}%
  \setarrowlength{}%
  \setarrowline{}%
  \setmergelength{}%
  \setatomsize{}%
  \setbondlength{}%
  \setbondshape{}{}{}%
  \setrcndist{}%
  \setrxnalign{}%
  \setschemealign{}%
  \setelmove{}%
}

% --------------------------------------------------------------------------
% NODES SICHTBAR/UNSICHTBAR MACHEN
\mCh@new@variable\reactant@visible
\mCh@new@variable\arrow@uplabel@visible
\mCh@new@variable\arrow@downlabel@visible
\mCh@new@variable\branch@visible

\mCh@empty@variable\reactant@visible
\mCh@empty@variable\arrow@uplabel@visible
\mCh@empty@variable\arrow@downlabel@visible
\mCh@empty@variable\branch@visible

\newrobustcmd\makevisible{%
  \ifmCh@draft
    \mCh@set@variable\reactant@visible{draw=red!60,solid}%
    \mCh@set@variable\arrow@uplabel@visible{draw=green!60,solid}%
    \mCh@set@variable\arrow@downlabel@visible{draw=blue!60,solid}%
    \mCh@set@variable\branch@visible{draw=cyan,solid}%
  \fi
}

\newrobustcmd\makeinvisible{%
  \mCh@empty@variable\reactant@visible
  \mCh@empty@variable\arrow@uplabel@visible
  \mCh@empty@variable\arrow@downlabel@visible
  \mCh@empty@variable\branch@visible
}

\endinput

% ----------------------------------------------------------------------------
HISTORY:
2011/02/24 version 1.0   - first release to CTAN
2011/03/01 version 1.1   - package option `english' added
                         - package key `placement' added
                         - rxnscheme key `placement' added
                         - package key `shade=boolean' changed into package
                           option `shade'
                         - package option `nochemexec' added, will prevent mC
                           from loading chemexec
2011/03/20 version 1.2   - license changed into LPPL 1.3 or later
                         - package option `nocompounds' added, will prevent mC
                           from loading chemcompounds
                         - package option `chemstyle' added, will load chemstyle
                         - package option `nomhchem' added, will prevent mC from
                           loading mhchem if chemexec isn't loaded either
                         - package option `nopackages' added, will prevent mC
                           from loading any chemistry package except chemfig
                         - some small issues resolved
                         - bug in arrow type <=> resolved
                         - arrow argument placement rewritten; two new keys for
                           arrow: `aboveshift' and `belowshift' (causing new
                           problems with alignment, though)
                         - wrong arrow alignment (due to last change) mainly
                           resolved (NEEDS pgf v2.10!)
                           => solved wrong branch alignment as well
                         - `inner sep' set to 0, arrow, transition & mesomeric
                           adjusted
                         - bug in arrow type -|> resolved
                         - commands \makevisible / \makeinvisible added
                         - arrow key `both' added
                         - rxn has now keys instead of an option
                         - commands \setrcndist, \setrxnalign, \setschemealign
                           added
                         - rxn-, rxnscheme-key align added
2011/03/26 version 1.2.1 - rewritten commands, so they accept second argument
                           without first:
                           \reactand, \mesomeric, \transition, \branch,
                           \makevisible, \makeinvisible
2011/03/28 version 1.2.2 - bugfix with transition
                         - atomsize, arrowlength, bondlength and bondshape
                           renamed into set<name> and code slightly rewritten
                         - \mCsetup added
2011/04/01 version 1.2.3 - bug in \branch resolved
                         - \chemand added
2011/04/02 version 1.2.4 - bugs in \makevisible, \makeinvisible resolved
                         - input bondwidth.tex if ChemFig v0.4
2011/04/04 version 1.3   - commands \reactand, \mesomeric, \branch, \transition,
                           \chemand (\makeinvisible,  \makeinvisible) rewritten:
                           more flexible with opt. arguments
2011/04/15 version 1.4   - minor bugfixes
                         - \merge-command rewritten: it now accepts an arrow
                           label and the length is adjustable
                         - \dummy mostly obsolete
                         - bugfix with aligning rxn & rxnscheme
                         - synonym to \reactand=\reactant added
                         - rxn & rxnscheme rewritten
                         - commands \reactant, \mesomeric, \branch & \transition
                           modified: argument is set with \scantokens{\relax#1},
                           so the chemfig catcode regime is working properly
                           before () (else possible problem with triple bond ~)
                         - syntax of \arrow changed so it fits to the syntax of
                           all the other commands
                         - command \anywhere added
                         - own arrow tips defined
                         - command \setarrowline added
                         - new arrow type -+> added
2011/04/23 version 1.5   - major parts of the code rewritten -- the whole
                           positioning part now is different and way more flexible:
                           arbitrary angles can be used for positioning, referencing
                           an object is easier, arrows can be modified using <tikz>,
                           command \anywhere now has similar syntax
                         - arrow types <=>> and <<=> added
                         - arrow type -+> modified: more flexible
                         - bugfixes in error-handling
2011/04/27 version 1.5.1 - removed bondwidth.tex
                         - \arrow, \reactant, \mesomeric, \transition, \anywhere,
                           \dummy, \branch, and \chemand only defined inside scheme
                           environments
2012/07/27 version 1.99  - conflict with `pdfpages' resolved, LaTeXified various
                           parts in order to minimize conflicts with other
                           packages; \merge is also only defined inside the scheme
                           environments
2012/09/20 version 1.99a - small adjustments to \elmove
                           
% ----------------------------------------------------------------------------
% TODO