% -------------------------------------------------------------------------- % 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[,,,,both,]{}{} % 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[