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