%%
%% This is file `chemschemex.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% chemschemex.dtx  (with options: `package')
%% 
%%  This is a generated file.
%% 
%%  Copyright (C) 2014-2018 by Dominik Siegel
%% 
%%  This file may be distributed and/or modified under the
%%  conditions of the LaTeX Project Public License, either
%%  version 1.2 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.2 or later is part of all distributions of
%%  LaTeX version 1999/12/01 or later.
%% 
%%
%% To produce the documentation, do the following
%%
%%    latex chemschemex.dtx
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{chemschemex}[2018/01/20 v1.2 Typeset chemical schemes]
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{chemschemex}[2017/04/03 v1.1.1 Typeset chemical schemes]
\RequirePackage{xkeyval}
\RequirePackage{etoolbox}
\RequirePackage{xargs}
\RequirePackage{xifthen}
\RequirePackage{suffix}
\RequirePackage{fancylabel}
\fancyref@DefineFamily{}{CSX}
\def\fancylabelformatCSX{\arabic{fancylabel}}
\def\fancysublabelformatCSX{\arabic{fancylabel}\alph{fancysublabel}}
\def\fancyonlysublabelformatCSX{\alph{fancysublabel}}
\RequirePackage{graphicx}
\RequirePackage{tikz}
\usetikzlibrary{%
   shapes.multipart,%
   decorations,%
   decorations.markings,%
   positioning,%
   arrows.meta%
}
\define@key{chemschemex}{image}{%
    % #1=additional options
    % #2=filename of the image
    \newcommand{\CSXimage}[2][]{%
        \includegraphics[#1,##1]{##2}%
    }%
}
\define@key{chemschemex}{labelseparator}{%
    \def\CSXlabelsep{#1}%
}
\define@key{chemschemex}{arrowadvance}{%
    \def\CSXarrowadvance{#1}%
}
\presetkeys{chemschemex}{%
    image={scale=0.7},%
    labelseparator={:\,},%
    arrowadvance={10pt},%
}{}
\ProcessOptionsX<chemschemex>
\tikzset{%
   CSXsettextwidth/.style={%
      text width=(%
         % if
         (\CSXtextwidth - \CSXimagewidth - \CSXmaxlabelwidth)>0%
         % then
         ?(\CSXimagewidth - \CSXmaxlabelwidth)%
         % else
         :(\CSXtextwidth+0.00001)%
      ),%
   },%
   CSXsetlabelwidth/.style={%
      text width=(%
         % if
         (\CSXlabelwidth)>0%
         % then
         ?(\CSXlabelwidth+0.00001)%
         % else
         :(0.00001)%
      ),%
   },%
   CSXshiftA/.style={},%
   CSXshiftB/.style={},%
   CSXshiftcompensation/.style={},%
}
\tikzset{%
   % TikZ
   CSX/.style={%
      remember picture%
   },%
   % Matrix
   CSXmatrix/.style={%
      column sep=10pt,%
      row sep=4pt,%
      nodes={%
         inner xsep=0pt,%
         inner ysep=1pt,%
         outer sep=0pt%
      },%
      every odd row/.style={anchor=center},%
      every even row/.style={anchor=north},%
   },%
   % Structure caption
   CSXcaption/.style={%
      node distance=0pt,%
   },%
   CSXcaptionLabelandText/.style={%
      align=right,%
      every two node part/.style={%
         align=justify%
      },%
   },%
   CSXcaptionTextOnly/.style={%
      align=justify%
   },%
   % Fonts
   CSXlabelfont/.style={%
      font={\footnotesize\sffamily\bfseries}%
   },%
   CSXtextfont/.style={%
      font={\footnotesize\sffamily}%
   },%
   CSXarrowfont/.style={%
      font={\footnotesize\sffamily}%
   },%
   CSXsimple/.style={%
      x=3pt,%
      y=3pt,%
      line width=0.7pt%
   },%
   % Arrows
   CSXarrowupper/.style={%
      align=flush center,%
   },%
   CSXarrowlower/.style={%
      align=flush center%
   },%
   CSXStructInArrow/.style={%
      node distance=1pt,%
      text width=,%
      inner sep=0pt,%
      outer sep=0pt%
   },%
   CSXallarrows/.style={%
      x=1pt,y=1pt,%
      line width=0.7,%
      inner ysep=3,%
      >=Classical TikZ Rightarrow,%
   },%
   CSXdoublearrows/.style={%
      double distance=1.5,%
      >=Implies%
   },%
   CSXharpoonup/.style={%
      >={Classical TikZ Rightarrow[harpoon]}%
   },%
   CSXharpoondown/.style={%
      >={Classical TikZ Rightarrow[harpoon,swap]}%
   },%
   CSXRightArrow/.style={%
      ->%
   },%
   CSXRightupHarpoon/.style={%
      ->[harpoon]%
   },%
   CSXRightdownHarpoon/.style={%
      ->[{harpoon,swap}]%
   },%
   CSXLeftArrow/.style={%
      <-%
   },%
   CSXLeftupHarpoon/.style={%
      <[{harpoon,swap}]-%
   },%
   CSXLeftdownHarpoon/.style={%
      <[harpoon]-%
   },%
   CSXLeftRightArrow/.style={%
      <->%
   },%
   CSXLeftupRightupHarpoon/.style={%
      <[{harpoon,swap}]->[harpoon]%
   },%
   CSXLeftupRightdownHarpoon/.style={%
      <[{harpoon,swap}]->[{harpoon,swap}]%
   },%
   CSXLeftdownRightupHarpoon/.style={%
      <[{harpoon}]->[{harpoon}]%
   },%
   CSXLeftdownRightdownHarpoon/.style={%
      <[{harpoon}]->[{harpoon,swap}]%
   },%
   CSXequilibrium/.style={%
      inner ysep/.expanded=(1+\pgfkeysvalueof{/pgf/inner ysep}),%
      CSXshiftA/.style={yshift=1},%
      CSXshiftB/.style={yshift=1},%
      CSXshiftcompensation/.style={yshift=-1},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw([yshift=-1]\CSXnodename .east) to%
                 ([yshift=-1]\CSXnodename .west);%
         }%
      }%
   },%
   CSXRightequilibrium/.style={%
      inner ysep/.expanded=(1+\pgfkeysvalueof{/pgf/inner ysep}),%
      CSXshiftA/.style={yshift=1},%
      CSXshiftB/.style={yshift=1},%
      CSXshiftcompensation/.style={yshift=-1},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw([yshift=-1,xshift=-0.25\CSXarrowlength]\CSXnodename .east) to%
                 ([yshift=-1,xshift=0.25\CSXarrowlength]\CSXnodename .west);%
         }%
      }%
   },%
   CSXLeftequilibrium/.style={%
      inner ysep/.expanded=(1+\pgfkeysvalueof{/pgf/inner ysep}),%
      CSXshiftA/.style={yshift=1,xshift=0.25\CSXarrowlength},%
      CSXshiftB/.style={yshift=1,xshift=-0.25\CSXarrowlength},%
      CSXshiftcompensation/.style={yshift=-1},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw([yshift=-1]\CSXnodename .east) to%
                 ([yshift=-1]\CSXnodename .west);%
         }%
      }%
   },%
   CSXslashtwoarrow/.style={%
      inner ysep/.expanded=(1.5+\pgfkeysvalueof{/pgf/inner ysep}),%
      CSXshiftA/.style={yshift=1.5,xshift=5},%
      CSXshiftB/.style={yshift=1.5},%
      CSXshiftcompensation/.style={yshift=-1.5,xshift=-2.5},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw([yshift=-1.5]\CSXnodename .west) to%
                 ([yshift=-1.5,xshift=-5]\CSXnodename .east);%
         }%
      }%
   },%
   CSXbackslashtwoarrow/.style={%
      inner ysep/.expanded=(1.5+\pgfkeysvalueof{/pgf/inner ysep}),%
      CSXshiftA/.style={yshift=1.5},%
      CSXshiftB/.style={yshift=1.5,xshift=-5},%
      CSXshiftcompensation/.style={yshift=-1.5,xshift=2.5},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw([yshift=-1.5,xshift=5]\CSXnodename .west) to%
                 ([yshift=-1.5]\CSXnodename .east);%
         }%
      }%
   },%
   CSXslashthreearrow/.style={%
      inner ysep/.expanded=(3+\pgfkeysvalueof{/pgf/inner ysep}),%
      CSXshiftA/.style={xshift=5},%
      CSXshiftB/.style={xshift=-5},%
      CSXshiftcompensation/.style={x=1.4,y=1.4},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw([yshift=3,xshift=10]\CSXnodename .west) to%
                 ([yshift=3]\CSXnodename .east);%
            \draw([yshift=-3]\CSXnodename .west) to%
                 ([yshift=-3,xshift=-10]\CSXnodename .east);%
         }%
      }%
   },%
   CSXbackslashthreearrow/.style={%
      inner ysep/.expanded=(3+\pgfkeysvalueof{/pgf/inner ysep}),%
      CSXshiftA/.style={xshift=5},%
      CSXshiftB/.style={xshift=-5},%
      CSXshiftcompensation/.style={x=1.4,y=1.4},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw([yshift=3]\CSXnodename .west) to%
                 ([yshift=3,xshift=-10]\CSXnodename .east);%
            \draw([yshift=-3,xshift=10]\CSXnodename .west) to%
                 ([yshift=-3]\CSXnodename .east);%
         }%
      }%
   },%
   CSXCrossArrow/.style={%
      inner ysep/.expanded=1.5+\pgfkeysvalueof{/pgf/inner ysep},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw[-,solid,CSXshiftcompensation](-3,-3)--(3,3);%
            \draw[-,solid,CSXshiftcompensation](3,-3)--(-3,3);%
         }%
      }%
   },%
   CSXStrikeArrow/.style={%
      inner ysep/.expanded=2+\pgfkeysvalueof{/pgf/inner ysep},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw[-,solid,CSXshiftcompensation](-2,-3.5)--(2, 3.5);%
         }%
      }%
   },%
   CSXDStrikeArrow/.style={%
      inner ysep/.expanded=2+\pgfkeysvalueof{/pgf/inner ysep},%
      postaction=decorate,%
      decoration={%
         markings,%
         mark=at position 0.5 with{%
            \draw[-,solid,xshift=-2,CSXshiftcompensation](-2,-3.5)--(2, 3.5);%
            \draw[-,solid,xshift=2,CSXshiftcompensation](-2,-3.5)--(2, 3.5);%
         }%
      }%
   }%
}
\newif\ifCSX@scheme\CSX@schemefalse % Is true, if the struct appears in a Chemscheme environment
\newif\ifCSX@generate@@@caption@ % Is needed to get label and text out of the caption passed to customstruct
\newif\ifCSX@generate@@@caption@LastEntryWasTextOnly % Is needed to detect text-only caption entries
\newlength{\CSXimagewidth}\setlength{\CSXimagewidth}{0pt}
\newlength{\CSXlabelwidth}\setlength{\CSXlabelwidth}{0pt}
\newlength{\CSXmaxlabelwidth}\setlength{\CSXmaxlabelwidth}{0pt}
\newlength{\CSXtextwidth}\setlength{\CSXtextwidth}{0pt}
\newlength{\CSXmaxtextwidth}\setlength{\CSXmaxtextwidth}{0pt}
\newlength{\CSXarrowlength}\setlength{\CSXarrowlength}{0pt}
\newcounter{CSXscheme}\setcounter{CSXscheme}{1}
\newcounter{CSXstruct}\setcounter{CSXstruct}{0}
\newcounter{CSXstructinarrow}\setcounter{CSXstructinarrow}{0}
\newcounter{CSXcaption}\setcounter{CSXcaption}{0}
\def\CSX@structlist@filenamesorted{}
\newcommand{\newstruct}[5][]{%
   % #1=comma-separated list of subcaptions
   % #2=filename
   % #3=structname
   % #4=Structname
   % #5=abbreviation
   \@ifundefined{CSX@newstruct@#2@structname}{%
      \global\@namedef{CSX@newstruct@#2@structname}{#3}%
      \global\@namedef{CSX@newstruct@#2@Structname}{#4}%
      \global\@namedef{CSX@newstruct@#2@abbreviation}{#5}%
      \ifthenelse{\equal{#1}{}}{}{%
         \setcounter{CSXcaption}{0}% No need to define a new counter, just use the CSXcaption
         \fancyref@foreach{\CSX@newsubstruct}{#2}{#1}%
      }%
      \AtBeginDocument{%
         \immediate\write\@auxout{%
            \string\fancyref@addtolist%
               {\string{#2\string}}%
               {\string\CSX@structlist@filenamesorted}%
         }%
      }%
   }{%
      \PackageError{chemschemex}{Multiple definitions of '#2' by %
                                 \string\newstruct}{}%
   }%
}
\@onlypreamble\newstruct
\DeclareRobustCommand{\structname}[1]{%
   \@ifundefined{CSX@newstruct@#1@structname}{%
      ???%
      \PackageWarning{chemschemex}{No structure '#1' defined by \string\newstruct}%
   }{%
      \ifthenelse{\equal{\@nameuse{CSX@newstruct@#1@structname}}{}}{%
         ???%
         \PackageWarning{chemschemex}{structname of structure '#1' is empty.}%
      }{%
         \@nameuse{CSX@newstruct@#1@structname}%
      }%
   }%
}
\DeclareRobustCommand{\Structname}[1]{%
   \@ifundefined{CSX@newstruct@#1@Structname}{%
      ???%
      \PackageWarning{chemschemex}{No structure '#1' defined by \string\newstruct}%
   }{%
      \ifthenelse{\equal{\@nameuse{CSX@newstruct@#1@Structname}}{}}{%
         ???%
         \PackageWarning{chemschemex}{Structname of structure '#1' is empty.}%
      }{%
         \@nameuse{CSX@newstruct@#1@Structname}%
      }%
   }%
}
\DeclareRobustCommand{\structabbr}[1]{%
   \@ifundefined{CSX@newstruct@#1@abbreviation}{%
      ???%
      \PackageWarning{chemschemex}{No structure '#1' defined by \string\newstruct}%
   }{%
      \ifthenelse{\equal{\@nameuse{CSX@newstruct@#1@abbreviation}}{}}{%
         ???%
         \PackageWarning{chemschemex}{structabbr of structure '#1' is empty.}%
      }{%
         \@nameuse{CSX@newstruct@#1@abbreviation}%
      }%
   }%
}
\newcommandx\customstruct[4][1={},2={}]{%
   % #1=TikZ option for caption
   % #2=TikZ option for image
   % #3=caption
   % #4=image
   \customstruct@outarrow[#1][#2]{#3}{#4}%
}
\newcommandx\struct[6][1={},2=CSX,3={},4={},5={},usedefault]{%
   % #1=caption
   % #2=family
   % #3=image options
   % #4=TikZ option for caption
   % #5=TikZ option for image
   % #6=filename
   \@struct{#1}{#2}{#6}%
   \customstruct[#4][#5]{\@@struct}{\CSXimage[#3]{#6}}%
}
\newcommandx\structalt[7][1={},2=CSX,3={},4={},5={},usedefault]{%
   % #1=caption
   % #2=family
   % #3=image options
   % #4=TikZ option for caption
   % #5=TikZ option for image
   % #6=filename of the referenced image
   % #7=filename of the image shown instead of #6
   \@struct{#1}{#2}{#6}%
   \customstruct[#4][#5]{\@@struct}{\CSXimage[#3]{#7}}%
}
\WithSuffix\newcommandx\struct*[6][1={},2=CSX,3={},4={},5={},usedefault]{%
   % #1=caption
   % #2=family
   % #3=image options
   % #4=TikZ option for caption
   % #5=TikZ option for image
   % #6=filename
   \@struct*{#1}{#2}{#6}%
   \customstruct[#4][#5]{\@@struct}{\CSXimage[#3]{#6}}%
}
\WithSuffix\newcommandx\structalt*[7][1={},2=CSX,3={},4={},5={},usedefault]{%
   % #1=caption
   % #2=family
   % #3=image options
   % #4=TikZ option for caption
   % #5=TikZ option for image
   % #6=filename of the referenced image
   % #7=filename of the image shown instead of #6
   \@struct*{#1}{#2}{#6}%
   \customstruct[#4][#5]{\@@struct}{\CSXimage[#3]{#7}}%
}
\WithSuffix\newcommandx\struct-[5][1={},2={},3={},4={},usedefault]{%
   % #1=caption
   % #2=image options
   % #3=TikZ option for caption
   % #4=TikZ option for image
   % #5=filename
   \customstruct[#3][#4]{{{},{#1}}}{\CSXimage[#2]{#5}}%
}
\newcommandx\Struct[6][1=CSX,2={},3={},4={},usedefault]{%
   % #1=family
   % #2=image options
   % #3=TikZ option for caption
   % #4=TikZ option for image
   % #5=list of sublabels previously defined with \newstruct
   % #6=filename
   \@Struct{#1}{#5}{#6}%
   \customstruct[#3][#4]{\@@struct}{\CSXimage[#2]{#6}}%
}
\newcommandx\Structalt[7][1=CSX,2={},3={},4={},usedefault]{%
   % #1=family
   % #2=image options
   % #3=TikZ option for caption
   % #4=TikZ option for image
   % #5=list of sublabels previously defined with \newstruct
   % #6=filename of the referenced image
   % #7=filename of the image shown instead of #6
   \@Struct{#1}{#5}{#6}%
   \customstruct[#3][#4]{\@@struct}{\CSXimage[#2]{#7}}%
}
\WithSuffix\newcommandx\Struct*[6][1=CSX,2={},3={},4={},usedefault]{%
   % #1=family
   % #2=image options
   % #3=TikZ option for caption
   % #4=TikZ option for image
   % #5=list of sublabels previously defined with \newstruct
   % #6=filename
   \@Struct*{#1}{#5}{#6}%
   \customstruct[#3][#4]{\@@struct}{\CSXimage[#2]{#6}}%
}
\WithSuffix\newcommandx\Structalt*[7][1=CSX,2={},3={},4={},usedefault]{%
   % #1=family
   % #2=image options
   % #3=TikZ option for caption
   % #4=TikZ option for image
   % #5=list of sublabels previously defined with \newstruct
   % #6=filename of the referenced image
   % #7=filename of the image shown instead of #6
   \@Struct*{#1}{#5}{#6}%
   \customstruct[#3][#4]{\@@struct}{\CSXimage[#2]{#7}}%
}
\newcommand{\structplus}{%
   \customstruct{}{\tikz[CSXsimple]{\draw[-](1,0)to(-1,0);\draw[-](0,1)to(0,-1);}}%
}
\newcommand{\structminus}{%
   \customstruct{}{\tikz[CSXsimple]{\draw[-](1,0)to(-1,0);}}%
}
\def\ChemschemeNextRow@list{}%
\newcommand{\ChemschemeNextRow}[1][]{%
   % #1=vertical margin
   \edef\ChemschemeNextRow@helper{\noexpand\fancyref@addtolist{\theCSXstruct}{\noexpand\ChemschemeNextRow@list}}%
   \ChemschemeNextRow@helper%
   \expandafter\def\csname ChemschemeNextRow@\theCSXstruct\endcsname{#1}%
   \ignorespaces%
}
\newenvironment{Chemscheme}{%
   \CSX@schemetrue%
   \ignorespaces%
}{%
   \CSX@print%
   \CSX@schemefalse%
}
\DeclareRobustCommand\structref[2][CSX]{%
    % #1=family
    % #2=label
    \CSXstructref{\fancyref[#1]{#2}}%
}
\WithSuffix\DeclareRobustCommand\structref*[2][CSX]{%
    % #1=family
    % #2=label
    \CSXstructref{\fancyref*[#1]{#2}}%
}
\DeclareRobustCommand\structsubref[3][CSX]{%
    % #1=family
    % #2=label
    % #3=sublabel
    \CSXstructref{\fancysubref[#1]{#2}{#3}}%
}
\WithSuffix\DeclareRobustCommand\structsubref-[3][CSX]{%
    % #1=family
    % #2=label
    % #3=sublabel
    \CSXstructref{\fancysubref-[#1]{#2}{#3}}%
}
\WithSuffix\DeclareRobustCommand\structsubref*[3][CSX]{%
    % #1=family
    % #2=label
    % #3=sublabel
    \CSXstructref{\fancysubref*[#1]{#2}{#3}}%
}
\newcommand{\CSXstructref}[1]{%
    % #1=fancyref command
    \textbf{#1}%
}
\newcommand{\CSXcommands}[1]{%
   \gappto\CSX@commands{#1}%
   \ignorespaces%
}
\def\CSX@commands{}%
\newcommand{\CSX@newsubstruct}[2]{%
   % #1=label
   % #2=caption
   \stepcounter{CSXcaption}%
   \xdef\chemschemes@getcountervalue{%
      \theCSXcaption%
   }%
   \expandafter\xdef\csname CSX@newstruct@#1@subcaption@%
                            \chemschemes@getcountervalue\endcsname{#2}%
}
\newcommand{\CSX@customarrow@widestcaption}[2]{%
   % #1=label
   % #2=style
   \pgfmathwidth{"%
      \noexpand\tikz[minimum width=0pt,inner sep=0pt,outer sep=0pt]{%
         \noexpand\node[\expandonce{#2}]{\noexpand#1};%
      }%
   "}%
   \pgfmathsetlength{\CSXlabelwidth}{\pgfmathresult}%
   \ifnum\CSXlabelwidth>\CSXarrowlength%
      \pgfmathsetlength{\CSXarrowlength}{\pgfmathresult}%
      \edef\CSX@arrowlength{\pgfmathresult}%
   \fi%
}
\def\CSX@savebox@set#1#2{%
   % #1=boxname
   % #2=box content
   \@ifundefined{#1}{%
      \edef\CSX@savebox@set@helper{\noexpand\newsavebox{\csname #1\endcsname}}\CSX@savebox@set@helper%
   }{}
   \global\sbox{\csname #1\endcsname}{#2}%
   \usebox{\csname #1\endcsname}%
}%
\def\CSX@savebox@show#1#2{%
   % #1=boxname
   % #2=box content
   \usebox{\@nameuse{#1}}%
}%
\newcommand{\customarrow}[4][\the\CSXarrowlength]{%
   % #1=length
   % #2=arrow style
   % #3=upper text
   % #4=lower text
   \stepcounter{CSXstruct}%
   % Measure upper und lower text
   \setlength{\CSXarrowlength}{0pt}%
   \def\CSX@nodename{Scheme\theCSXscheme Image\theCSXstruct}%
   \def\CSXcustomarrow@uppertext{%
      \let\customstruct\customstruct@inarrow%
      \def\customstruct@inarrow@nodename{\CSX@nodename Upper}%
      #3%
      \let\customstruct\customstruct@outarrow%
   }%
   \def\CSXcustomarrow@lowertext{%
      \let\customstruct\customstruct@inarrow%
      \def\customstruct@inarrow@nodename{\CSX@nodename Lower}%
      #4%
      \let\customstruct\customstruct@outarrow%
   }%
   \let\CSX@savebox\CSX@savebox@set%
   \edef\CSX@arrowlength{0}%
   \CSX@customarrow@widestcaption{\CSXcustomarrow@uppertext}{CSXarrowfont,CSXarrowupper}%
   \CSX@customarrow@widestcaption{\CSXcustomarrow@lowertext}{CSXarrowfont,CSXarrowlower}%
   \let\CSX@savebox\CSX@savebox@show%
   % Set matrix entries
   \pgfmathsetlength{\CSXarrowlength}{\CSX@arrowlength + \CSXarrowadvance}%
   \edef\customarrow@temp{%
      % Reserve space in matrix
      \noexpand\node(\CSX@nodename)%
                    {\noexpand\hbox to #1{}};%
      % Add arrow command
      \noexpand\CSXcommands{%
         \noexpand\pgfmathsetlength{\noexpand\CSXarrowlength}{#1}%
         \noexpand\def\noexpand\CSXnodename{\CSX@nodename}%
         \noexpand\draw [text width=(#1-\CSXarrowadvance),#2]%
            ([CSXshiftA]\noexpand\CSXnodename .west) to%
               node (\noexpand\CSXnodename Upper)%
                    [CSXshiftcompensation,CSXarrowfont,CSXarrowupper,auto]%
                    {\expandonce\CSXcustomarrow@uppertext}%
               node (\noexpand\CSXnodename Lower)%
                    [CSXshiftcompensation,CSXarrowfont,CSXarrowlower,auto,swap]%
                    {\expandonce\CSXcustomarrow@lowertext}%
            ([CSXshiftB]\noexpand\CSXnodename .east);%
      }%
   }%
   \edef\customarrow@helper{%
      \noexpand\expandafter\noexpand\gdef\noexpand\csname CSX@list@image@\theCSXstruct\endcsname{%
         \expandonce\customarrow@temp%
      }%
   }\customarrow@helper%
   \expandafter\gdef\csname CSX@list@caption@\theCSXstruct\endcsname{%
      \node(Scheme\theCSXscheme Caption\theCSXstruct){};%
   }%
   \ifCSX@scheme%
      % Inside Chemscheme environment
   \else%
      % Outside Chemscheme environment
      \CSX@print%
   \fi%
   \ignorespaces%
}
\newcommand{\CSXdeclarearrow}[2]{%
   % #1=macro name
   % #2=TikZ style
   \newcommand{#1}[3][\the\CSXarrowlength]{%
      % ##1=length
      % ##2=upper caption
      % ##3=lower caption
      \customarrow[##1]{#2}{##2}{##3}%
   }
}
\newcommand{\CSXdeclarearrowbundle}[2]{%
   % #1=macro name
   % #2=TikZ style
   % normal
   \CSX@declarearrowbundle{#1}{#2}%
   % dashed
   \CSX@declarearrowbundle{#1Dashed}{#2,dashed}%
}
\newcommand{\CSX@declarearrowbundle}[2]{%
   % #1=macro name
   % #2=TikZ style
   \edef\CSX@declarearrowbundle@helper{%
      % normal arrow
      \noexpand\CSXdeclarearrow{\csname #1\endcsname}{#2}%
      % crossed out arrow
      \noexpand\CSXdeclarearrow{\csname C#1\endcsname}{#2,CSXCrossArrow}%
      % striked out arrow
      \noexpand\CSXdeclarearrow{\csname S#1\endcsname}{#2,CSXStrikeArrow}%
      % Double striked out arrow
      \noexpand\CSXdeclarearrow{\csname DS#1\endcsname}{#2,CSXDStrikeArrow}%
   }\CSX@declarearrowbundle@helper%
}
\CSXdeclarearrowbundle{RightArrow}{CSXallarrows,CSXRightArrow}
\CSXdeclarearrowbundle{LeftArrow}{CSXallarrows,CSXLeftArrow}
\CSXdeclarearrowbundle{LeftRightArrow}{CSXallarrows,CSXLeftRightArrow}
\CSXdeclarearrowbundle{DoubleRightArrow}{CSXallarrows,CSXdoublearrows,CSXRightArrow}
\CSXdeclarearrowbundle{DoubleLeftArrow}{CSXallarrows,CSXdoublearrows,CSXLeftArrow}
\CSXdeclarearrowbundle{DoubleLeftRightArrow}{CSXallarrows,CSXdoublearrows,CSXLeftRightArrow}
\CSXdeclarearrowbundle{RightupHarpoon}{CSXallarrows,CSXRightupHarpoon}
\CSXdeclarearrowbundle{RightdownHarpoon}{CSXallarrows,CSXRightdownHarpoon}
\CSXdeclarearrowbundle{LeftupHarpoon}{CSXallarrows,CSXLeftupHarpoon}
\CSXdeclarearrowbundle{LeftdownHarpoon}{CSXallarrows,CSXLeftdownHarpoon}
\CSXdeclarearrowbundle{LeftupRightupHarpoon}{CSXallarrows,CSXLeftupRightupHarpoon}
\CSXdeclarearrowbundle{LeftupRightdownHarpoon}{CSXallarrows,CSXLeftupRightdownHarpoon}
\CSXdeclarearrowbundle{LeftdownRightupHarpoon}{CSXallarrows,CSXLeftdownRightupHarpoon}
\CSXdeclarearrowbundle{LeftdownRightdownHarpoon}{CSXallarrows,CSXLeftdownRightdownHarpoon}
\CSXdeclarearrowbundle{Equilibrium}{CSXallarrows,CSXequilibrium,CSXRightupHarpoon}
\CSXdeclarearrowbundle{RightEquilibrium}{CSXallarrows,CSXRightequilibrium,CSXRightupHarpoon}
\CSXdeclarearrowbundle{LeftEquilibrium}{CSXallarrows,CSXLeftequilibrium,CSXRightupHarpoon}
\CSXdeclarearrowbundle{RRightEquilibrium}{CSXallarrows,CSXLeftequilibrium,CSXLeftupHarpoon}
\CSXdeclarearrowbundle{LLeftEquilibrium}{CSXallarrows,CSXRightequilibrium,CSXLeftupHarpoon}
\CSXdeclarearrowbundle{TwoRightArrow}{CSXallarrows,CSXslashtwoarrow,CSXRightArrow}
\CSXdeclarearrowbundle{TTwoRightArrow}{CSXallarrows,CSXbackslashtwoarrow,CSXRightArrow}
\CSXdeclarearrowbundle{TwoLeftArrow}{CSXallarrows,CSXslashtwoarrow,CSXLeftArrow}
\CSXdeclarearrowbundle{TTwoLeftArrow}{CSXallarrows,CSXbackslashtwoarrow,CSXLeftArrow}
\CSXdeclarearrowbundle{ThreeRightArrow}{CSXallarrows,CSXslashthreearrow,CSXRightArrow}
\CSXdeclarearrowbundle{TThreeRightArrow}{CSXallarrows,CSXbackslashthreearrow,CSXRightArrow}
\CSXdeclarearrowbundle{ThreeLeftArrow}{CSXallarrows,CSXslashthreearrow,CSXLeftArrow}
\CSXdeclarearrowbundle{TThreeLeftArrow}{CSXallarrows,CSXbackslashthreearrow,CSXLeftArrow}
\newcommand{\@struct}[3]{%
   % #1=caption
   % #2=family
   % #3=filename
   \ifthenelse{\equal{#1}{}}{%
      \def\@@struct{{{\fancylabel[#2]{#3}},{}}}%
   }{%
      \def\@@struct{{{\protecting{\def\fancylabelShowLabelEvent{\CSXlabelsep}}\fancylabel[#2]{#3}},{#1}}}%
   }%
}
\WithSuffix\newcommand\@struct*[3]{%
   % #1=caption
   % #2=family
   % #3=filename
   \def\@@struct{{{\fancylabel*[#2]{#3}},{#1}}}%
}
\newcommand\@Struct[3]{%
   % #1=family
   % #2=list of sublabels previously defined with \newstruct
   % #3=filename
   % Use the sort-function of the fancylabel package to sort the label-list
   \def\@@struct{}%
   \def\fancyref@@@@@sort{fancyref@PrevRun@#1@#3@\fancyref@@sort@value}%
   \def\fancyref@sort@list{}%
   \def\fancyref@sort@labellist@unsorted{}%
   \fancyref@sort{#2}%
   \edef\@Struct@helper{%
      \noexpand\fancyref@addtolist{\fancyref@sort@labellist@unsorted}{\noexpand\fancyref@sort@list}%
   }\@Struct@helper%
   \edef\CSX@sorted@list{\fancyref@sort@list}%
   % Generate the caption
   \edef\@@Struct##1##2{%
      % ##1=
      % ##2=sublabel
      \noexpand\@ifundefined{CSX@newstruct@#3@subcaption@##2}{%
         \noexpand\PackageError{chemschemex}{Substructure '##2' not defined as %
                                    substructure of '#3'. %
                                    For the definition of substructures %
                                    use the command \string\newstruct.}{}%
       }{%
         \noexpand\fancyref@addtolist{%
            {{\noexpand\protecting{\noexpand\def\noexpand\fancylabelShowLabelEvent{\noexpand\CSXlabelsep}}%
              \noexpand\fancysublabel[#1]{#3}{##2}},%
             {\noexpand\@nameuse{CSX@newstruct@#3@subcaption@##2}}}}%
            {\noexpand\@@struct}%
       }%
   }%
   \edef\@Struct@helper{%
      \noexpand\fancyref@foreach{\noexpand\@@Struct}{}{\CSX@sorted@list}%
   }\@Struct@helper%
}
\WithSuffix\newcommand\@Struct*[3]{%
   % #1=family
   % #2=list of sublabels previously defined with \newstruct
   % #3=filename
   \def\@@struct{{{\fancysublabel[#1]{#3}{#2}},{}}}%
}
\newcommandx\customstruct@outarrow[4][1={},2={}]{%
   % #1=TikZ option for caption
   % #2=TikZ option for image
   % #3=caption
   % #4=image
   \stepcounter{CSXstruct}%
   % Set Image
   \edef\customstruct@outarrow@temp{%
      \noexpand\node[\expandonce{#2}](Scheme\theCSXscheme Image\theCSXstruct){\expandonce{#4}};%
   }%
   \edef\customstruct@outarrow@helper{%
      \noexpand\expandafter\noexpand\gdef\noexpand\csname CSX@list@image@\theCSXstruct\endcsname{%
         \expandonce\customstruct@outarrow@temp%
      }%
   }\customstruct@outarrow@helper%
   % Generate caption
   \CSXgeneratecaption{#3}{#4}{Scheme\theCSXscheme Caption\theCSXstruct}{#1}%
   % Set caption
   \edef\customstruct@outarrow@temp{%
      \noexpand\node(Scheme\theCSXscheme Caption\theCSXstruct){%
         \noexpand\tikz[CSXcaption,\expandonce{#1}]{%
            \expandonce\CSXcaption%
         }%
      };%
   }%
   \edef\customstruct@outarrow@helper{%
      \noexpand\expandafter\noexpand\gdef\noexpand\csname CSX@list@caption@\theCSXstruct\endcsname{%
         \expandonce\customstruct@outarrow@temp%
      }%
   }\customstruct@outarrow@helper%
   \ifCSX@scheme%
      % Inside Chemscheme environment
   \else%
      % Outside Chemscheme environment
      \CSX@print%
   \fi%
   \ignorespaces%
}
\newcommandx\customstruct@inarrow[4][1={},2={}]{%
   % #1=TikZ option for caption
   % #2=TikZ option for image
   % #3=caption
   % #4=image
   \stepcounter{CSXstructinarrow}%
   \CSXgeneratecaption{#3}{#4}{\customstruct@inarrow@nodename Caption\theCSXstructinarrow}{#1}%
   \ifthenelse{\CSXmaxlabelwidth=0 \AND \CSXmaxtextwidth=0}{%
      \edef\customstruct@inarrow@temp{%
         \noexpand\tikz[remember picture,CSXStructInArrow]{%
            \noexpand\node [\expandonce{#2}]%
                           (\customstruct@inarrow@nodename Image\theCSXstructinarrow)%
                           {\expandonce{#4}};%
         }%
      }%
   }{%
      \edef\customstruct@inarrow@temp{%
         \noexpand\tikz[remember picture,CSXStructInArrow,%
                        baseline=(\CSX@generate@caption@captionname Entry\theCSXcaption .base)]{%
            \noexpand\node [\expandonce{#2}]%
                           (\customstruct@inarrow@nodename Image\theCSXstructinarrow)%
                           {\expandonce{#4}};%
            \noexpand\node [below=of \customstruct@inarrow@nodename Image\theCSXstructinarrow]%
                           (\customstruct@inarrow@nodename Caption\theCSXstructinarrow)%
                           {\noexpand\tikz[CSXcaption,\expandonce{#1}]{\expandonce\CSXcaption}};%
         }%
      }%
   }%
   \CSX@savebox{CSX@savebox@\theCSXstructinarrow}{%
      \customstruct@inarrow@temp%
   }%
   \ignorespaces%
}
\newcommand{\CSXgeneratecaption}[4]{%
   % #1=list of labels and text: {{label1},{text1}},{{label2},{text2}},...
   % #2=Image
   % #3=caption name
   % #4=caption style
   \setcounter{CSXcaption}{0}%
   \setlength{\CSXmaxlabelwidth}{0pt}%
   \setlength{\CSXmaxtextwidth}{0pt}%
   \def\CSXcaption{}%
   \def\CSX@generate@caption@image{#2}%
   \def\CSX@generate@caption@captionname{#3}%
   \def\CSX@generate@caption@captionstyle{CSXcaption,#4}%
   \CSX@generate@@@caption@true%
   \ifthenelse{\equal{#1}{}}{}{%
      \protected@edef\CSXgeneratecaption@helper{\noexpand\fancyref@foreach{\noexpand\CSX@generate@@caption}{}{#1}}%
      \CSXgeneratecaption@helper%
   }%
}
\newcommand{\CSX@generate@@caption}[2]{%
   % #1=
   % #2=label and text: {label1},{text1}
   \edef\CSX@generate@@@caption@lastCSXcaption{\theCSXcaption}%
   \stepcounter{CSXcaption}%
   \fancyref@foreach{\CSX@generate@@@caption}{}{#2}%
   % Execute text-only event
   \ifCSX@generate@@@caption@\else%
      \CSX@generate@@@caption@TextOnly%
         {\CSX@generate@caption@image}%
         {\CSX@generate@caption@captionname Entry\theCSXcaption}%
         {\CSX@generate@caption@captionname Entry\CSX@generate@@@caption@lastCSXcaption}%
         {\CSX@generate@@@caption@label}%
      \CSX@generate@@@caption@true%
   \fi%
}
\newcommand{\CSX@generate@@@caption}[2]{%
   % #1=
   % #2=label or text: label1 or text1
   \ifCSX@generate@@@caption@%
      % Label
      \def\CSX@generate@@@caption@label{#2}%
      \CSX@generate@@@caption@false%
   \else%
      % Text and execute label-and-text event
      \def\CSX@generate@@@caption@text{#2}%
      \CSX@generate@@@caption@LabelAndText%
         {\CSX@generate@caption@image}%
         {\CSX@generate@caption@captionname Entry\theCSXcaption}%
         {\CSX@generate@caption@captionname Entry\CSX@generate@@@caption@lastCSXcaption}%
         {\CSX@generate@@@caption@label}%
         {\CSX@generate@@@caption@text}%
      \CSX@generate@@@caption@true%
      \def\CSX@generate@@@caption@label{}%
      \def\CSX@generate@@@caption@text{}%
   \fi%
}
\newcommand{\CSX@setimagewidth}[1]{%
   % #1=image
   \pgfmathwidth{"%
      \noexpand\tikz[minimum width=0pt,inner sep=0pt,outer sep=0pt]{%
         \noexpand\node{\noexpand#1};%
      }%
   "}%
   \edef\CSX@imagewidth{\pgfmathresult}%
}
\newcommand{\CSX@setmaxlabelwidth}[1]{%
   % #1=label
   \pgfmathwidth{"%
      \noexpand\tikz[\expandonce\CSX@generate@caption@captionstyle ,minimum width=0pt,inner sep=0pt,outer sep=0pt]{%
         \noexpand\node[CSXlabelfont]{\noexpand#1};%
      }%
   "}%
   \pgfmathsetlength{\CSXlabelwidth}{\pgfmathresult}%
   \edef\CSX@labelwidth{\pgfmathresult}%
   \ifnum\CSXlabelwidth<\CSXmaxlabelwidth%
   \else%
      \pgfmathsetlength{\CSXmaxlabelwidth}{\pgfmathresult}%
      \edef\CSX@maxlabelwidth{\pgfmathresult}%
   \fi%
}
\newcommand{\CSX@settextwidth}[1]{%
   % #1=text
   \pgfmathwidth{"%
      \noexpand\tikz[\expandonce\CSX@generate@caption@captionstyle ,minimum width=0pt,inner sep=0pt,outer sep=0pt]{%
         \noexpand\node[CSXtextfont]{\noexpand#1};%
      }%
   "}%
   \pgfmathsetlength{\CSXtextwidth}{\pgfmathresult}%
   \edef\CSX@textwidth{\pgfmathresult}%
   \ifnum\CSXtextwidth<\CSXmaxtextwidth%
   \else%
      \pgfmathsetlength{\CSXmaxtextwidth}{\pgfmathresult}%
      \edef\CSX@maxtextwidth{\pgfmathresult}%
   \fi%
}
\newcommand{\CSX@setvphantom}{%
   \ifdim\CSXlabelwidth=0pt%
      \ifdim\CSXtextwidth=0pt%
         \def\CSX@vphantom{}%
      \else%
         \def\CSX@vphantom{font/.expand once={\tikz@textfont\vphantom{Ag}}}%
      \fi%
   \else%
      \def\CSX@vphantom{font/.expand once={\tikz@textfont\vphantom{Ag}}}%
   \fi%
}
\newcommand{\CSX@generate@@@caption@LabelAndText}[5]{%
   % #1=image command
   % #2=node name
   % #3=last node name
   % #4=label
   % #5=text
   % Get the image width
   \CSX@setimagewidth{#1}%
   % Get the widest label
   \CSX@setmaxlabelwidth{#4}%
   % Measure the text width
   \def\CSX@textwidth{0}%
   \CSX@settextwidth{#5}%
   \CSX@setvphantom%
   % Typeset caption
   \edef\CSX@generate@@@caption@tempentry{%
      \noexpand\gappto\noexpand\CSXcaption{%
         % Set \CSXimagewidth
         \noexpand\pgfmathsetlength{\noexpand\CSXimagewidth}%
                                   {\CSX@imagewidth}%
         % Set \CSXlabelwidth
         \noexpand\pgfmathsetlength{\noexpand\CSXlabelwidth}%
                                   {\CSX@labelwidth}%
         % Set \CSXmaxlabelwidth
         \noexpand\pgfmathsetlength{\noexpand\CSXmaxlabelwidth}%
                                   {\CSX@maxlabelwidth}%
         % Set \CSXtextwidth
         \noexpand\pgfmathsetlength{\noexpand\CSXtextwidth}%
                                   {\CSX@textwidth}%
         % Set \CSXmaxtextwidth
         \noexpand\pgfmathsetlength{\noexpand\CSXmaxtextwidth}%
                                   {\CSX@maxtextwidth}%
         % Print node
         \noexpand\node(#2)[%
            CSXlabelfont,%
            \expandonce\CSX@vphantom,%
            CSXsetlabelwidth,%
            CSXcaptionLabelandText,%
            rectangle split,%
            rectangle split horizontal,%
            rectangle split parts=2,%
            rectangle split part align=base,%
            every two node part/.append style={%
               CSXtextfont,%
               CSXsettextwidth,%
            },%
            \ifCSX@generate@@@caption@LastEntryWasTextOnly%
               \ifnum\theCSXcaption>1%
                  below=of #3.south,%
               \fi%
            \else%
               \ifnum\theCSXcaption>1%
                  below left=of #3.one split south,%
               \fi%
               anchor=one split north%
            \fi%
         ]{%
            \expandonce#4%
            \noexpand\nodepart{two}%
            \expandonce#5%
         };%
      }%
   }\CSX@generate@@@caption@tempentry%
   \CSX@generate@@@caption@LastEntryWasTextOnlyfalse%
}
\newcommand{\CSX@generate@@@caption@TextOnly}[4]{%
   % #1=image command
   % #2=node name
   % #3=last node name
   % #4=label
   % Get the image width
   \CSX@setimagewidth{#1}%
   % Get the widest label
   \CSX@setmaxlabelwidth{}%
   % Measure the text width
   \def\CSX@textwidth{0}%
   \CSX@settextwidth{#4}%
   \CSX@setvphantom%
   % Typeset caption
   \edef\CSX@generate@@@caption@tempentry{%
      \noexpand\gappto\noexpand\CSXcaption{%
         % Set \CSXimagewidth
         \noexpand\pgfmathsetlength{\noexpand\CSXimagewidth}%
                                   {\CSX@imagewidth}%
         % Set \CSXmaxlabelwidth
         \noexpand\pgfmathsetlength{\noexpand\CSXmaxlabelwidth}%
                                   {\CSX@maxlabelwidth}%
         % Set \CSXtextwidth
         \noexpand\pgfmathsetlength{\noexpand\CSXtextwidth}%
                                   {\CSX@textwidth}%
         % Set \CSXmaxtextwidth
         \noexpand\pgfmathsetlength{\noexpand\CSXmaxtextwidth}%
                                   {\CSX@maxtextwidth}%
         % Print node
         \noexpand\node(#2)[%
            CSXtextfont,%
            \expandonce\CSX@vphantom,%
            CSXsettextwidth,%
            CSXcaptionTextOnly,%
            \ifnum\theCSXcaption>1%
               below=of #3.south,%
            \fi%
         ]{%
            \expandonce#4%
         };%
      }%
   }\CSX@generate@@@caption@tempentry%
   \CSX@generate@@@caption@LastEntryWasTextOnlytrue%
}
\newcommand{\CSX@print}{%
   \ifnum\theCSXstruct=0%
      \PackageWarning{chemschemex}{Empty Chemscheme environment detected.}
   \else%
      \let\CSX@printlist\empty%
      \CSX@@print%
   \fi%
   \setcounter{CSXstructinarrow}{0}%
   % Print scheme
   \begin{tikzpicture}[CSX]%
   \matrix [CSXmatrix]{%
      \CSX@printlist%
   };%
   \CSX@commands%
   \end{tikzpicture}%
   \stepcounter{CSXscheme}%
   \setcounter{CSXstruct}{0}%
   \setcounter{CSXstructinarrow}{0}%
   \gdef\CSX@printlist{}%
   \gdef\CSX@commands{}%
   \gdef\ChemschemeNextRow@list{}%
}
\newcommand{\CSX@@print}{%
   % #1=
   % #2=row (integer)
   \def\lastx{1}%
   \ChemschemeNextRow%
   \foreach \x [remember=\xplus as \lastx,%
                evaluate=\x as \xplus using int(\x+1)]%
               in \ChemschemeNextRow@list {%
      \ifthenelse{\x < \lastx}{}{%
         % Create Image row
         \foreach \y in {\lastx,...,\x}{%
            \CSX@@@print{\csname CSX@list@image@\y\endcsname}%
         }%
         \gappto\CSX@printlist{\pgfmatrixendrow}%
         % Create Caption row
         \foreach \y in {\lastx,...,\x}{%
            \CSX@@@print{\csname CSX@list@caption@\y\endcsname}%
         }%
         \edef\CSX@print@tempentry{%
            \noexpand\gappto\noexpand\CSX@printlist{%
               \noexpand\pgfmatrixendrow[\csname ChemschemeNextRow@\x\endcsname]%
            }%
         }\CSX@print@tempentry%
      }%
   }%
}
\newcommand{\CSX@@@print}[2]{%
   % #1=image
   \ifnum\y<\x%
      \def\CSX@@@print@nextcell{\pgfmatrixnextcell}%
   \else%
      \def\CSX@@@print@nextcell{}%
   \fi%
   \edef\CSX@print@tempentry{%
      \noexpand\gappto\noexpand\CSX@printlist{%
         \noexpand#1%
         \expandonce\CSX@@@print@nextcell%
      }%
   }\CSX@print@tempentry%
}
\endinput
%%
%% End of file `chemschemex.sty'.
