From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/latex/contrib/chemschemex/chemschemex.dtx | 2315 ++++++++++++++++++++++
 1 file changed, 2315 insertions(+)
 create mode 100644 macros/latex/contrib/chemschemex/chemschemex.dtx

(limited to 'macros/latex/contrib/chemschemex/chemschemex.dtx')

diff --git a/macros/latex/contrib/chemschemex/chemschemex.dtx b/macros/latex/contrib/chemschemex/chemschemex.dtx
new file mode 100644
index 0000000000..e656032043
--- /dev/null
+++ b/macros/latex/contrib/chemschemex/chemschemex.dtx
@@ -0,0 +1,2315 @@
+% \iffalse meta-comment
+%
+% 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
+%
+% <package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+% <package>\ProvidesPackage{chemschemex}
+% <package>[2018/01/20 v1.2]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{chemschemex}
+\usepackage{caption}
+\usepackage{float}
+\newfloat{example}{htbp}{los}%
+\floatname{example}{Example}%
+\captionsetup{font={footnotesize},textfont={sf},labelfont={sf,bf}}
+\usepackage{sectsty}
+\usepackage[hidelinks]{hyperref}
+\usepackage{fancyvrb}
+\allsectionsfont{\sffamily}
+\GetFileInfo{chemschemex.dtx}
+\EnableCrossrefs
+\CodelineIndex
+\OnlyDescription
+\RecordChanges
+\newstruct[{R=H},{R=Me},{R=Ph}]{maleimid}{maleimid}{Maleimid}{}
+\newstruct{cp}{cyclopentadiene}{Cyclopentadiene}{cp}
+\newstruct[{R=H},{R=Me},{R=Ph}]{product}{}{}{}
+\date{2018/01/20}
+\begin{document}
+    \DocInput{chemschemex.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%   Digits        \0\1\2\3\4\5\6\7\8\9
+%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%   Dollar        \$     Percent       \%     Ampersand     \&
+%   Acute accent  \'     Left paren    \(     Right paren   \)
+%   Asterisk      \*     Plus          \+     Comma         \,
+%   Minus         \-     Point         \.     Solidus       \/
+%   Colon         \:     Semicolon     \;     Less than     \<
+%   Equals        \=     Greater than  \>     Question mark \?
+%   Commercial at \@     Left bracket  \[     Backslash     \\
+%   Right bracket \]     Circumflex    \^     Underscore    \_
+%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%   Right brace   \}     Tilde         \~}
+%
+% \changes{v1.0}{2014/07/15}{Initial version}
+% \changes{v1.1}{2017/04/02}{Bug within the \textbackslash Struct command fixed}
+% \changes{v1.1.1}{2017/04/03}{No code changes, documentation attached}
+% \changes{v1.2}{2018/01/20}{Dependency on etextools (causes some compatibility issues) removed}
+%
+% \GetFileInfo{chemschemex.sty}
+%
+%
+% \title{The \CSX{} package\thanks{This document corresponds to \CSX{}~\fileversion{}, dated \filedate.}}
+%
+% \author{Dominik Siegel \\ \texttt{dominik.siegel@yahoo.de}}
+% \newcommand{\CSX}{\textsf{chemschemex}}
+% \newcommand{\FL}{\textsf{fancylabel}}
+% \newcommand{\TikZ}{\textsf{Ti\emph{k}Z}}
+% 
+% \maketitle
+%
+% \begin{abstract}
+% The \CSX{} package provides a comfortable method for the typesetting of (chemical) schemes based on \TikZ{} code, including an automatical structure referencing.
+% \end{abstract}
+%
+% \begin{example}
+% \begin{minipage}[c]{0.49\linewidth}
+%     \begin{Chemscheme}
+%         \struct{maleimid}
+%         \RightArrow{\struct{cp}}{DEE}
+%         \struct[80\,\%]{product}
+%     \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}[c]{0.5\linewidth}
+%\begin{verbatim}
+%\begin{Chemscheme}
+%   \struct{maleimid}
+%   \RightArrow{\struct{cp}}{DEE}
+%   \struct[80\,\%]{product}
+%\end{Chemscheme}
+%\end{verbatim}
+% \end{minipage}
+% \caption{Chemical scheme (left) produced by a simple code (right).}\label{fig.intro.1}
+% \end{example}
+%
+% \tableofcontents
+%
+% \section{Introduction and motivation}
+% While \LaTeX{} is a powerful tool for mathematical or physical issues the typesetting of chemistry derived problems is still a little bit annoying. When I wrote my thesis in organic chemistry I missed a package which produces chemical schemes as easy as you include a graphic into your document. I simply wanted to draw my structures in \textsc{ChemDraw}, inlcude them into my document and label them.
+% 
+% The packages \textsf{chemscheme} and \textsf{chemnum} offer a possibility to rerender image files for this purpose. Nevertheless, they only modify a scheme that already exists. This means, that arrows, margins, alignments and other parameters cannot be defined or changed globally in your document.
+%
+% By using the \TikZ{} and the \FL{} package (which has actually been written as slave of this package) the \CSX{} package meets all these requirements (see example \ref{fig.intro.1}).
+%
+%
+%
+% \section{Usage}
+% \noindent\DescribeMacro{\usepackage}
+% |\usepackage[<options>]{chemschemex}|\vspace{0.5em}
+%
+% \noindent The command above will load the \CSX{} package. It requires the packages \textsf{xkeyval}, \textsf{etextools}, \textsf{xargs}, \textsf{ifthen}, \textsf{suffix}, \TikZ{}, \textsf{graphicx}, and \FL{}. I strongly recommend to read the documentation of the \FL{} package because all referencing functions are provided by this package. It contains a lot of useful options that are not described in this documentation.
+%
+%
+% \newpage
+% \section{User commands}
+%
+% \subsection{Basic commands}
+% \noindent\DescribeMacro{\customstruct}
+% |\customstruct[<TikZ-capt>][<TikZ-obj>]{<capt>}{<obj>}|\vspace{0.5em}
+%
+% \noindent The |\customstruct| command typesets the object \textcolor{red}{|<obj>|} in the first row of a \TikZ{} matrix and the caption \textcolor{blue}{|<capt>|} in the second row. The caption is supposed to be given as comma-separated list of label(s) and text. The two optional arguments |<TikZ-capt>| and |<TikZ-obj>| can be used to pass options to \TikZ{} elements (for further information see section \ref{custom}). All the following structure commands are based on |\customstruct|.
+%
+% \begin{minipage}{0.27\linewidth}
+% \begin{Chemscheme}
+% \customstruct[nodes={draw=blue}]
+%              [draw=red]
+%              {{{label1:},{text}},{{ll2:},{a longer text}}}
+%              {object e.g. image}
+% \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}{0.6\linewidth}
+% \begin{verbatim}
+% \customstruct[nodes={draw=blue}][draw=red]
+%              {{{label1:},{text}},
+%               {{ll2:},{a longer text}}}
+%              {object e.g. image}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\CSXimage}
+% |\CSXimage[<img-opt>]{<img>}|\vspace{0.5em}
+%
+% \noindent The |\CSXimage| command includes the image |<img>| using the global options |<global-img-opt>| defined by the |image| option (see section \ref{image}) and the options given by |<img-opt>|. This command is used in all the following structure commands and expands to |\includegraphics[<global-img-opt>,<img-opt>]{<img>}|.
+% 
+%
+%
+% \subsection{Structure commands}
+% \vspace{3ex}\noindent\DescribeMacro{\struct}
+% |\struct[<capt>][<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<img>}|\vspace{0.5em}
+%
+% \noindent The |\struct| command inlcudes the image |<img>|, sets a fancylabel (therefore it uses |<img>| as marker and |<fam>| as family, default: |<fam>|=|CSX|; the use of families is described in the \FL{} package) and prints it. If a |<caption>| is given, it will also print the caption behind the label. The macro |\CSXlabelsep| can be changed with the |labelseparator| option.
+%
+% \begin{minipage}{0.2\linewidth}
+% \struct[text]{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.79\linewidth}
+% \begin{verbatim}
+% \struct[text]{maleimid}
+%    expands to:
+% \customstruct{{{\fancylabel[CSX]{maleimid}\CSXlabelsep},{}}}
+%              {\CSXimage{maleimid}}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \newpage
+% \vspace{3ex}\noindent\DescribeMacro{\structalt}
+% |\structalt[<capt>][<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<img>}{<alt-img>}|\vspace{0.5em}
+%
+% \noindent The |\structalt| command includes an image |<alt-img>| but the labeling corresponds to |<img>|.
+%
+% \begin{minipage}{0.2\linewidth}
+% \structalt{product}{product_num}
+% \end{minipage}
+% \begin{minipage}{0.7\linewidth}
+% \begin{verbatim}
+% \structalt{product}{product_num}
+%    expands to:
+% \customstruct{{{\fancylabel[CSX]{product}},{}}}
+%              {\CSXimage{product_num}}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\struct*}
+% \noindent\DescribeMacro{\structalt*}
+% |\struct*[<capt>][<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<img>}|\\
+% |\structalt*[<capt>][<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<img>}{<alt-img>}|\vspace{0.5em}
+%
+% \noindent The |\struct*| and |\structalt*| commands do the same as the corresponding nonstarred versions but use |\fancylabel*| instead of |\fancylabel|. This means, that a label for this structure will be defined but not printed.
+%
+% \begin{minipage}{0.2\linewidth}
+% \struct*{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.7\linewidth}
+% \begin{verbatim}
+% \struct*{maleimid}
+%    expands to:
+% \customstruct{{{\fancylabel*[CSX]{maleimid}},{}}}
+%              {\CSXimage{maleimid}}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\struct-}
+% |\struct-[<capt>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<img>}|\vspace{0.5em}
+%
+% \noindent The |\struct-| command includes an image |<img>| without any labeling.
+%
+% \begin{minipage}{0.2\linewidth}
+% \struct-[text]{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.7\linewidth}
+% \begin{verbatim}
+% \struct-[text]{maleimid}
+%    expands to:
+% \customstruct{{{},{text}}}
+%              {\CSXimage{maleimid}}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\newstruct}
+% |\newstruct[<sublabels>]{<img>}{<structname>}{<Structname>}{<abbr>}|\vspace{0.5em}
+%
+% \noindent If you want to use substructures you have to define them in the preamble. The optional argument |<sublabels>| is a comma-separated list of subcaptions. Whenever you want to refer to them you just have to use their numbers. In this example the first entry (|R=H|) gets the number 1, the second entry (|R=Me|) gets the number 2 and so on. If you use a structure without substructures it is not necessary to use |\newstruct|. However, the |\newstruct| command defines the name (and Name) und abbreviation of the structure what allows you to use the commands |\structname|, |\Structname| and |\structabbr| for this structure.\vspace{2ex}
+%
+% \begin{minipage}{0.9\linewidth}
+% \begin{verbatim}
+%\newstruct[{R=H},{R=Me},{R=Ph}]{product}{}{}{}
+% \end{verbatim}
+% \end{minipage}
+%
+% \vspace{3ex}\noindent\textbf{Note:} All of the following structure commands assume that |\newstruct| has been used for the filename |<img>| before.
+%
+% \vspace{3ex}\noindent\DescribeMacro{\Struct}
+% |\Struct[<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<sublabels>}{<img>}|\vspace{0.5em}
+%
+% \noindent To use the |\Struct| command, the structure and its substructure have to be defined by the |\newstruct| command. It inlcudes the image |<img>|, sets the sublabels given in the comma-separated list of |<sublabels>| and prints each sublabel with the subcaption previously given to the |\newstruct| command (one line per sublabel).
+%
+% \begin{minipage}{0.2\linewidth}
+% \Struct{1,2,3}{product}
+% \end{minipage}
+% \begin{minipage}{0.7\linewidth}
+% \begin{verbatim}
+% \Struct{1,2,3}{product}
+%    expands to:
+% \customstruct{{{\fancysublabel[CSX]{product}{1}\CSXlabelsep},{R=H}},
+%               {{\fancysublabel[CSX]{product}{2}\CSXlabelsep},{R=Me}},
+%               {{\fancysublabel[CSX]{product}{3}\CSXlabelsep},{R=Ph}}}
+%              {\CSXimage{product}}
+% \end{verbatim}
+% \end{minipage}
+%
+% \vspace{3ex}\noindent\DescribeMacro{\Struct*}
+% |\Struct*[<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<sublabels>}{<img>}|\vspace{0.5em}
+%
+% \noindent To use the |\Struct*| command, the structure and its substructure have to be defined by the |\newstruct| command. It inlcudes the image |<filename>|, sets the sublabels given in the comma-separated list of |<sublabels>| and prints each sublabel without its subcaption previously given to the |\newstruct| command.
+%
+% \begin{minipage}{0.2\linewidth}
+% \Struct*{1,3}{product}
+% \end{minipage}
+% \begin{minipage}{0.7\linewidth}
+% \begin{verbatim}
+% \Struct*{1,3}{product}
+%    expands to:
+% \customstruct{{{\fancysublabel[CSX]{product}{1,3}},{}}}
+%              {\CSXimage{product}}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\Structalt}
+% |\Structalt[<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<sublabels>}{<img>}{<alt-img>}|\vspace{0.5em}
+%
+% \noindent Works like the |\Struct| command but includes the image |<alt-img>|. Labeling corresponds to |<img>|.
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\Structalt*}
+% |\Structalt*[<fam>][<img-opt>][<TikZ-capt>][<TikZ-obj>]{<sublabels>}{<img>}{<alt-img>}|\vspace{0.5em}
+%
+% \noindent Works like the |\Struct*| command but includes the image |<alt-img>|. Labeling corresponds to |<img>|.
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\structname}
+% |\structname{<img>}|\vspace{0.5em}
+%
+% \noindent Prints the name of the structure |<img>| that has been previously defined by the |\newstruct| command. This command is recommended for the chemical name without a leading capital letter (inside a sentence).
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\Structname}
+% |\Structname{<img>}|\vspace{0.5em}
+%
+% \noindent Prints the name of the structure |<img>| that has been previously defined by the |\newstruct| command. This command is recommended for the chemical name with a leading capital letter (at the beginning of a sentence).
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\structabbr}
+% |\structabbr{<img>}|\vspace{0.5em}
+%
+% \noindent Prints the abbreviation of the structure |<img>| that has been previously defined by the |\newstruct| command.
+%
+%
+%
+%
+% \subsection{The Chemscheme environment}
+%
+% \noindent\DescribeEnv{Chemscheme}
+% |\begin{Chemscheme}...structure code...\end{Chemscheme}|\vspace{0.5em}
+% 
+% \noindent If a structure command appears outside a |Chemscheme| environment each command will typeset the image and caption in its own matrix. This causes no kind of adjustment.
+%
+% \begin{minipage}{0.3\linewidth}
+% \struct{cp}
+% \struct[long caption]{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.59\linewidth}
+% \begin{verbatim}
+% \struct{cp}
+% \struct[long caption]{maleimid}
+% \end{verbatim}
+% \end{minipage}
+%
+% \noindent But if structure commands appear inside a |Chemscheme| environment all images and captions are printed in one matrix. This causes adjustment of the image (by default center) and the caption row (by default top) according to the \TikZ{} style |CSXmatrix|.
+%
+%
+% \begin{minipage}{0.3\linewidth}
+% \begin{Chemscheme}
+% \struct{cp}
+% \struct[long caption]{maleimid}
+% \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}{0.59\linewidth}
+% \begin{verbatim}
+% \begin{Chemscheme}
+%    \struct{cp}
+%    \struct[long caption]{maleimid}
+% \end{Chemscheme}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\ChemschemeNextRow}
+% |\ChemschemeNextRow[<row-sep>]|\vspace{0.5em}
+%
+% \noindent If you want to use the matrix adjustment over multiple lines you can produce a 'linebreak' using the |\ChemschemeNextRow| command. The optional argument |<row-sep>| allows you to define the space between the rows.
+%
+% \begin{minipage}[c]{0.49\linewidth}
+%     \begin{Chemscheme}
+%         \struct{maleimid}
+%         \RightArrow{\struct{cp}}{DEE}
+%         \struct[80\,\%]{product}
+%         \ChemschemeNextRow[10pt]
+%         \struct[80\,\%]{product}
+%         \LeftArrow{\struct{cp}}{DEE}
+%         \struct{maleimid}
+%     \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}[c]{0.5\linewidth}
+%\begin{verbatim}
+%\begin{Chemscheme}
+%   \struct{maleimid}
+%   \RightArrow{\struct{cp}}{DEE}
+%   \struct[80\,\%]{product}
+%   \ChemschemeNextRow[10pt]
+%   \struct[80\,\%]{product}
+%   \LeftArrow{\struct{cp}}{DEE}
+%   \struct{maleimid}
+%\end{Chemscheme}
+%\end{verbatim}
+% \end{minipage}
+%
+% \begin{minipage}[c]{0.49\linewidth}
+%     \begin{Chemscheme}
+%         \struct{maleimid}
+%         \RightArrow{\struct{cp}}{DEE}
+%         \struct[80\,\%]{product}
+%     \end{Chemscheme}
+%     \begin{Chemscheme}
+%         \struct[80\,\%]{product}
+%         \LeftArrow{\struct{cp}}{DEE}
+%         \struct{maleimid}
+%     \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}[c]{0.5\linewidth}
+%\begin{verbatim}
+%\begin{Chemscheme}
+%   \struct{maleimid}
+%   \RightArrow{\struct{cp}}{DEE}
+%   \struct[80\,\%]{product}
+%\end{Chemscheme}
+%\begin{Chemscheme}
+%   \struct[80\,\%]{product}
+%   \LeftArrow{\struct{cp}}{DEE}
+%   \struct{maleimid}
+%\end{Chemscheme}
+%\end{verbatim}
+% \end{minipage}
+%
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\CSXcommands}
+% |\CSXcommands{<TikZ-code>}|\vspace{0.5em}
+%
+% \noindent The |CSXcommands| macro allows you to draw any \TikZ{} element(s) after the typesetting of the structure matrix. 
+%
+% \hspace{-30pt}\begin{minipage}[c]{0.39\linewidth}
+% \begin{Chemscheme}
+%    \struct{maleimid}
+%    \RightArrow{\struct{cp}}{DEE}
+%    \Struct{1,2}{product}
+%    \CSXcommands{\draw[->,CSXallarrows,draw=red]
+%                         (Scheme\theCSXscheme Caption3Entry1.west) to 
+%                         ([xshift=-8pt]Scheme\theCSXscheme Caption3Entry1.west) to 
+%                         node[auto,swap,CSXlabelfont,red]{a}
+%                         ([xshift=-8pt]Scheme\theCSXscheme Caption3Entry2.west) to 
+%                         (Scheme\theCSXscheme Caption3Entry2.west);}
+% \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}[c]{0.6\linewidth}
+%\begin{verbatim}
+%\begin{Chemscheme}
+%    \struct{maleimid}
+%    \RightArrow{\struct{cp}}{DEE}
+%    \Struct{1,2}{product}
+%    \CSXcommands{
+%       \draw[->,CSXallarrows,draw=red]
+%            (Scheme\theCSXscheme Caption3Entry1.west) to 
+%            ([xshift=-8pt]Scheme\theCSXscheme Caption3Entry1.west) to 
+%            node[auto,swap,CSXlabelfont,red]{a}
+%            ([xshift=-8pt]Scheme\theCSXscheme Caption3Entry2.west) to 
+%            (Scheme\theCSXscheme Caption3Entry2.west);
+%    }
+%\end{Chemscheme}
+%\end{verbatim}
+% \end{minipage}
+% 
+%
+%
+% \newpage
+% \subsection{Ref commands}
+% \noindent\DescribeMacro{\structref}
+% \noindent\DescribeMacro{\structref*}
+% \noindent\DescribeMacro{\structsubref}
+% \noindent\DescribeMacro{\structsubref-}
+% \noindent\DescribeMacro{\structsubref*}
+% |\structref[<fam>]{<img>}|\\
+% |\structref*[<fam>]{<img>}|\\
+% |\structsubref[<fam>]{<img>}{<sublabels>}|\\
+% |\structsubref-[<fam>]{<img>}{<sublabels>}|\\
+% |\structsubref*[<fam>]{<img>}{<sublabels>}|\vspace{0.5em}
+%
+% \noindent The \CSX{} package defines ref commands that actually do exactly what their analogs from the \FL{} package do, but with |CSX| as default family.\footnote{For further information please have a look into the \textsf{fancylabel} package documentation.}
+%
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\CSXstructref}
+% \noindent The |\CSXstructref| macro allows you to change the style of all referencing commands that are shown above. The definition is shown below and may be changed as required.
+%\begin{verbatim}
+% \newcommand{\CSXstructref}[1]{%
+%     % #1=fancyref command
+%     \textbf{#1}%
+% }
+%\end{verbatim}
+%
+%
+% \subsection{Arrows and simples}
+%
+% \noindent\DescribeMacro{\customarrow}
+% |\customarrow[<length>]{<style>}{<upper-capt>}{<lower-capt>}|\vspace{0.5em}
+%
+% \noindent The basic command for arrows is the |\customarrow| command. If the optional argument |<length>| is used, the arrow will have this length. Otherwise the arrow is stretched to the length of the widest caption advanced by the length globally defined via the |arrowadvance| option. The style argument |<style>| allows you to pass options to the \TikZ{} |\draw| command.\vspace{1em}
+%
+% \begin{minipage}{0.25\linewidth}
+% \customarrow{->,line width=1pt}{this is a long caption}{short}
+% \end{minipage}
+% \begin{minipage}{0.74\linewidth}
+% \begin{verbatim}
+% \customarrow{->,line width=1pt}
+%             {this is a long caption}
+%             {short}
+% \end{verbatim}
+% \end{minipage}
+%
+% \begin{minipage}{0.25\linewidth}
+% \customarrow[60pt]{->,CSXarrowupper/.append style={red}}{this is a long caption}{short}
+% \end{minipage}
+% \begin{minipage}{0.74\linewidth}
+% \begin{verbatim}
+% \customarrow[60pt]
+%             {->,CSXarrowupper/.append style={red}}
+%             {this is a long caption}
+%             {short}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \noindent\DescribeMacro{\RightArrow}
+% \noindent\DescribeMacro{\<arrow-cmd>}
+% |\RightArrow[<length>]{<upper-capt>}{<lower-capt>}|\\
+% |\<arrow-cmd>[<length>]{<upper-capt>}{<lower-capt>}|\vspace{0.5em}
+%
+% \noindent The table below shows a couple of arrows that are based on the |\customarrow| command. You might define some other arrows using the |\CSXdeclarearrow| command.
+% 
+% {
+% \newcommand{\CSXarrowtablex}[2][60pt]{
+%    \CSXarrowtable[#1]{#2}
+%    \CSXarrowtable[#1]{C#2}
+%    \CSXarrowtable[#1]{S#2}
+%    \CSXarrowtable[#1]{DS#2}
+% }
+% \newcommand{\CSXarrowtable}[2][60pt]{
+%    \csname #2\endcsname[#1]{}{\textbackslash #2}
+% }
+% \def\CSXarrowadvance{0pt}
+% \tikzset{%
+%    CSXarrowfont/.style={%
+%       font={\tiny\sffamily},%
+%    },%
+%    CSXmatrix/.style={%
+%    column sep=20pt,%
+%    row sep=5pt,%
+%    }%
+% }
+% \begin{Chemscheme}
+%    \CSXarrowtablex{RightArrow}\ChemschemeNextRow
+%    \CSXarrowtablex{RightArrowDashed}
+% \end{Chemscheme}
+%
+% \noindent All shown arrows have a normal, a crossed out (leading |C|), a striked out (leading |S|) and a double striked out (leading |DS|) version of the solid and the dashed (appending |Dashed|) arrow.
+%
+% \begin{Chemscheme}
+%    \CSXarrowtable{RightArrow}
+%    \CSXarrowtable{LeftArrow}
+%    \CSXarrowtable{LeftRightArrow}\ChemschemeNextRow
+%    \CSXarrowtable{DoubleRightArrow}
+%    \CSXarrowtable{DoubleLeftArrow}
+%    \CSXarrowtable{DoubleLeftRightArrow}\ChemschemeNextRow
+%    \CSXarrowtable{RightupHarpoon}
+%    \CSXarrowtable{RightdownHarpoon}
+%    \CSXarrowtable{LeftupHarpoon}
+%    \CSXarrowtable{LeftdownHarpoon}\ChemschemeNextRow
+%    \CSXarrowtable{LeftupRightupHarpoon}
+%    \CSXarrowtable{LeftupRightdownHarpoon}
+%    \CSXarrowtable{LeftdownRightupHarpoon}
+%    \CSXarrowtable{LeftdownRightdownHarpoon}\ChemschemeNextRow
+%    \CSXarrowtable{Equilibrium}
+%    \CSXarrowtable{RightEquilibrium}
+%    \CSXarrowtable{RRightEquilibrium}
+%    \CSXarrowtable{LeftEquilibrium}
+%    \CSXarrowtable{LLeftEquilibrium}\ChemschemeNextRow
+%    \CSXarrowtable{TwoRightArrow}
+%    \CSXarrowtable{TTwoRightArrow}
+%    \CSXarrowtable{TwoLeftArrow}
+%    \CSXarrowtable{TTwoLeftArrow}\ChemschemeNextRow
+%    \CSXarrowtable{ThreeRightArrow}
+%    \CSXarrowtable{TThreeRightArrow}
+%    \CSXarrowtable{ThreeLeftArrow}
+%    \CSXarrowtable{TThreeLeftArrow}
+% \end{Chemscheme}
+% }
+%
+%
+% \vspace{3ex}\noindent\DescribeMacro{\CSXdeclarearrow}
+% |\CSXdeclarearrow{<arrow-cmd>}{<style>}|\vspace{0.5em}
+%
+% \noindent You can use the |\CSXdeclarearrow| command to declare arrows based on the customstruct command. The definition of |\RightArrow| is:
+%
+% \begin{verbatim}
+% \CSXdeclarearrow{\RightArrow}{CSXnormalarrows,CSXRightArrow}
+% \end{verbatim}
+%
+% \noindent Considering the default setting of |CSXnormalarrows| and |CSXRightArrow| this means:
+%
+% \begin{verbatim}
+% \CSXdeclarearrow{\RightArrow}{line width=0.7pt,->}
+% \end{verbatim}
+%
+%
+% \noindent\DescribeMacro{\structplus}
+% \noindent\DescribeMacro{\structminus}
+% |\structplus|\\
+% |\structminus|\vspace{0.5em}
+%
+% \noindent The simples (this is how I call arrow-like elements without a upper or lower caption) |\structplus| and |\structminus| can be used like any structure or arrow command:
+%
+% \begin{minipage}{0.59\linewidth}
+% \begin{Chemscheme}
+%    \struct{maleimid}
+%    \structplus
+%    \struct{cp}
+%    \RightArrow{}{DEE}
+%    \struct{product}
+% \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}{0.35\linewidth}
+% \begin{verbatim}
+% \begin{Chemscheme}
+%    \struct{maleimid}
+%    \structplus
+%    \struct{cp}
+%    \RightArrow{}{DEE}
+%    \struct{product}
+% \end{Chemscheme}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+%
+%
+% \section{Options}
+% \subsection{The image option}\label{image}
+% \noindent\DescribeMacro{image=}
+% |\usepackage[image={<global-img-opt>}]{chemschemex}|\vspace{0.5em}
+%
+% \noindent All structure commands except |\customstruct| internally use the |\CSXimage| command to include pictures with |\includegraphics|. The |image| option allows you to define options that will be passed to any image that is inserted via |\CSXimage|. The default value is |image={scale=0.7}|.
+%
+%
+% \subsection{The labelseparator option}
+% \noindent\DescribeMacro{labelseparator=}
+% |\usepackage[labelseparator=<value>]{chemschemex}|\vspace{0.5em}
+%
+% \noindent The |<value>| given by the |labelseparator| option is set behind every |\fancylabel| inside a structure command if some text follows. The value is saved in |\CSXlabelsep|. The default value is |labelseparator={:\,}|.
+%
+%\begin{Chemscheme}
+%   \struct[text]{maleimid}
+%   \CSXcommands{%
+%      \draw[<-,draw=red]([xshift=-2pt]Scheme\theCSXscheme Caption1Entry1.one split south)%
+%           to  ([xshift=-2pt,yshift=-10pt]Scheme\theCSXscheme Caption1Entry1.one split south) node[yshift=-3pt,font={\tiny\sffamily}]{\textcolor{red}{labelseparator}};
+%   }
+%\end{Chemscheme}
+%
+%
+%
+%
+% \subsection{The arrowadvance option}
+% \noindent\DescribeMacro{arrowadvance=}
+% |\usepackage[arrowadvance=<length>]{chemschemex}|\vspace{0.5em}
+%
+% \noindent Every arrow with undefined length argument will be as long as its widest caption plus the length given by the |arrowadvance| option. This is also the minimal length of an arrow (when no captions are given). The default value is |arrowadvance=10pt|.
+%
+%
+%
+%
+% \section{Customization and advanced examples}
+% \subsection{Predefined \TikZ{} styles}\label{custom}
+%
+% \noindent There are a lot of \TikZ{} styles that are already defined by the \CSX{} package. The following two examples show the code that is generated by \CSX{} and hopefully help you to understand the function of each style. Some of them can be changed (\textcolor{green!75!black}{green}), some of them must not be changed (\textcolor{red}{red}) to prevent strange results or even errors. If you want to change fonts please use the \textcolor{blue}{blue} coloured styles instead of appending |font=| to any style since this will cause wrong calculations. The \textcolor{orange}{orange} entries are styles that are optional arguments of |\customstruct|.
+%
+% \begin{minipage}{0.16\linewidth}
+% \customstruct{{{text}}}{\CSXimage{maleimid}}
+% \end{minipage}
+% \begin{minipage}{0.7\linewidth}
+% \begin{verbatim}
+% \customstruct{{{text}}}{\CSXimage{maleimid}}
+% \end{verbatim}
+% \end{minipage}
+% 
+% \newcommand{\textred}[1]{\textcolor{red}{#1}}
+% \newcommand{\textblue}[1]{\textcolor{blue}{#1}}
+% \newcommand{\textorange}[1]{\textcolor{orange}{#1}}
+% \newcommand{\textgreen}[1]{\textcolor{green!75!black}{#1}}
+% \begin{Verbatim}[gobble=1,fontsize=\small,commandchars=!*~]
+%\begin{tikzpicture}[!textgreen*CSX~]
+%   \matrix [!textgreen*CSXmatrix~]{
+%      % Image row
+%      \node[!textorange*<TikZ-obj>~]
+%           (Scheme1Image1)
+%           {\CSXimage{maleimid}};\\
+%      % Caption row
+%      \node(Scheme1Caption1)
+%           {\tikz[!textgreen*CSXcaption~,!textorange*<TikZ-capt>~]
+%                 {\node[!textblue*CSXtextfont~,!textred*CSXsettextwidth~,!textgreen*CSXcaptionTextOnly~]
+%                       (Scheme1Caption1Entry1)
+%                       {text};
+%                 }
+%           };\\
+%   };
+%\end{tikzpicture}
+% \end{Verbatim}
+%
+% 
+%
+% \vspace{3ex}\begin{minipage}{0.42\linewidth}
+% \begin{Chemscheme}
+%    \customstruct{{{text}}}{\CSXimage{maleimid}}
+%    \RightArrow{\customstruct{{{1},{}}}{\CSXimage{cp}}}{DEE}   
+%    \customstruct{{{label 1},{text 1}},
+%                  {{label 2},{text 2}},
+%                  {text 3}}
+%                 {\CSXimage{product}}
+% \end{Chemscheme}
+% \end{minipage}
+% \begin{minipage}{0.56\linewidth}
+% \begin{verbatim}
+% \begin{Chemscheme}
+%    \customstruct{{{text}}}{\CSXimage{maleimid}}
+%    \RightArrow{\customstruct{{{1},{}}}
+%               {\CSXimage{cp}}}{DEE}   
+%    \customstruct{{{label 1},{text 1}},
+%                  {{label 2},{text 2}},
+%                  {text 3}}
+%                 {\CSXimage{product}}
+% \end{Chemscheme}
+% \end{verbatim}
+% \end{minipage}
+% 
+% \begin{Verbatim}[gobble=1,fontsize=\small,commandchars=!*~]
+%\begin{tikzpicture}[!textgreen*CSX~]
+%   \matrix [!textgreen*CSXmatrix~]{
+%      % Image row
+%      \node[!textorange*<TikZ-obj>~]
+%           (Scheme1Image1)
+%           {\CSXimage{maleimid}};&
+%      \node(Scheme1Image2)
+%           {\hbox to <arrowlength>{}};&
+%      \node[!textorange*<TikZ-obj>~]
+%           (Scheme1Image3)
+%           {\CSXimage{product}};\\
+%      % Caption row
+%      \node(Scheme1Caption1)
+%           {\tikz[!textgreen*CSXcaption~,!textorange*<TikZ-capt>~]
+%                 {\node[!textblue*CSXtextfont~,!textred*CSXsettextwidth~,!textgreen*CSXcaptionTextOnly~]
+%                       (Scheme1Caption1Entry1)
+%                       {text};
+%                 }
+%           };&
+%      \node(Scheme1Caption2)
+%           {};&
+%      \node(Scheme1Caption3)
+%           {\tikz[!textgreen*CSXcaption~,!textorange*<TikZ-capt>~]
+%                 {\node[!textblue*CSXlabelfont~,!textred*CSXsetlabelwidth~,!textgreen*CSXcaptionLabelandText~,
+%                        rectangle split,rectangle split horizontal,
+%                        rectangle split parts=2,rectangle split part align=base,
+%                        every two node part/.style={!textblue*CSXtextfont~,!textred*CSXsettextwidth~}]
+%                       (Scheme1Caption3Entry1)
+%                       {label 1\nodepart{two}text 1};
+%                  \node[!textblue*CSXlabelfont~,!textred*CSXsetlabelwidth~,!textgreen*CSXcaptionLabelandText~,
+%                        rectangle split,rectangle split horizontal,
+%                        rectangle split parts=2,rectangle split part align=base,
+%                        every two node part/.style={!textblue*CSXtextfont~,!textred*CSXsettextwidth~}
+%                        below left=of Scheme1Caption3Entry1.one split south,
+%                        anchor=one split north]
+%                       (Scheme1Caption3Entry2)
+%                       {label 2\nodepart{two}text 2};
+%                  \node[!textblue*CSXtextfont~,!textred*CSXsettextwidth~,!textgreen*CSXcaptionTextOnly~%
+%                        below=of Scheme1Caption3Entry2.south]
+%                       (Scheme1Caption3Entry3)
+%                       {text 3};
+%                 }
+%           };\\
+%   };
+%   \draw[!textgreen*CSXallarrows~,CSXRightArrow,text width=(<arrowlength>-\CSXarrowadvance)]
+%        ([CSXshiftA]Scheme1Image2.west) to
+%        node(Scheme1Image2Upper)
+%            [!textblue*CSXarrowfont~,!textgreen*CSXarrowupper~,auto]
+%            {\tikz[remember picture,!textgreen*CSXStructInArrow~]
+%                  {\node[!textorange*<TikZ-obj>~]
+%                        (Scheme1Image2UpperImage1)
+%                        {\CSXimage{cp}};
+%                   \node[below=of Scheme1Image2UpperImage1]
+%                        (Scheme1Image2UpperCaption1)
+%                        {\tikz[CSXcaption,!textorange*<TikZ-capt>~]
+%                              {\node[!textblue*CSXlabelfont~,!textred*CSXsetlabelwidth~,
+%                                     !textgreen*CSXcaptionLabelandText~,rectangle split,
+%                                     rectangle split horizontal,
+%                                     rectangle split parts=2,
+%                                     rectangle split part align=base,
+%                                     every two node part/.style={
+%                                        !textblue*CSXtextfont~,
+%                                        !textred*CSXsettextwidth~
+%                                     }]
+%                                    (Scheme1Image2UpperCaption1Entry1)
+%                                    {1\nodepart{two}};
+%                              }
+%                        };
+%                  }
+%            }
+%        node(Scheme1Image2Lower)
+%            [!textblue*CSXarrowfont~,!textgreen*CSXarrowlower~,auto,swap]
+%            {DEE}
+%        ([CSXshiftB]Scheme1Image2.east);
+%\end{tikzpicture}
+% \end{Verbatim}
+%
+% \subsection{Style adjustment -- some examples}
+%
+% \noindent As already mentioned above, please use the styles \textblue{|CSXlabelfont|} and \textblue{|CSXtextfont|} for any changes of the node font. This is necessary to ensure correct measurements. For local font adjustment of captions in structure commands use the optional argument \textorange{|<TikZ-capt>|}. 
+%
+% \begin{minipage}{0.15\linewidth}
+% \struct[text]{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.75\linewidth}
+% \begin{Verbatim}[gobble=1,fontsize=\small]
+%\struct[text]{maleimid}
+% \end{Verbatim}
+% \end{minipage}
+%
+% \begin{minipage}{0.15\linewidth}
+% \struct[text][][][CSXlabelfont/.style={red,font={\large}}]{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.75\linewidth}
+% \begin{Verbatim}[gobble=1,fontsize=\small]
+%\struct[text]
+%       []
+%       []
+%       [CSXlabelfont/.style={red,font={\large}}]
+%       {maleimid}
+% \end{Verbatim}
+% \end{minipage}
+%
+% \begin{minipage}{0.15\linewidth}
+% \struct[text][][][nodes={draw=green},CSXtextfont/.style={blue,font={\large}}]{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.75\linewidth}
+% \begin{Verbatim}[gobble=1,fontsize=\small]
+%\struct[text]
+%       []
+%       []
+%       [nodes={draw=green},
+%        CSXtextfont/.style={blue,font={\large}}]
+%       {maleimid}
+% \end{Verbatim}
+% \end{minipage}
+%
+% \begin{minipage}{0.15\linewidth}
+% \struct[][][scale=1.5][][draw=red]{maleimid}
+% \end{minipage}
+% \begin{minipage}{0.75\linewidth}
+% \begin{Verbatim}[gobble=1,fontsize=\small]
+%\struct[][][scale=1.5][][draw=red]{maleimid}
+% \end{Verbatim}
+% \end{minipage}
+%
+%
+% \subsection{Chemical mechanisms}
+% \noindent For more complex chemical mechanisms you can either use the matrix provided by the |Chemscheme| environment or the internal commands |\CSXimage| and |\fancylabel|:
+%
+% {
+%\tikzset{
+%   CSXmatrix/.append style={
+%      column sep=30pt,
+%   }
+%}
+% \begin{Chemscheme}
+%    \struct{R2-CH=CH-R1}
+%    \struct{Ru=CH2}
+%    \struct{R1-CH=CH2}\ChemschemeNextRow[20pt]
+%    \struct{CH2=CH-R2}
+%    \struct{Ru=CH-R1}
+%    \struct{C2H4}
+%    \CSXcommands{
+%       \draw[->,draw=blue] (Scheme\theCSXscheme Image4)
+%            to [bend right=90,distance=22pt] (Scheme\theCSXscheme Image1);
+%       \draw[->,draw=red] (Scheme\theCSXscheme Image5)
+%            to [bend right=-90,distance=22pt] (Scheme\theCSXscheme Image2);
+%       \draw[->,draw=orange] (Scheme\theCSXscheme Image2)
+%            to [bend right=-90,distance=22pt] (Scheme\theCSXscheme Image5);
+%       \draw[->,draw=green!75!black] (Scheme\theCSXscheme Image3)
+%            to [bend right=90,distance=22pt] (Scheme\theCSXscheme Image6);
+%    }
+% \end{Chemscheme}
+% }
+%
+% \begin{Verbatim}[gobble=1,fontsize=\small,commandchars=?*~]
+%\tikzset{CSXmatrix/.append style={column sep=30pt}}
+%\begin{Chemscheme}
+%   \struct{R2-CH=CH-R1}
+%   \struct{Ru=CH2}
+%   \struct{R1-CH=CH2}\ChemschemeNextRow[20pt]
+%   \struct{CH2=CH-R2}
+%   \struct{Ru=CH-R1}
+%   \struct{C2H4}
+%   \CSXcommands{
+%      \draw[->,?textblue*draw=blue~] (Scheme\theCSXscheme Image4)
+%           to [bend right=90,distance=22pt] (Scheme\theCSXscheme Image1);
+%      \draw[->,?textred*draw=red~] (Scheme\theCSXscheme Image5)
+%           to [bend right=-90,distance=22pt] (Scheme\theCSXscheme Image2);
+%      \draw[->,?textorange*draw=orange~] (Scheme\theCSXscheme Image2)
+%           to [bend right=-90,distance=22pt] (Scheme\theCSXscheme Image5);
+%      \draw[->,?textgreen*draw=green!75!black~] (Scheme\theCSXscheme Image3)
+%           to [bend right=90,distance=22pt] (Scheme\theCSXscheme Image6);
+%   }
+%\end{Chemscheme}
+% \end{Verbatim}
+% 
+% \tikz[node distance=1pt,mycaption/.style={CSXlabelfont}]{
+%    \node (n) at (0,2){\CSXimage{Ru=CH2}};
+%    \node (ncapt) [mycaption,below=of n] {\fancylabel[CSX]{Ru=CH2}};
+%    \node (s) at (0,-2){\CSXimage{Ru=CH-R1}};
+%    \node (scapt) [mycaption,below=of s] {\fancylabel[CSX]{Ru=CH-R1}};
+%    \node (nw) at (-4,1){\CSXimage{R2-CH=CH-R1}};
+%    \node (nwcapt) [mycaption,below=of nw] {\fancylabel[CSX]{R2-CH=CH-R1}};
+%    \node (sw) at (-4,-1){\CSXimage{CH2=CH-R2}};
+%    \node (swcapt) [mycaption,below=of sw] {\fancylabel[CSX]{CH2=CH-R2}};
+%    \node (ne) at (4,1){\CSXimage{R1-CH=CH2}};
+%    \node (necapt) [mycaption,below=of ne] {\fancylabel[CSX]{R1-CH=CH2}};
+%    \node (se) at (4,-1){\CSXimage{C2H4}};
+%    \node (ecapt) [mycaption,below=of se] {\fancylabel[CSX]{C2H4}};
+%    \node (w) at (-2.5,0) {};
+%    \node (e) at (2.5,0) {};
+%    \draw [->] (s) to [out=180,in=270] (w) to [out=90,in=180] (n);
+%    \draw [->] (n) to [out=0,in=90] (e) to [out=270,in=0] (s);
+%    \draw [->] (sw) to [out=0,in=270] (w) to [out=90,in=0] (nw);
+%    \draw [->] (ne) to [out=180,in=90] (e) to [out=270,in=180] (se);
+% }
+%
+% \begin{Verbatim}[gobble=1,fontsize=\small,commandchars=?*~]
+% \tikz[node distance=1pt,mycaption/.style={CSXlabelfont}]{
+%    \node (n) at (0,2){\CSXimage{Ru=CH2}};
+%    \node (ncapt) [mycaption,below=of n] {\fancylabel[CSX]{Ru=CH2}};
+%    \node (s) at (0,-2){\CSXimage{Ru=CH-R1}};
+%    \node (scapt) [mycaption,below=of s] {\fancylabel[CSX]{Ru=CH-R1}};
+%    \node (nw) at (-4,1){\CSXimage{R2-CH=CH-R1}};
+%    \node (nwcapt) [mycaption,below=of nw] {\fancylabel[CSX]{R2-CH=CH-R1}};
+%    \node (sw) at (-4,-1){\CSXimage{CH2=CH-R2}};
+%    \node (swcapt) [mycaption,below=of sw] {\fancylabel[CSX]{CH2=CH-R2}};
+%    \node (ne) at (4,1){\CSXimage{R1-CH=CH2}};
+%    \node (necapt) [mycaption,below=of ne] {\fancylabel[CSX]{R1-CH=CH2}};
+%    \node (se) at (4,-1){\CSXimage{C2H4}};
+%    \node (ecapt) [mycaption,below=of se] {\fancylabel[CSX]{C2H4}};
+%    \node (w) at (-2.5,0) {};
+%    \node (e) at (2.5,0) {};
+%    \draw [->] (s) to [out=180,in=270] (w) to [out=90,in=180] (n);
+%    \draw [->] (n) to [out=0,in=90] (e) to [out=270,in=0] (s);
+%    \draw [->] (sw) to [out=0,in=270] (w) to [out=90,in=0] (nw);
+%    \draw [->] (ne) to [out=180,in=90] (e) to [out=270,in=180] (se);
+% }
+% \end{Verbatim}
+%
+% \section{Change history}
+% 	\begin{itemize}
+%		\item[2014/07/15] Initial version
+%		\item[2017/04/03] Bug within the \textbackslash Struct command fixed
+%       \item[2018/01/20] Dependencies changed (\textsf{xifthen} instead of \textsf{ifthen}, \textsf{etoolbox} instead of \textsf{etextools}). Loading \textsf{etextools} caused compatibility issues with some other packages.
+%	\end{itemize}
+%
+% \StopEventually{}
+%
+% \section{The implementation}
+% \subsection{Identification}
+%    \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{chemschemex}[2018/01/20 v1.2 Typeset chemical schemes]
+%    \end{macrocode}
+%
+% \subsection{Loading packages and define counter formats}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+%
+% \subsection{The options}
+% \begin{macro}{image=}
+%    \begin{macrocode}
+\define@key{chemschemex}{image}{%
+    % #1=additional options
+    % #2=filename of the image
+    \newcommand{\CSXimage}[2][]{%
+        \includegraphics[#1,##1]{##2}%
+    }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{labelseparator=}
+%    \begin{macrocode}
+\define@key{chemschemex}{labelseparator}{%
+    \def\CSXlabelsep{#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{arrowadvance=}
+%    \begin{macrocode}
+\define@key{chemschemex}{arrowadvance}{%
+    \def\CSXarrowadvance{#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+%    \begin{macrocode}
+\presetkeys{chemschemex}{%
+    image={scale=0.7},%
+    labelseparator={:\,},%
+    arrowadvance={10pt},%
+}{}
+\ProcessOptionsX<chemschemex>
+%    \end{macrocode}
+% \subsection{TikZ styles}
+%    \begin{macrocode}
+% TikZ styles that must not be changed
+\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={},%
+}
+% TikZ styles that can be changed
+\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);%
+         }%
+      }%
+   }%
+}
+%    \end{macrocode}
+% \subsection{Booleans, Lengths and Counters}
+%    \begin{macrocode}
+% Booleans
+\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
+% Lengths
+\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}
+% Counters
+\newcounter{CSXscheme}\setcounter{CSXscheme}{1}
+\newcounter{CSXstruct}\setcounter{CSXstruct}{0}
+\newcounter{CSXstructinarrow}\setcounter{CSXstructinarrow}{0}
+\newcounter{CSXcaption}\setcounter{CSXcaption}{0}
+%    \end{macrocode}
+% \subsection{User macros}
+% \begin{macro}{\newstruct}
+%    \begin{macrocode}
+\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
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structname}
+%    \begin{macrocode}
+\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}%
+      }%
+   }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Structname}
+%    \begin{macrocode}
+\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}%
+      }%
+   }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structabbr}
+%    \begin{macrocode}
+\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}%
+      }%
+   }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\customstruct}
+%    \begin{macrocode}
+\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}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\struct}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structalt}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\struct*}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structalt*}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\struct-}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Struct}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Structalt}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Struct*}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Structalt*}
+%    \begin{macrocode}
+\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}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structplus}
+%    \begin{macrocode}
+\newcommand{\structplus}{%
+   \customstruct{}{\tikz[CSXsimple]{\draw[-](1,0)to(-1,0);\draw[-](0,1)to(0,-1);}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structminus}
+%    \begin{macrocode}
+\newcommand{\structminus}{%
+   \customstruct{}{\tikz[CSXsimple]{\draw[-](1,0)to(-1,0);}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ChemschemeNextRow}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{environment}{Chemscheme}
+%    \begin{macrocode}
+\newenvironment{Chemscheme}{%
+   \CSX@schemetrue%
+   \ignorespaces%
+}{%
+   \CSX@print%
+   \CSX@schemefalse%
+}
+%    \end{macrocode}
+% \end{environment}
+% \begin{macro}{\structref}
+%    \begin{macrocode}
+\DeclareRobustCommand\structref[2][CSX]{%
+    % #1=family
+    % #2=label
+    \CSXstructref{\fancyref[#1]{#2}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structref*}
+%    \begin{macrocode}
+\WithSuffix\DeclareRobustCommand\structref*[2][CSX]{%
+    % #1=family
+    % #2=label
+    \CSXstructref{\fancyref*[#1]{#2}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structsubref}
+%    \begin{macrocode}
+\DeclareRobustCommand\structsubref[3][CSX]{%
+    % #1=family
+    % #2=label
+    % #3=sublabel
+    \CSXstructref{\fancysubref[#1]{#2}{#3}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structsubref-}
+%    \begin{macrocode}
+\WithSuffix\DeclareRobustCommand\structsubref-[3][CSX]{%
+    % #1=family
+    % #2=label
+    % #3=sublabel
+    \CSXstructref{\fancysubref-[#1]{#2}{#3}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\structsubref*}
+%    \begin{macrocode}
+\WithSuffix\DeclareRobustCommand\structsubref*[3][CSX]{%
+    % #1=family
+    % #2=label
+    % #3=sublabel
+    \CSXstructref{\fancysubref*[#1]{#2}{#3}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSXstructref}
+%    \begin{macrocode}
+\newcommand{\CSXstructref}[1]{%
+    % #1=fancyref command
+    \textbf{#1}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSXcommands}
+%    \begin{macrocode}
+\newcommand{\CSXcommands}[1]{%
+   \gappto\CSX@commands{#1}%
+   \ignorespaces%
+}
+\def\CSX@commands{}%
+%    \end{macrocode}
+% \end{macro}
+% \subsection{Helper macros}
+% \begin{macro}{\CSX@newsubstruct}
+%    \begin{macrocode}
+\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}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@customarrow@widestcaption}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@savebox@set}
+%    \begin{macrocode}
+\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}%
+}% 
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{CSX@savebox@show}
+%    \begin{macrocode}
+\def\CSX@savebox@show#1#2{%
+   % #1=boxname
+   % #2=box content
+   \usebox{\@nameuse{#1}}%
+}%
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\customarrow}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSXdeclarearrow}
+%    \begin{macrocode}
+\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}%
+   }
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSXdeclarearrowbundle}
+%    \begin{macrocode}
+\newcommand{\CSXdeclarearrowbundle}[2]{%
+   % #1=macro name
+   % #2=TikZ style
+   % normal
+   \CSX@declarearrowbundle{#1}{#2}%
+   % dashed
+   \CSX@declarearrowbundle{#1Dashed}{#2,dashed}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@declarearrowbundle}
+%    \begin{macrocode}
+\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%
+}
+% Normal arrows
+\CSXdeclarearrowbundle{RightArrow}{CSXallarrows,CSXRightArrow}
+\CSXdeclarearrowbundle{LeftArrow}{CSXallarrows,CSXLeftArrow}
+\CSXdeclarearrowbundle{LeftRightArrow}{CSXallarrows,CSXLeftRightArrow}
+% Double arrow
+\CSXdeclarearrowbundle{DoubleRightArrow}{CSXallarrows,CSXdoublearrows,CSXRightArrow}
+\CSXdeclarearrowbundle{DoubleLeftArrow}{CSXallarrows,CSXdoublearrows,CSXLeftArrow}
+\CSXdeclarearrowbundle{DoubleLeftRightArrow}{CSXallarrows,CSXdoublearrows,CSXLeftRightArrow}
+% Single harpoons
+\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}
+% Equilibrium
+\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}
+% Two Arrows
+\CSXdeclarearrowbundle{TwoRightArrow}{CSXallarrows,CSXslashtwoarrow,CSXRightArrow}
+\CSXdeclarearrowbundle{TTwoRightArrow}{CSXallarrows,CSXbackslashtwoarrow,CSXRightArrow}
+\CSXdeclarearrowbundle{TwoLeftArrow}{CSXallarrows,CSXslashtwoarrow,CSXLeftArrow}
+\CSXdeclarearrowbundle{TTwoLeftArrow}{CSXallarrows,CSXbackslashtwoarrow,CSXLeftArrow}
+% Three Arrows
+\CSXdeclarearrowbundle{ThreeRightArrow}{CSXallarrows,CSXslashthreearrow,CSXRightArrow}
+\CSXdeclarearrowbundle{TThreeRightArrow}{CSXallarrows,CSXbackslashthreearrow,CSXRightArrow}
+\CSXdeclarearrowbundle{ThreeLeftArrow}{CSXallarrows,CSXslashthreearrow,CSXLeftArrow}
+\CSXdeclarearrowbundle{TThreeLeftArrow}{CSXallarrows,CSXbackslashthreearrow,CSXLeftArrow}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@struct}
+%    \begin{macrocode}
+\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}}}%
+   }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@struct*}
+%    \begin{macrocode}
+\WithSuffix\newcommand\@struct*[3]{%
+   % #1=caption
+   % #2=family
+   % #3=filename
+   \def\@@struct{{{\fancylabel*[#2]{#3}},{#1}}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@Struct}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@Struct*}
+%    \begin{macrocode}
+\WithSuffix\newcommand\@Struct*[3]{%
+   % #1=family
+   % #2=list of sublabels previously defined with \newstruct
+   % #3=filename
+   \def\@@struct{{{\fancysublabel[#1]{#3}{#2}},{}}}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\customstruct@outarrow}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\customstruct@inarrow}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSXgeneratecaption}
+%    \begin{macrocode}
+\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%
+   }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@generate@@caption}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@generate@@@caption}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@setimagewidth}
+%    \begin{macrocode}
+\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}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@setmaxlabelwidth}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@settextwidth}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@setvphantom}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@generate@@@caption@LabelAndText}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@generate@@@caption@TextOnly}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@print}
+%    \begin{macrocode}
+\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{}%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@@print}
+%    \begin{macrocode}
+\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%
+      }%
+   }%
+}
+%    \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CSX@@@print}
+%    \begin{macrocode}
+\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%
+}
+%    \end{macrocode}
+% \end{macro}
+%
+%
+\endinput
+% \Finale
\ No newline at end of file
-- 
cgit v1.2.3

