summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/chemschemex/chemschemex.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/chemschemex/chemschemex.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/chemschemex/chemschemex.dtx')
-rw-r--r--macros/latex/contrib/chemschemex/chemschemex.dtx2315
1 files changed, 2315 insertions, 0 deletions
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