diff options
Diffstat (limited to 'obsolete/macros/latex/contrib/mychemistry/mychemistry.sty')
-rw-r--r-- | obsolete/macros/latex/contrib/mychemistry/mychemistry.sty | 1557 |
1 files changed, 1557 insertions, 0 deletions
diff --git a/obsolete/macros/latex/contrib/mychemistry/mychemistry.sty b/obsolete/macros/latex/contrib/mychemistry/mychemistry.sty new file mode 100644 index 0000000000..089ac37b85 --- /dev/null +++ b/obsolete/macros/latex/contrib/mychemistry/mychemistry.sty @@ -0,0 +1,1557 @@ +% -------------------------------------------------------------------------- +% the MYCHEMISTRY package +% +% create reaction schemes with LaTeX and chemfig +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% Web: https://www.bitbucket.org/cgnieder/mychemistry +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +% Copyright 2011--2012 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% +% This work consists of the files mychemistrysty, mychemistry_en.tex, +% README and the derived file mychemistry_en.pdf. +% -------------------------------------------------------------------------- +\ProvidesPackage{mychemistry}[2012/12/19 v1.99b create reaction schemes with LaTeX and chemfig] +\RequirePackage{etoolbox,float,xkeyval,chemfig,chemmacros} +\usetikzlibrary{ + arrows, + positioning, + decorations.pathmorphing, + shapes, + calc, + matrix, + chains, + scopes, + intersections} + +% -------------------------------------------------------------------------- +% Tools +\newif\ifmCh@strict +\newif\ifmCh@draft +\def\mCh@if@strict{% + \ifmCh@strict\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} + +\def\mCh@error#1#2{% + \mCh@if@strict + {\PackageError{mychemistry}{#1}{#2}} + {\PackageWarning{mychemistry}{#1}{#2}}} + +\def\mCh@strict@error#1#2{% + \begingroup + \mCh@stricttrue + \mCh@error{#1}{#2}% + \endgroup} + +\def\mCh@def#1{% + \ifdef{#1}{% + \mCh@strict@error{already defined}{mychemistry tries to define \string#1 but + it seems it is already defined. Please contact the author.}% + \@gobble + }{\def#1}} + +% "variablen" definieren +\mCh@def\mCh@strip@bs{\expandafter\@gobble\string} +\mCh@def\mCh@ifis@variable#1#2#3{% + \ifcsdef{mCh@variable@\mCh@strip@bs#1} + {#2} + {\mCh@error{variable \string#1 undefined}{}#3}} +\mCh@def\mCh@new@variable#1{% + \ifcsdef{mCh@variable@\mCh@strip@bs#1} + {\mCh@error{variable \string#1 already defined. I'm doing nothing!}{}} + {\csdef{mCh@variable@\mCh@strip@bs#1}{}\csdef{mCh@\mCh@strip@bs#1}{}}} +\mCh@def\mCh@set@variable#1#2{% + \mCh@ifis@variable{#1}{\csdef{mCh@\mCh@strip@bs#1}{#2}}{\@gobble}} +\mCh@def\mCh@xset@variable#1#2{% + \mCh@ifis@variable{#1}{\csedef{mCh@\mCh@strip@bs#1}{#2}}{\@gobble}} +\mCh@def\mCh@clear@variable#1{% + \mCh@ifis@variable{#1}{\csdef{mCh@\mCh@strip@bs#1}{}}{}} +\mCh@def\mCh@let@variable#1#2{% + \mCh@ifis@variable{#1}{\mCh@ifis@variable{#2} + {\csletcs{mCh@\mCh@strip@bs#1}{mCh@\mCh@strip@bs#2}}{}}{}} +\mCh@def\mCh@empty@variable#1{% + \mCh@ifis@variable{#1}{\cslet{mCh@\mCh@strip@bs#1}\@empty}{}} +\mCh@def\mCh@ifeq@variable#1#2#3#4{% + \mCh@ifis@variable{#1}{\mCh@ifis@variable{#2} + {\ifcsequal{mCh@\mCh@strip@bs#1}{mCh@\mCh@strip@bs#2}{#3}{#4}}{}}{}} +\mCh@def\mCh@ifempty@variable#1#2#3{% + \ifcsequal{mCh@\mCh@strip@bs#1}{@empty}{#2}{#3}} + +\mCh@new@variable\true +\mCh@new@variable\false + +\mCh@set@variable\true{true} +\mCh@set@variable\false{false} + +% Optional Argument Analysis +% is #2 part of #1? (inspired by \CF@if@instr by Christian Tellechea) +\mCh@def\mCh@if@instr#1#2{% + \def\mCh@if@instr@i##1#2##2\@nil{% + \ifstrempty{##2}{\@secondoftwo}{\@firstoftwo}}% + \mCh@if@instr@i#1\@@nil#2\@nil +} + +\mCh@new@variable\firstarg +\mCh@new@variable\secondarg +\mCh@new@variable\thirdarg + +% Am ersten , splitten, #1 in #3 speichern, #2 in \mCh@remainargs +% (das Makro ist eine Kopie von \CF@analyze@movearg in chemfig.tex von Christian Tellechea) +\mCh@def\mCh@splitfirst#1,#2\@nil#3{% + \def#3{#1}\def\mCh@remainargs{#2}% +} + +% ein durch , in 3 Teile getrenntes Argument splitten +% (das Makro ist eine Abwandlung von \CF@analyze@movearg in chemfig.tex von Christian Tellechea) +\mCh@def\mCh@splitarg#1{% + \mCh@if@instr{#1}{,} + {\expandafter\mCh@splitfirst#1\@nil\mCh@firstarg} + {\mCh@set@variable\firstarg{#1}}% + \expandafter\mCh@if@instr\expandafter{\mCh@remainargs}{,} + {\expandafter\mCh@splitfirst\mCh@remainargs\@nil\mCh@secondarg}{\expandafter\mCh@set@variable\expandafter\secondarg\expandafter{\mCh@remainargs}}% + \ifx\mCh@remainargs\mCh@secondarg + \mCh@empty@variable\thirdarg + \else + \expandafter\mCh@set@variable\expandafter\thirdarg\expandafter{\mCh@remainargs}% + \fi +} + +% -------------------------------------------------------------------------- +% options +\define@key[MC]{mychemistry.sty}{strict}{\mCh@stricttrue} +\DeclareOptionX[MC]{strict}{\mCh@stricttrue} + +\define@key[MC]{mychemistry.sty}{draft}{\mCh@stricttrue\mCh@drafttrue} +\DeclareOptionX[MC]{draft}{\mCh@stricttrue\mCh@drafttrue} + +\define@key[MC]{mychemistry.sty}{final}{\mCh@strictfalse\mCh@draftfalse} +\DeclareOptionX[MC]{final}{\mCh@strictfalse\mCh@draftfalse} + +\mCh@new@variable\rs@placement +\mCh@new@variable\rs@currentplacement + +\mCh@set@variable\rs@placement{hpt} +\mCh@let@variable\rs@currentplacement\rs@placement + +\define@key[MC]{mychemistry.sty}{placement}{% + \mCh@set@variable\rs@placement{#1}} + +\ProcessOptionsX[MC] + +% -------------------------------------------------------------------------- +% language settings +\mCh@new@variable\rs@name +\mCh@set@variable\rs@name{Reaction scheme} + +\RequirePackage{translations} +\NewTranslation{English} {reaction-scheme-(caption-title)} {Reaction scheme} +\NewTranslation{French} {reaction-scheme-(caption-title)} {Sch\'{e}ma r\'{e}actionnel} +\NewTranslation{German} {reaction-scheme-(caption-title)} {Reaktionsschema} +\NewTranslation{Italian} {reaction-scheme-(caption-title)} {Reazione Scheme} +\NewTranslation{Spanish} {reaction-scheme-(caption-title)} {Esquema de Reacci\'{o}n} +\mCh@set@variable\rs@name{\GetTranslation{reaction-scheme-(caption-title)}} + + +% -------------------------------------------------------------------------- +% Direction Analysis +% Richtungen: +\mCh@new@variable\r +\mCh@new@variable\ar +\mCh@new@variable\a +\mCh@new@variable\al +\mCh@new@variable\l +\mCh@new@variable\br +\mCh@new@variable\b +\mCh@new@variable\bl + +\mCh@set@variable\r{right} +\mCh@set@variable\ar{above right} +\mCh@set@variable\a{above} +\mCh@set@variable\al{above left} +\mCh@set@variable\l{left} +\mCh@set@variable\br{below right} +\mCh@set@variable\b{below} +\mCh@set@variable\bl{below left} + +\mCh@new@variable\vert@i +\mCh@new@variable\vert@ii +\mCh@new@variable\vert@iii + +\mCh@set@variable\vert@i{90} +\mCh@set@variable\vert@ii{-90} +\mCh@set@variable\vert@iii{270} + +% Richtung in Bezug auf node oder nicht? +\mCh@new@variable\direction + +\mCh@def\mCh@split@angle#1.#2\@nil#3{% + \def#3{#1}\mCh@set@variable\direction{#2}} +\mCh@def\mCh@wowo@node#1{% + \mCh@if@instr{#1}{.} + {\expandafter\mCh@split@angle#1\@nil\mCh@referred@node} + {\mCh@set@variable\direction{#1}}} + +% Winkel bestimmen: +\mCh@new@variable\angle +\mCh@new@variable\referred@node + +\mCh@def\mCh@analyze@angle#1{% + \mCh@empty@variable\angle + \mCh@empty@variable\referred@node + \mCh@wowo@node{#1}% + \mCh@ifeq@variable\direction\r {\mCh@set@variable\angle{0}}{}% + \mCh@ifeq@variable\direction\ar {\mCh@set@variable\angle{45}}{}% + \mCh@ifeq@variable\direction\a {\mCh@set@variable\angle{90}}{}% + \mCh@ifeq@variable\direction\al {\mCh@set@variable\angle{135}}{}% + \mCh@ifeq@variable\direction\l {\mCh@set@variable\angle{180}}{}% + \mCh@ifeq@variable\direction\bl {\mCh@set@variable\angle{225}}{}% + \mCh@ifeq@variable\direction\b {\mCh@set@variable\angle{270}}{}% + \mCh@ifeq@variable\direction\br {\mCh@set@variable\angle{315}}{}% + \mCh@ifempty@variable\angle{% + \pgfmathparse{\mCh@direction <0 ? int(\mCh@direction+360) : int(\mCh@direction) }% + \mCh@xset@variable\angle{\pgfmathresult}% + }{}% +} +% -------------------------------------------------------------------------- +% PFEILE +% \arrow[<pos>,<type>,<length factor>,<name>,both,<tikz>]{<above>}{<below>} +% Pfeiltypen: +\mCh@new@variable\arrow@type@def +\mCh@new@variable\arrow@type@eqv +\mCh@new@variable\arrow@type@back +\mCh@new@variable\arrow@type@eq +\mCh@new@variable\arrow@type@eqq +\mCh@new@variable\arrow@type@eeq +\mCh@new@variable\arrow@type@not +\mCh@new@variable\arrow@type@pm + +\mCh@set@variable\arrow@type@def{->} +\mCh@set@variable\arrow@type@eqv{<->} +\mCh@set@variable\arrow@type@back{<-} +\mCh@set@variable\arrow@type@eq{<=>} +\mCh@set@variable\arrow@type@eqq{<=>>} +\mCh@set@variable\arrow@type@eeq{<<=>} +\mCh@set@variable\arrow@type@not{-|>} +\mCh@set@variable\arrow@type@pm{-+>} + +% Voreinstellungen +% Pfeillänge +\mCh@new@variable\arrow@length@def +\mCh@new@variable\arrow@length +\mCh@new@variable\arrow@factor + +\mCh@set@variable\arrow@length@def{4em} +\let\mCh@arrow@length\mCh@arrow@length@def +\mCh@set@variable\arrow@factor{1} + +\newrobustcmd\setarrowlength[1]{% + \ifblank{#1} + {\mCh@let@variable\arrow@length\arrow@length@def} + {\mCh@set@variable\arrow@length{#1}}} + +% Label-Abstand +\mCh@new@variable\arrow@label@dist@def +\mCh@new@variable\arrow@label@dist + +\mCh@set@variable\arrow@label@dist@def{.2em} +\mCh@let@variable\arrow@label@dist\arrow@label@dist@def + +\newrobustcmd\setarrowlabel[1]{% + \ifblank{#1} + {\mCh@let@variable\arrow@label@dist\arrow@label@dist@def} + {\mCh@set@variable\arrow@label@dist{#1}}} + +% Pfeildicke +\mCh@new@variable\arrow@linethickness@default +\mCh@new@variable\arrow@linethickness + +\mCh@set@variable\arrow@linethickness@default{semithick} +\mCh@let@variable\arrow@linethickness\arrow@linethickness@default + +\newrobustcmd\setarrowline[1]{% + \ifblank{#1} + {\mCh@let@variable\arrow@linethickness\arrow@linethickness@default} + {\mCh@set@variable\arrow@linethickness{#1}}} + +% Winkel untersuchen, um Label richtig anzubringen +\mCh@new@variable\beta +\mCh@new@variable\arrow@label@anchor@up +\mCh@new@variable\arrow@label@anchor@down +\mCh@new@variable\arrow@label@anchor@add +\mCh@new@variable\arrow@label@anchor@sub +\newcount\mCh@alpha + +\mCh@def\mCh@evaluate@angle#1{ + \mCh@alpha=#1 + \pgfmathparse{cos(\mCh@alpha) > 0} + \ifnum\pgfmathresult=1 + \mCh@set@variable\beta{#1}% + \mCh@set@variable\arrow@label@anchor@up{south}% + \mCh@set@variable\arrow@label@anchor@down{north}% + \ifnum\mCh@alpha<180 + \mCh@set@variable\arrow@label@anchor@add{east}% + \mCh@set@variable\arrow@label@anchor@sub{south}% + \else + \mCh@set@variable\arrow@label@anchor@add{south}% + \mCh@set@variable\arrow@label@anchor@sub{west}% + \fi + \else + \pgfmathparse{cos(\mCh@alpha) == 0}% + \ifnum\pgfmathresult=1 + \mCh@set@variable\beta{0}% + \ifnum\mCh@alpha=90 + \mCh@set@variable\arrow@label@anchor@up{east}% + \mCh@set@variable\arrow@label@anchor@down{west}% + \mCh@set@variable\arrow@label@anchor@add{east}% + \mCh@set@variable\arrow@label@anchor@sub{east}% + \else + \mCh@set@variable\arrow@label@anchor@up{west}% + \mCh@set@variable\arrow@label@anchor@down{east}% + \mCh@set@variable\arrow@label@anchor@add{west}% + \mCh@set@variable\arrow@label@anchor@sub{west}% + \fi + \else + \mCh@set@variable\arrow@label@anchor@up{north}% + \mCh@set@variable\arrow@label@anchor@down{south}% + \ifnum\mCh@alpha=180 + \mCh@set@variable\beta{180-#1}% + \mCh@set@variable\arrow@label@anchor@add{north}% + \mCh@set@variable\arrow@label@anchor@sub{north}% + \fi + \ifnum\mCh@alpha>180 + \mCh@set@variable\beta{180+#1}% + \mCh@set@variable\arrow@label@anchor@add{west}% + \mCh@set@variable\arrow@label@anchor@sub{north}% + \fi + \ifnum\mCh@alpha<180 + \mCh@set@variable\beta{180+#1}% + \mCh@set@variable\arrow@label@anchor@add{north}% + \mCh@set@variable\arrow@label@anchor@sub{east}% + \fi + \fi + \fi +} + +% Maße der Nodes der Pfeilargumente bestimmen, größere später an Pfeil weitergeben +\mCh@new@variable\arrow@both +\mCh@set@variable\arrow@both{both} + +\newlength{\mCh@height@A} +\newlength{\mCh@height@B} +\newlength{\mCh@arrow@label@height} +\newlength{\mCh@width@A} +\newlength{\mCh@width@B} +\newlength{\mCh@arrow@label@width} + +\mCh@def\mCh@savenode{% + \global\let\mCh@minx=\pgfpositionnodelaterminx + \global\let\mCh@maxx=\pgfpositionnodelatermaxx + \global\let\mCh@miny=\pgfpositionnodelaterminy + \global\let\mCh@maxy=\pgfpositionnodelatermaxy +} + +% der nächste Befehl benötigt pgf v2.10! +\mCh@def\mCh@largernode#1#2{% + \ifdef\pgfpositionnodelater{% + \pgfpositionnodelater{\mCh@savenode}% + \node{#1}; + \deflength{\mCh@width@A}{\mCh@maxx-\mCh@minx}% + \deflength{\mCh@height@A}{\mCh@maxy-\mCh@miny}% + \node{#2}; + \deflength{\mCh@width@B}{\mCh@maxx-\mCh@minx}% + \deflength{\mCh@height@B}{\mCh@maxy-\mCh@miny}% + \pgfmathsetlength{\mCh@arrow@label@width}{max(\mCh@width@A,\mCh@width@B)}% + \pgfmathsetlength{\mCh@arrow@label@height}{max(\mCh@height@A,\mCh@height@B)}% + \global\mCh@arrow@label@width=\mCh@arrow@label@width + \global\mCh@arrow@label@height=\mCh@arrow@label@height + }{% + \mCh@error{% + The command \string\pgfpositionnodelater\space is undefined. Make sure, + you have installed the latest version of pgf}{}% + }% +} + +% Pfeil zeichnen: +\newrobustcmd\mCh@arrow[3][]{% + \ifstrempty{#1} + {\mCh@arrow@i}{\mCh@arrow@ii[#1]} + {#2}{#3}} + +\mCh@def\mCh@arrow@i#1#2{% + \node[on chain=going {at=(\tikzchainprevious.0)}, + minimum size=0, + inner sep=3pt, + outer sep=0, + anchor=180, + shift=(0:.5*\mCh@rxn@node@distance)] (@mCh@arrow@start){}; + \node[on chain=going {at=(\tikzchainprevious.0), + shift=($(0:.5*\mCh@arrow@factor*\mCh@arrow@length)$)}, + minimum size=0, + inner sep=3pt, + outer sep=0] (@mCh@arrow@end){}; + \draw[-mCtip,\mCh@arrow@linethickness] + let \n1={0}, \n2={180} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center){} + ++($(0:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=0, + anchor=south, + inner sep=0] + at ($(mCh@arrow@center)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#1}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=0, + anchor=north, + inner sep=0] + at ($(mCh@arrow@center)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#2}; +} + +\mCh@new@variable\arrow@plusminus +\mCh@new@variable\anchor +\mCh@new@variable\arrow@tikz +\mCh@new@variable\arrow@type@valid +\mCh@new@variable\arrow@type +\mCh@new@variable\arrow@type@actual +\mCh@new@variable\arrow@name + +\mCh@def\mCh@arrow@ii[#1]#2#3{% + \mCh@empty@variable\arrow@plusminus + \mCh@empty@variable\arrow@type + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% + \mCh@ifempty@variable\firstarg{% erste Option: Richtung + \mCh@set@variable\angle{0}% + \mCh@set@variable\beta{0}% + \mCh@set@variable\arrow@label@anchor@up{south}% + \mCh@set@variable\arrow@label@anchor@down{north}% + \mCh@set@variable\arrow@label@anchor@add{south}% + \mCh@set@variable\arrow@label@anchor@sub{south}% + \mCh@set@variable\anchor{180}% + \mCh@empty@variable\referred@node + }{% + \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}% + \mCh@set@variable\anchor{180+\mCh@angle}% + \mCh@evaluate@angle{\mCh@angle}% + } + \mCh@ifempty@variable\referred@node{% + \mCh@set@variable\referred@node{\tikzchainprevious}% + }{}% + \mCh@ifempty@variable\secondarg{}{% zweite Option: Typ + \mCh@set@variable\arrow@type{true} + \mCh@let@variable\arrow@type@actual\secondarg + }% + \let\mCh@remainargs\@empty% + \expandafter\mCh@splitarg\expandafter{\mCh@thirdarg}% + \mCh@ifempty@variable\firstarg{% dritte Option: Längenfaktor + \mCh@set@variable\arrow@factor{1}% + }{% + \mCh@xset@variable\arrow@factor{\mCh@firstarg}% + }% + \mCh@ifempty@variable\secondarg{% vierte Option: Name + \mCh@set@variable\arrow@name{mCh@arrow@center}% + }{% + \mCh@xset@variable\arrow@name{\mCh@secondarg}% + }% + \let\mCh@remainargs\@empty% + \expandafter\mCh@splitarg\expandafter{\mCh@thirdarg}% + \mCh@ifeq@variable\arrow@both\firstarg% fünfte Option: both + {{\mCh@largernode{#2}{#3}}}% + {% + \deflength{\mCh@arrow@label@width}{0pt}% + \deflength{\mCh@arrow@label@height}{0pt}% + }% + \mCh@ifempty@variable\secondarg{% sechste Option: tikz + \mCh@empty@variable\arrow@tikz + }{% + \mCh@xset@variable\arrow@tikz{\mCh@secondarg,\mCh@thirdarg}% + }% + \node[on chain=going {at=(\mCh@referred@node.\mCh@angle)}, + minimum size=0, + inner sep=3pt, + outer sep=0, + anchor=\mCh@anchor, + shift=(\mCh@angle:.5*\mCh@rxn@node@distance)] (@mCh@arrow@start){}; + \node[on chain=going {at=(\tikzchainprevious.\mCh@angle), + shift=($(\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$)}, + minimum size=0, + inner sep=3pt, + outer sep=0] (@mCh@arrow@end){}; + \mCh@ifeq@variable\arrow@type\true{% + \mCh@let@variable\arrow@type@valid\false + \mCh@ifeq@variable\arrow@type@actual\arrow@type@eq{% <=> + \mCh@let@variable\arrow@type@valid\true + \expandafter\draw\expandafter[\mCh@arrow@tikz, + -mChtip, + \mCh@arrow@linethickness] + let \n1={20+\mCh@angle}, \n2={160+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@up){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\draw\expandafter[\mCh@arrow@tikz, + mChtip-, + \mCh@arrow@linethickness] + let \n1={-20+\mCh@angle}, \n2={200+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@down){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \draw[draw=none] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] + at ($(mCh@arrow@center@up)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2}; + \expandafter\node[\expandafter\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] + at ($(mCh@arrow@center@down)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3}; + }{}% + \mCh@ifeq@variable\arrow@type@actual\arrow@type@eqq{% <=>> + \mCh@let@variable\arrow@type@valid\true + \expandafter\draw\expandafter[\mCh@arrow@tikz, + -mChtip, + \mCh@arrow@linethickness] + let \n1={20+\mCh@angle}, \n2={160+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@up){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\draw\expandafter[\mCh@arrow@tikz, + mChtip-, + \mCh@arrow@linethickness] + let \n1={-20+\mCh@angle} + in ($(@mCh@arrow@start.\n1)+(\mCh@angle:.25*\mCh@arrow@factor*\mCh@arrow@length)$) + --node[pos=.5,inner sep=0](mCh@arrow@center@down){} + ++($(\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$); + \draw[draw=none] let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] + at ($(mCh@arrow@center@up)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] + at ($(mCh@arrow@center@down)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3}; + }{}% + \mCh@ifeq@variable\arrow@type@actual\arrow@type@eeq{% <<=> + \mCh@let@variable\arrow@type@valid\true + \expandafter\draw\expandafter[\mCh@arrow@tikz, + -mChtip, + \mCh@arrow@linethickness] + let \n1={20+\mCh@angle}, \n2={160+\mCh@angle} + in ($(@mCh@arrow@start.\n1)+(\mCh@angle:.25*\mCh@arrow@factor*\mCh@arrow@length)$) + --node[pos=.5,inner sep=0](mCh@arrow@center@up){} + ++($(\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\draw\expandafter[\mCh@arrow@tikz, + mChtip-, + \mCh@arrow@linethickness] + let \n1={-20+\mCh@angle}, \n2={200+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](mCh@arrow@center@down){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \draw[draw=none] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] + at ($(mCh@arrow@center@up)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] + at ($(mCh@arrow@center@down)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3}; + }{}% + \mCh@ifeq@variable\arrow@type@actual\arrow@type@def{% -> + \mCh@let@variable\arrow@type@valid\true + \expandafter\draw\expandafter[\mCh@arrow@tikz, + -mCtip, + \mCh@arrow@linethickness, + \mCh@arrow@tikz] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height] + at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height] + at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3}; + }{}% + \mCh@ifeq@variable\arrow@type@actual\arrow@type@eqv{% <-> + \mCh@let@variable\arrow@type@valid\true + \expandafter\draw\expandafter[\mCh@arrow@tikz, + mCtip-mCtip, + \mCh@arrow@linethickness] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height,inner sep=0] + at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height,inner sep=0] + at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3}; + }{}% + \mCh@ifeq@variable\arrow@type@actual\arrow@type@back{% <- + \mCh@let@variable\arrow@type@valid\true + \expandafter\draw\expandafter[\mCh@arrow@tikz, + mCtip-, + \mCh@arrow@linethickness] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] + at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3}; + }{}% + \mCh@ifeq@variable\arrow@type@actual\arrow@type@not{% -|> + \mCh@let@variable\arrow@type@valid\true + \expandafter\draw\expandafter[\mCh@arrow@tikz, + -mCtip, + \mCh@arrow@linethickness] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height, + inner sep=0] at ($(\mCh@arrow@name)!.8em!90:(@mCh@arrow@end)$){#2}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height,inner sep=0] + at ($(\mCh@arrow@name)!.8em!-90:(@mCh@arrow@end)$){#3}; + \draw ($(mCh@arrow@center)!.6em!-110:(@mCh@arrow@end)+(\mCh@angle:.1em)$) + --($(mCh@arrow@center)!.6em!70:(@mCh@arrow@end)+(\mCh@angle:.1em)$); + \draw ($(mCh@arrow@center)!.6em!-110:(@mCh@arrow@end)+(180+\mCh@angle:.1em)$) + --($(mCh@arrow@center)!.6em!70:(@mCh@arrow@end)+(180+\mCh@angle:.1em)$); + }{}% + \mCh@ifeq@variable\arrow@type@actual\arrow@type@pm{% -+> + \mCh@let@variable\arrow@type@valid\true + \mCh@let@variable\arrow@plusminus\true + \draw[-mCtip,\mCh@arrow@linethickness] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + }{}% + \mCh@ifeq@variable\arrow@type@valid\false + {\mCh@error{Unknown arrow type `\mCh@arrow@type@actual'}{}}{}% + }{% default: -> + \expandafter\draw\expandafter[\mCh@arrow@tikz, + -mCtip, + \mCh@arrow@linethickness] + let \n1={\mCh@angle}, \n2={180+\mCh@angle} + in (@mCh@arrow@start.\n1) --node[pos=.5,inner sep=0](\mCh@arrow@name){} + ++($(\mCh@angle:\mCh@arrow@factor*\mCh@arrow@length)$); + \expandafter\node\expandafter[\mCh@arrow@uplabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@up, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height,inner sep=0] + at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!90:(@mCh@arrow@end)$){#2}; + \expandafter\node\expandafter[\mCh@arrow@downlabel@visible, + rotate=\mCh@beta, + anchor=\mCh@arrow@label@anchor@down, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height,inner sep=0] + at ($(\mCh@arrow@name)!\mCh@arrow@label@dist!-90:(@mCh@arrow@end)$){#3}; + }% + \mCh@ifempty@variable\arrow@plusminus{}{% + \ifstrempty{#2}{}{% + \draw (\mCh@arrow@name.base) edge[bend left] + ++(${0.6667}*(146.3+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$); + \node[anchor=\mCh@arrow@label@anchor@add, + inner sep=\mCh@arrow@label@dist, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height] + at ($(\mCh@arrow@name.base)+{0.6667}*(146.3+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$) {#2}; + }% + \ifstrempty{#3}{}{% + \draw (\mCh@arrow@name.base) edge[bend right,-mCtip] + ++(${0.6667}*(33.7+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$); + \node[anchor=\mCh@arrow@label@anchor@sub, + inner sep=\mCh@arrow@label@dist, + minimum width=\mCh@arrow@label@width, + minimum height=\mCh@arrow@label@height] + at ($(\mCh@arrow@name.base)+{0.6667}*(33.7+\mCh@angle:.5*\mCh@arrow@factor*\mCh@arrow@length)$) {#3}; + }% + }% + \mCh@set@variable\arrow@factor{1}% +} + +% eigene Pfeilspitze ------------------------------------------------------------------ % +\pgfarrowsdeclare{mCtip}{mCtip} + {% + \arrowsize=0.2pt + \advance\arrowsize by .5\pgflinewidth + \pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth}% + \pgfarrowsrightextend{.5\pgflinewidth}% + } + {% + \pgfsetdash{}{0pt}% do not dash + \pgfsetroundjoin% fix join + \pgfsetroundcap% fix cap + \pgfpathmoveto{\pgfpointorigin}% + \pgfpathlineto{\pgfpoint{-3pt}{1pt}}% + \pgfpathlineto{\pgfpoint{-1.5pt}{0pt}}% + \pgfpathlineto{\pgfpoint{-3pt}{-1pt}}% + \pgfpathlineto{\pgfpoint{0pt}{0pt}}% + \pgfusepathqfillstroke + } + +\pgfarrowsdeclare{mChtip}{mChtip} + {% + \arrowsize=0.2pt + \advance\arrowsize by .5\pgflinewidth + \pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth}% + \pgfarrowsrightextend{.5\pgflinewidth}% + } + {% + \pgfsetdash{}{0pt}% do not dash + \pgfsetroundjoin% fix join + \pgfsetroundcap% fix cap + \pgfpathmoveto{\pgfpoint{0pt}{0pt}}% + \pgfpathlineto{\pgfpoint{-3pt}{1pt}}% + \pgfpathlineto{\pgfpoint{-1.5pt}{0pt}}% + \pgfpathlineto{\pgfpoint{0pt}{0pt}}% + \pgfusepathqfillstroke + } + +% -------------------------------------------------------------------------- +% MERGE +% \merge[<label>,<pos>,<length>]{<target>}{<start a>}{<start b>} +\mCh@new@variable\merge@length +\mCh@new@variable\merge@length@default +\mCh@new@variable\merge@length@value +\mCh@new@variable\merge@arg +\mCh@new@variable\merge@to +\mCh@new@variable\merge@from@one +\mCh@new@variable\merge@from@two + +\mCh@set@variable\merge@length@default{3em} +\mCh@let@variable\merge@length@value\merge@length@default + +% Basisbefehle +\mCh@def\mCh@merge@right{% + \draw[mCtip-,\mCh@arrow@linethickness] + ($(\mCh@merge@to.west)+(-\mCh@rxn@node@distance,0)$) + --node[midway,above,yshift=.1em]{\mCh@merge@arg} + ++(-\mCh@merge@length,0) node(crossing) {}; + \draw[\mCh@arrow@linethickness] + ($(\mCh@merge@from@one.east)+(\mCh@rxn@node@distance,0)$) -| (crossing.base); + \draw[\mCh@arrow@linethickness] + ($(\mCh@merge@from@two.east)+(\mCh@rxn@node@distance,0)$) -| (crossing.base); +} + +\mCh@def\mCh@merge@above{% + \draw[mCtip-,\mCh@arrow@linethickness] + ($(\mCh@merge@to.south)+(0,-\mCh@rxn@node@distance)$) + --node[midway,right,xshift=.1em]{\mCh@merge@arg} + ++(0,-\mCh@merge@length) node(crossing) {}; + \draw[\mCh@arrow@linethickness] + (crossing.base) -| ($(\mCh@merge@from@one.north)+(0,\mCh@rxn@node@distance)$); + \draw[\mCh@arrow@linethickness] + (crossing.base) -| ($(\mCh@merge@from@two.north)+(0,\mCh@rxn@node@distance)$); +} + +\mCh@def\mCh@merge@left{% + \draw[mCtip-,\mCh@arrow@linethickness] + ($(\mCh@merge@to.east)+(\mCh@rxn@node@distance,0)$) + --node[midway,above,yshift=.1em]{\mCh@merge@arg} + ++(\mCh@merge@length,0) node(crossing) {}; + \draw[\mCh@arrow@linethickness] + ($(\mCh@merge@from@one.west)+(-\mCh@rxn@node@distance,0)$) -| (crossing.base); + \draw[\mCh@arrow@linethickness] + ($(\mCh@merge@from@two.west)+(-\mCh@rxn@node@distance,0)$) -| (crossing.base); +} + +\mCh@def\mCh@merge@below{% + \draw[mCtip-,\mCh@arrow@linethickness] + ($(\mCh@merge@to.north)+(0,\mCh@rxn@node@distance)$) + --node[midway,right,xshift=.1em]{\mCh@merge@arg} + ++(0,\mCh@merge@length) node(crossing) {}; + \draw[\mCh@arrow@linethickness] + (crossing.base) -| ($(\mCh@merge@from@one.south)+(0,-\mCh@rxn@node@distance)$); + \draw[\mCh@arrow@linethickness] + (crossing.base) -| ($(\mCh@merge@from@two.south)+(0,-\mCh@rxn@node@distance)$); +} + +% eigentlicher Befehl ----------------------------------------------------------------- % +\newrobustcmd\mCh@merge[4][]{% + \ifblank{#1} + {\mCh@merge@i}{\mCh@merge@ii[#1]} + {#2}{#3}{#4}} + +\mCh@def\mCh@merge@i#1#2#3{% + \mCh@let@variable\merge@length\merge@length@value + \mCh@empty@variable\merge@arg + \mCh@set@variable\merge@to{#1}% + \mCh@set@variable\merge@from@one{#2}% + \mCh@set@variable\merge@from@two{#3}% + \mCh@merge@below +} + +\mCh@def\mCh@merge@ii[#1]#2#3#4{% + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% + \mCh@ifempty@variable\firstarg + {\mCh@empty@variable\merge@arg} + {\mCh@let@variable\merge@arg\firstarg}% + \mCh@ifempty@variable\thirdarg + {\mCh@let@variable\merge@length\merge@length@value} + {\mCh@set@variable\merge@length{\mCh@thirdarg}}% + \mCh@set@variable\merge@to{#2}% + \mCh@set@variable\merge@from@one{#3}% + \mCh@set@variable\merge@from@two{#4}% + \mCh@ifempty@variable\secondarg + {\mCh@merge@below} + {\csuse{mCh@merge@\mCh@secondarg}}% +} + +\newrobustcmd\setmergelength[1]{% + \ifblank{#1} + {\mCh@let@variable\merge@length@value\merge@length@default} + {\mCh@set@variable\merge@length@value{#1}}} + +% -------------------------------------------------------------------------- +% REAKTIONSSCHEMA +\newlength\mCh@rxn@node@distance@default +\newlength\mCh@rxn@node@distance + +\deflength\mCh@rxn@node@distance@default{1em} +\deflength\mCh@rxn@node@distance{\mCh@rxn@node@distance@default} + +\newrobustcmd\setrcndist[1]{% + \ifblank{#1} + {\deflength\mCh@rxn@node@distance{\mCh@rxn@node@distance@default}} + {\deflength\mCh@rxn@node@distance{#1}}} + +% Schema +% \begin{rxnscheme}[<label>,<placement>,<align>,<scale factor>,<name>]{<caption>} +\mCh@new@variable\rs@scale +\mCh@new@variable\rs@currentscale + +\mCh@set@variable\rs@scale{1.0} +\mCh@set@variable\rs@currentscale{\mCh@rs@scale} + +\newrobustcmd\setschemename[1]{% + \mCh@set@variable\rs@name{#1}} + +\mCh@new@variable\rs@caption +\mCh@new@variable\rs@label +\mCh@new@variable\rs@currentlabel +\mCh@new@variable\rs@align +\mCh@new@variable\rs@right +\mCh@new@variable\rs@center +\mCh@new@variable\rs@left + +\mCh@let@variable\rs@currentlabel\rs@label +\mCh@set@variable\rs@align{center} +\mCh@set@variable\rs@right{right} +\mCh@set@variable\rs@center{center} +\mCh@set@variable\rs@left{left} + +\newrobustcmd\setschemealign[1]{% + \ifblank{#1} + {\mCh@set@variable\rs@align{center}} + {\mCh@set@variable\rs@align{#1}}} + +% Gleitumgebung +\floatstyle{ruled} +\newfloat{rxnfloat}{\mCh@rs@currentplacement}{rxnscheme} +\floatname{rxnfloat}{\mCh@rs@name}% Name ändern + +% eigentliche Umgebung: +\newrobustcmd\mCh@rxnscheme[2][]{% + \ifblank{#1} + {\mCh@rxnscheme@i} + {\mCh@empty@variable\rs@currentlabel\mCh@rxnscheme@ii[#1]}% + {#2}} + +\mCh@def\mCh@rxnscheme@ii[#1]#2{% [<label>,<placement>,<align>,<scale>,<name>] + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% + \mCh@ifempty@variable\firstarg% erste Option + {\mCh@empty@variable\rs@currentlabel} + {\mCh@let@variable\rs@currentlabel\firstarg}% + \mCh@ifempty@variable\secondarg% zweite Option + {\mCh@let@variable\rs@currentplacement\rs@placement} + {\mCh@let@variable\rs@currentplacement\secondarg}% + \let\mCh@remainargs\@empty + \expandafter\mCh@splitarg\expandafter{\mCh@thirdarg}% + \mCh@ifempty@variable\firstarg% dritte Option + {\mCh@set@variable\rs@align{center}} + {\mCh@let@variable\rs@align\firstarg}% + \mCh@ifempty@variable\secondarg% vierte Option + {\mCh@set@variable\rs@currentscale{1}} + {\mCh@let@variable\rs@currentscale\secondarg}% + \mCh@ifempty@variable\thirdarg{}% fünfte Option + {\mCh@let@variable\rs@name\thirdarg}% + \mCh@rxnscheme@i{#2}% +} + +\mCh@def\mCh@scheme@enable{% + \let\arrow\mCh@arrow + \let\reactant\mCh@reactant + \let\mesomeric\mCh@mesomeric + \let\transition\mCh@transition + \let\anywhere\mCh@anywhere + \let\dummy\mCh@dummy + \let\branch\mCh@branch + \let\chemand\mCh@chemand + \let\merge\mCh@merge +% \let\elmove\mCh@elmove +} + +\mCh@def\mCh@scheme@disable{% + \let\arrow\relax + \let\reactant\relax + \let\mesomeric\relax + \let\transition\relax + \let\anywhere\relax + \let\dummy\relax + \let\branch\relax + \let\chemand\relax + \let\merge\relax +% \let\elmove\relax +} + +\mCh@def\mCh@rxnscheme@i#1{% + \mCh@scheme@enable + \mCh@set@variable\rs@caption{#1}% + \rxnfloat + \mCh@ifeq@variable\rs@align\rs@center{\centering}{}% + \mCh@ifeq@variable\rs@align\rs@left{\raggedright}{}% + \mCh@ifeq@variable\rs@align\rs@right{\raggedleft}{}% + \mCh@atomsize\mCh@bondlength\mCh@bondshape + \tikzpicture[ + every picture/.style={scale=\mCh@rs@currentscale}, + start chain, + node distance=\mCh@rxn@node@distance, + inner sep=0pt, + outer sep=0pt] + \mCh@dummy +} + +\newenvironment{rxnscheme}{\mCh@rxnscheme}{% + \endtikzpicture + \caption{\mCh@rs@caption}% + \mCh@ifempty@variable\rs@currentlabel{} + {\label{\mCh@rs@currentlabel}}% + \endrxnfloat + \mCh@scheme@disable +} + +% ---------------------------------------------------------------------------- +% einfache Reaktion +% \begin{rxn}[<align>,<scalefactor>] +\mCh@new@variable\reaction@scale +\mCh@new@variable\reaction@align + +\mCh@set@variable\reaction@scale{1.0} +\mCh@set@variable\reaction@align{center} + +\newrobustcmd\setrxnalign[1]{% + \ifblank{#1} + {\mCh@set@variable\reaction@align{center}} + {\mCh@set@variable\reaction@align{#1}}} + +\mCh@new@variable\reaction@right +\mCh@new@variable\reaction@center +\mCh@new@variable\reaction@left + +\mCh@set@variable\reaction@right{right} +\mCh@set@variable\reaction@center{center} +\mCh@set@variable\reaction@left{left} + +\newrobustcmd\mCh@rxn[1][]{% + \ifblank{#1} + {\mCh@rxn@i}{\mCh@rxn@ii[#1]}} + +\mCh@def\mCh@rxn@ii[#1]{% + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% + \mCh@ifempty@variable\firstarg + {\mCh@let@variable\reaction@align\reaction@center} + {\mCh@let@variable\reaction@align\firstarg}% + \mCh@ifempty@variable\secondarg + {\mCh@set@variable\reaction@scale{1}} + {\mCh@let@variable\reaction@scale\secondarg}% + \mCh@rxn@i +} + +\mCh@def\mCh@rxn@i{% + \mCh@scheme@enable + \hspace*{0pt}% + \mCh@ifeq@variable\reaction@align\reaction@center{\center}{}% + \mCh@ifeq@variable\reaction@align\reaction@left{\flushleft}{}% + \mCh@ifeq@variable\reaction@align\reaction@right{\flushright}{}% + \mCh@bondlength\mCh@bondshape\mCh@atomsize + \begin{tikzpicture}[ + every picture/.style={scale=\mCh@reaction@scale}, + start chain, + node distance=\mCh@rxn@node@distance, + inner sep=0pt, + outer sep=0pt] + \mCh@dummy +} + +\newenvironment{rxn}{\mCh@rxn}{% + \end{tikzpicture}% + \mCh@ifeq@variable\reaction@align\reaction@center{\endcenter}{}% + \mCh@ifeq@variable\reaction@align\reaction@left{\endflushleft}{}% + \mCh@ifeq@variable\reaction@align\reaction@right{\endflushright}{}% + \mCh@scheme@disable +} + +% -------------------------------------------------------------------------- +% REAKTANDEN +% Standardreaktand +% \reactant[<pos>,<name>,<tikz>]{<something>} +\def\mCh@argument@safe{\@makeother\#} + +\newrobustcmd\mCh@reactant[1][]{% + \begingroup + \mCh@argument@safe + \ifblank{#1} + {\mCh@reactant@i} + {\mCh@reactant@ii[#1]}% +} + +\mCh@def\mCh@reactant@i#1{% + \expandafter\node\expandafter[% + \mCh@reactant@visible, + on chain=going {at=(\tikzchainprevious.0)}, + anchor=180, + shift=(0:\mCh@rxn@node@distance)]{#1}; + \endgroup +} + +\mCh@def\mCh@reactant@ii[#1]#2{% + \let\mCh@remainargs\@empty\mCh@splitarg{#1}% + \mCh@ifempty@variable\firstarg{% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz> + \mCh@set@variable\angle{0}% + \mCh@set@variable\anchor{180}% + \mCh@empty@variable\referred@node + }{% + \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}% + \mCh@set@variable\anchor{180+\mCh@angle}% + }% + \mCh@ifempty@variable\referred@node + {\mCh@set@variable\referred@node{\tikzchainprevious}}{}% + \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[% + \expandafter\mCh@thirdarg\expandafter,% + \mCh@reactant@visible, + on chain=going {at=(\mCh@referred@node.\mCh@angle)}, + anchor=\mCh@anchor,shift=(\mCh@angle:\mCh@rxn@node@distance)] + (\mCh@secondarg){#2}; + \endgroup +} + +% Mesomerie +% \mesomeric[<pos>,<name>,<tikz>]{<something>} +\newrobustcmd\mCh@mesomeric[1][]{% + \begingroup + \mCh@argument@safe + \ifblank{#1} + {\mCh@mesomeric@i} + {\mCh@mesomeric@ii[#1]}% +} + +\mCh@def\mCh@mesomeric@i#1{% + \node[on chain=going {at=(\tikzchainprevious.0), + shift=($(0:\mCh@rxn@node@distance)$)}, + anchor=180,shift=(0:\mCh@rxn@node@distance), + inner sep=1pt, + left delimiter={[}, + right delimiter={]}] + {\tikzpicture[start branch]#1\endtikzpicture}; + \endgroup +} + +\mCh@def\mCh@mesomeric@ii[#1]#2{% + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% + \mCh@ifempty@variable\firstarg{% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz> + \mCh@set@variable\angle{0}% + \mCh@set@variable\anchor{180}% + \mCh@empty@variable\referred@node + }{% + \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}% + \mCh@set@variable\anchor{180+\mCh@angle}% + }% + \mCh@ifempty@variable\referred@node + {\mCh@set@variable\referred@node{\tikzchainprevious}}{}% + \expandafter\node\expandafter[\mCh@thirdarg, + on chain=going {at=(\mCh@referred@node.\mCh@angle)}, + anchor=\mCh@anchor, + shift=(\mCh@angle:\mCh@rxn@node@distance), + inner sep=1pt, + left delimiter={[}, + right delimiter={]}] + (\mCh@secondarg){\tikzpicture[start branch]#2\endtikzpicture}; + \endgroup +} + +% Mesomerie-Pfeil +% \marrow[<pos>] +\newrobustcmd\marrow[1][]{\arrow[#1,<->,.5]{}{}} + +% Anywhere +% \anywhere{<pos>,<name>,<tikz>}{<something>} +\mCh@new@variable\anywhere@positioning + +\newrobustcmd\mCh@anywhere[1]{% + \begingroup + \mCh@argument@safe + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz> + \mCh@ifempty@variable\firstarg{% + \mCh@error{\string\anywhere: positioning missing}{}% + }{% + \expandafter\mCh@if@instr\expandafter{\mCh@firstarg}{=}{% + \mCh@xset@variable\anywhere@positioning{\mCh@firstarg}% + }{% + \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}% + \mCh@set@variable\anchor{180+\mCh@angle}% + \mCh@ifempty@variable\referred@node{% + \mCh@error{You can't use `angle' to position \string\anywhere. + You need to use `name.angle'}% + }{% + \mCh@set@variable\anywhere@positioning{% + at=(\mCh@referred@node.\mCh@angle),anchor=\mCh@anchor}% + }% + }% + }% + \mCh@anywhere@i +} + +\mCh@def\mCh@anywhere@i#1{% + \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[% + \expandafter\mCh@thirdarg\expandafter,% + \mCh@anywhere@positioning](\mCh@secondarg){#1}; + \endgroup +} + +% Dummy +% \dummy[<name>] +\newrobustcmd\mCh@dummy[1][]{% + \ifblank{#1} + {\draw node[on chain,xshift=-\mCh@rxn@node@distance]{};} + {\draw node[on chain,xshift=-\mCh@rxn@node@distance](#1){};}} + +% Uebergangszustand +% \transition[<pos>,<name>,<tikz>]{<something>} +\mCh@new@variable\transition@name + +\newrobustcmd\mCh@transition[1][]{% + \begingroup + \mCh@argument@safe + \ifblank{#1} + {\mCh@transition@i} + {\mCh@transition@ii[#1]}% +} + +\mCh@def\mCh@transition@i#1{% + \expandafter\node\expandafter[\mCh@reactant@visible, + on chain=going {at=(\tikzchainprevious.0)}, + anchor=180, + shift=(0:\mCh@rxn@node@distance), + anchor=180, + inner sep=3pt, + left delimiter={[}, + right delimiter={]}] + (mCh@transition@name){#1}; + \node at ($(mCh@transition@name.north east)+(.7em,0)$) + {$\transitionstatesymbol$}; + \endgroup +} + +\mCh@def\mCh@transition@ii[#1]#2{% + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% + \mCh@ifempty@variable\firstarg{% erste Option: <pos> + \mCh@set@variable\angle{0}% + \mCh@set@variable\anchor{180}% + \mCh@empty@variable\referred@node + }{% + \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}% + \mCh@set@variable\anchor{180+\mCh@angle}% + }% + \mCh@ifempty@variable\secondarg% zweite Option: <name>, dritte Option: <tikz> + {\mCh@set@variable\transition@name{mCh@transition@name}} + {\mCh@let@variable\transition@name\secondarg}% + \mCh@ifempty@variable\referred@node + {\mCh@set@variable\referred@node{\tikzchainprevious}}{}% + \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[% + \mCh@reactant@visible\expandafter,% + \mCh@thirdarg, + on chain=going {at=(\mCh@referred@node.\mCh@angle)}, + anchor=\mCh@anchor, + shift=(\mCh@angle:\mCh@rxn@node@distance), + inner sep=3pt, + left delimiter={[}, + right delimiter={]}] + (\mCh@transition@name){#2}; + \node at ($(\mCh@transition@name.north east)+(.7em,0)$) + {$\transitionstatesymbol$}; + \endgroup +} + +% Abzweigung +% \branch[<pos>,<name>,<tikz>]{<formulae>} +% <pos>: default: on chain=going "right" (0°) +% on chain=going <somewhere> +% <somewhere>=of <name> +% <angle> (sitzt auf der Kette) +% <name>.<angle> (sitzt nicht auf der Kette) +\mCh@new@variable\branch@positioning + +\newrobustcmd\mCh@branch[1][]{% + \begingroup + \mCh@argument@safe + \ifblank{#1} + {\mCh@branch@i} + {\mCh@branch@ii[#1]}% +} + +\mCh@def\mCh@branch@i{% + \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible, + on chain=going {at=(\tikzchainprevious.0)}, + anchor=180, + shift=(0:\mCh@rxn@node@distance)}% + \mCh@empty@variable\secondarg + \mCh@empty@variable\thirdarg + \mCh@branch@iii} + +\mCh@def\mCh@branch@ii[#1]{% + \let\mCh@remainargs\@empty + \mCh@splitarg{#1}% erste Option: <pos>, zweite Option: <name>, dritte Option: <tikz> + \mCh@ifempty@variable\firstarg{% + \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible, + on chain=going {at=(\tikzchainprevious.0)}, + anchor=180, + shift=(0:\mCh@rxn@node@distance)}% + }{% + \expandafter\mCh@if@instr\expandafter{\mCh@firstarg}{=}{% + \mCh@xset@variable\branch@positioning{\mCh@branch@visible,\mCh@firstarg}% + }{% + \expandafter\mCh@analyze@angle\expandafter{\mCh@firstarg}% + \mCh@set@variable\anchor{180+\mCh@angle}% + \mCh@ifempty@variable\referred@node{% + \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible, + on chain=going {at=(\tikzchainprevious.\mCh@angle)}, + anchor=\mCh@anchor, + shift=(\mCh@angle:\mCh@rxn@node@distance)}% + }{% + \expandafter\mCh@set@variable\expandafter\branch@positioning\expandafter{\mCh@branch@visible, + at=(\mCh@referred@node.\mCh@angle), + anchor=\mCh@anchor, + shift=(\mCh@angle:\mCh@rxn@node@distance)}% + }% + }% + }% + \mCh@branch@iii} + +\mCh@def\mCh@branch@iii#1{% + \expandafter\expandafter\expandafter\node\expandafter\expandafter\expandafter[% + \expandafter\mCh@branch@positioning\expandafter,% + \mCh@thirdarg] + (\mCh@secondarg){\tikzpicture[start branch]#1\endtikzpicture}; + \endgroup +}% + + +% -------------------------------------------------------------------------- +% Sonstiges +% Elektronenverschiebungspfeile +\mCh@new@variable\elmove@default@tikz +\mCh@new@variable\elmove@tikz + +\tikzset{mCh@elmove/.style={->,red,shorten <=3pt,shorten >=1pt}} +\mCh@set@variable\elmove@default@tikz{mCh@elmove} +\mCh@let@variable\elmove@tikz\elmove@default@tikz + +\newrobustcmd\elmove[5][]{% + \chemmove{ + \expandafter\draw\expandafter[\mCh@elmove@tikz,#1] + (#2).. controls +(#3) and +(#5)..(#4); + }} + +\newrobustcmd\setelmove[1]{% + \ifblank{#1} + {\mCh@let@variable\elmove@tikz\elmove@default@tikz} + {\mCh@set@variable\elmove@tikz{#1}}} + +% Plus +\newrobustcmd\mCh@chemand[1][]{% + \ifblank{#1} + {\reactant{\chemsign[0pt]{+}}} + {\reactant[#1]{\chemsign[0pt]{+}}}} + +% -------------------------------------------------------------------------- +% Setup myChemistry +% Bindungslänge +\mCh@new@variable\bondlength@default +\mCh@new@variable\bondlength + +\mCh@set@variable\bondlength@default{1.8em} +\mCh@set@variable\bondlength{\setatomsep{\mCh@bondlength@default}} + +\newrobustcmd\setbondlength[1]{% + \ifblank{#1} + {\mCh@set@variable\bondlength{\setatomsep{\mCh@bondlength@default}}} + {\mCh@set@variable\bondlength{\setatomsep{#1}}}} + +% Keilbindungen +\mCh@new@variable\bondshape@one +\mCh@new@variable\bondshape@two +\mCh@new@variable\bondshape@three + +\mCh@set@variable\bondshape@one{3pt} +\mCh@set@variable\bondshape@two{.5pt} +\mCh@set@variable\bondshape@three{1pt} + +\newrobustcmd\setbondshape[3]{% + \ifblank{#1} + {\mCh@set@variable\bondshape@one{3pt}} + {\mCh@set@variable\bondshape@one{#1}}% + \ifblank{#2} + {\mCh@set@variable\bondshape@two{.5pt}} + {\mCh@set@variable\bondshape@two{#2}}% + \ifblank{#3} + {\mCh@set@variable\bondshape@three{1pt}} + {\mCh@set@variable\bondshape@three{#3}}% +} + +\mCh@new@variable\bondshape +\mCh@set@variable\bondshape{% + \setcrambond{\mCh@bondshape@one}{\mCh@bondshape@two}{\mCh@bondshape@three}} + +% Atomgröße +\mCh@new@variable\atomsize@default +\mCh@new@variable\atomsize + +\mCh@set@variable\atomsize@default{\small} +\mCh@let@variable\atomsize\atomsize@default + +\newrobustcmd\setatomsize[1]{% + \ifblank{#1} + {\mCh@let@variable\atomsize\atomsize@default} + {\mCh@set@variable\atomsize{#1}}} + +% allg. Setup +\newrobustcmd\mCsetup[1]{\setkeys{mCh@setup}{#1}} + +\define@key{mCh@setup}{arrowlabel}[\mCh@arrow@label@dist@def]{% + \setarrowlabel{#1}} +\define@key{mCh@setup}{arrowlength}[\mCh@arrow@length@def]{% + \setarrowlength{#1}} +\define@key{mCh@setup}{arrowline}[\mCh@arrow@linethickness@default]{% + \setarrowline{#1}} +\define@key{mCh@setup}{atomsize}[\mCh@atomsize@default]{% + \setatomsize{#1}} +\define@key{mCh@setup}{bondlength}[\mCh@bondlength@default]{% + \setbondlength{#1}} +\define@key{mCh@setup}{rcndist}[\mCh@rxn@node@distance@default]{% + \setrcndist{#1}} +\define@key{mCh@setup}{rxnalign}[center]{% + \setrxnalign{#1}} +\define@key{mCh@setup}{schemealign}[center]{% + \setschemealign{#1}} +\define@key{mCh@setup}{align}[center]{% + \setrxnalign{#1} + \setschemealign{#1}} +\define@key{mCh@setup}{mergelength}[\mCh@merge@length@default]{% + \setmergelength{#1}} +\define@key{mCh@setup}{elmove}[\mCh@elmove@default@tikz]{% + \setelmove{#1}} +\define@key{mCh@setup}{reset}[]{% + \setarrowlabel{}% + \setarrowlength{}% + \setarrowline{}% + \setmergelength{}% + \setatomsize{}% + \setbondlength{}% + \setbondshape{}{}{}% + \setrcndist{}% + \setrxnalign{}% + \setschemealign{}% + \setelmove{}% +} + +% -------------------------------------------------------------------------- +% NODES SICHTBAR/UNSICHTBAR MACHEN +\mCh@new@variable\reactant@visible +\mCh@new@variable\arrow@uplabel@visible +\mCh@new@variable\arrow@downlabel@visible +\mCh@new@variable\branch@visible + +\mCh@empty@variable\reactant@visible +\mCh@empty@variable\arrow@uplabel@visible +\mCh@empty@variable\arrow@downlabel@visible +\mCh@empty@variable\branch@visible + +\newrobustcmd\makevisible{% + \ifmCh@draft + \mCh@set@variable\reactant@visible{draw=red!60,solid}% + \mCh@set@variable\arrow@uplabel@visible{draw=green!60,solid}% + \mCh@set@variable\arrow@downlabel@visible{draw=blue!60,solid}% + \mCh@set@variable\branch@visible{draw=cyan,solid}% + \fi +} + +\newrobustcmd\makeinvisible{% + \mCh@empty@variable\reactant@visible + \mCh@empty@variable\arrow@uplabel@visible + \mCh@empty@variable\arrow@downlabel@visible + \mCh@empty@variable\branch@visible +} + +\endinput + +% ---------------------------------------------------------------------------- +HISTORY: +2011/02/24 version 1.0 - first release to CTAN +2011/03/01 version 1.1 - package option `english' added + - package key `placement' added + - rxnscheme key `placement' added + - package key `shade=boolean' changed into package + option `shade' + - package option `nochemexec' added, will prevent mC + from loading chemexec +2011/03/20 version 1.2 - license changed into LPPL 1.3 or later + - package option `nocompounds' added, will prevent mC + from loading chemcompounds + - package option `chemstyle' added, will load chemstyle + - package option `nomhchem' added, will prevent mC from + loading mhchem if chemexec isn't loaded either + - package option `nopackages' added, will prevent mC + from loading any chemistry package except chemfig + - some small issues resolved + - bug in arrow type <=> resolved + - arrow argument placement rewritten; two new keys for + arrow: `aboveshift' and `belowshift' (causing new + problems with alignment, though) + - wrong arrow alignment (due to last change) mainly + resolved (NEEDS pgf v2.10!) + => solved wrong branch alignment as well + - `inner sep' set to 0, arrow, transition & mesomeric + adjusted + - bug in arrow type -|> resolved + - commands \makevisible / \makeinvisible added + - arrow key `both' added + - rxn has now keys instead of an option + - commands \setrcndist, \setrxnalign, \setschemealign + added + - rxn-, rxnscheme-key align added +2011/03/26 version 1.2.1 - rewritten commands, so they accept second argument + without first: + \reactand, \mesomeric, \transition, \branch, + \makevisible, \makeinvisible +2011/03/28 version 1.2.2 - bugfix with transition + - atomsize, arrowlength, bondlength and bondshape + renamed into set<name> and code slightly rewritten + - \mCsetup added +2011/04/01 version 1.2.3 - bug in \branch resolved + - \chemand added +2011/04/02 version 1.2.4 - bugs in \makevisible, \makeinvisible resolved + - input bondwidth.tex if ChemFig v0.4 +2011/04/04 version 1.3 - commands \reactand, \mesomeric, \branch, \transition, + \chemand (\makeinvisible, \makeinvisible) rewritten: + more flexible with opt. arguments +2011/04/15 version 1.4 - minor bugfixes + - \merge-command rewritten: it now accepts an arrow + label and the length is adjustable + - \dummy mostly obsolete + - bugfix with aligning rxn & rxnscheme + - synonym to \reactand=\reactant added + - rxn & rxnscheme rewritten + - commands \reactant, \mesomeric, \branch & \transition + modified: argument is set with \mCh@argument@safe{#1}, + so the chemfig catcode regime is working properly + before () (else possible problem with triple bond ~) + - syntax of \arrow changed so it fits to the syntax of + all the other commands + - command \anywhere added + - own arrow tips defined + - command \setarrowline added + - new arrow type -+> added +2011/04/23 version 1.5 - major parts of the code rewritten -- the whole + positioning part now is different and way more flexible: + arbitrary angles can be used for positioning, referencing + an object is easier, arrows can be modified using <tikz>, + command \anywhere now has similar syntax + - arrow types <=>> and <<=> added + - arrow type -+> modified: more flexible + - bugfixes in error-handling +2011/04/27 version 1.5.1 - removed bondwidth.tex + - \arrow, \reactant, \mesomeric, \transition, \anywhere, + \dummy, \branch, and \chemand only defined inside scheme + environments +2012/07/27 version 1.99 - conflict with `pdfpages' resolved, LaTeXified various + parts in order to minimize conflicts with other + packages; \merge is also only defined inside the scheme + environments +2012/09/20 version 1.99a - small adjustments to \elmove +2012/12/19 version 1.99b - changed catcode regime (# is read with catcode 12) + so that chemfig's bond offset works + +% ----------------------------------------------------------------------------
\ No newline at end of file |