\ProvidesPackage{mol2chemfig}[2019/11/24 v1.5]

\RequirePackage{xcolor, chemfig, twoopt, ifmtarg, calc, xstring}
\usetikzlibrary{decorations}

\def\mcf@three@ea{\expandafter\expandafter\expandafter}

% this macro (by Christian Tellechea) draws circles in aromatic rings. 
\def\mcfcringle#1{% 
 \mcf@three@ea\tikz\mcf@three@ea\draw\mcf@three@ea[\useKV[chemfig]{chemfig
    style}](0,0)circle(\useKV[chemfig]{atom
    sep}*#1*0.66667*\useKV[chemfig]{cycle radius coeff});}

% auxiliary macros for rendering double and triple bonds

% tikz decoration to render parallel bond strokes
\pgfdeclaredecoration{mcfsecondstroke}{initial}{
  \state{initial}[width=\pgfdecoratedpathlength-1sp]{
     \pgfmoveto{\pgfpointorigin}
  }
  \state{final}{
     \pgflineto{\pgfpointorigin}
  }
}

% the complete sines definition is taken from http://tex.stackexchange.com/questions/25678/
\pgfdeclaredecoration{complete sines}{initial}
{
    \state{initial}[
        width=+0pt,
        next state=sine,
        persistent precomputation={\pgfmathsetmacro\matchinglength{
            \pgfdecoratedinputsegmentlength / int(\pgfdecoratedinputsegmentlength/\pgfdecorationsegmentlength)}
            \setlength{\pgfdecorationsegmentlength}{\matchinglength pt}
        }] {}
    \state{sine}[width=\pgfdecorationsegmentlength]{
        \pgfpathsine{\pgfpoint{0.25\pgfdecorationsegmentlength}{0.5\pgfdecorationsegmentamplitude}}
        \pgfpathcosine{\pgfpoint{0.25\pgfdecorationsegmentlength}{-0.5\pgfdecorationsegmentamplitude}}
        \pgfpathsine{\pgfpoint{0.25\pgfdecorationsegmentlength}{-0.5\pgfdecorationsegmentamplitude}}
        \pgfpathcosine{\pgfpoint{0.25\pgfdecorationsegmentlength}{0.5\pgfdecorationsegmentamplitude}}
}
    \state{final}{}
}

% color definitions 
\colorlet{mcfbgcolor}{white} % adjust when drawing on a non-white canvas 
\colorlet{mcfpusharrowcolor}{black}
\colorlet{mcfatomnocolor}{blue}

\def\CF@@keytomacro#1#2{\edef#1{\unexpanded\expandafter\expandafter\expandafter{\useKV[chemfig]{#2}}}}

\tikzset{ % set styles
    % wavy bonds. Slightly modified from http://www.texdev.net/tag/chemfig/
    setatomsep/.code={
      \CF@@keytomacro\CF@@atomsep{atom sep}
      \pgfmathsetmacro\mcf@@segmentlength{\CF@@atomsep/6}
      \pgfmathsetmacro\mcf@@amplitude{\CF@@atomsep/10}
    },
    %
    mcfwavy/.style =
    {
      setatomsep,
      decorate,
      decoration =
        {
          complete sines,
          post length = 0 pt,
          pre length  = 0 pt,
          % Use chemfig's atom spacing
          segment length=\mcf@@segmentlength, 
          amplitude=\mcf@@amplitude
        }
    },
    % this style is used by the \mcfelmove macro
    mcfpusharrow/.style = {
        ->,  
        mcfpusharrowcolor,
        >=stealth,  
        shorten <=3pt,
        shorten >=2pt,
        preaction={draw=mcfbgcolor, -,line width=1.5pt}
    },
    %
    % one bond crossing before another - gets a white backdrop 
    % as wide as doublesep
    mcfbgcolor/.style={white},
    %
    mcfx/.style 2 args={%
        preaction={
            draw,
            mcfbgcolor,
            line width={\useKV[chemfig]{double bond sep}},
            shorten <= {#1*\useKV[chemfig]{double bond sep}/100},
            shorten >= {#2*\useKV[chemfig]{double bond sep}/100}
        }
    },
    %
    mcfcrossbond/.style={% for backwards compatibility only
        mcfx={100}{100}
    },
    %
    secondbond/.style 2 args={
        shorten <= {#1*\useKV[chemfig]{double bond sep}/100}, 
        shorten >= {#2*\useKV[chemfig]{double bond sep}/100}
    },
    %
    secondfgbond/.style 2 args={
        preaction={draw,-,mcfbgcolor,line width={\useKV[chemfig]{double bond sep}}},
        secondbond={#1}{#2}    
    },
    %
    secondleft/.style 2 args={
        secondbond={#1}{#2},
        decoration={mcfsecondstroke,raise={\useKV[chemfig]{double bond sep}}},
        decorate
    },
    %
    secondright/.style 2 args={
        secondbond={#1}{#2},
        decoration={mcfsecondstroke,raise=-{\useKV[chemfig]{double bond sep}}},
        decorate
    },
    %
    secondfgleft/.style 2 args={
        secondfgbond={#1}{#2},
        decoration={mcfsecondstroke,raise={\useKV[chemfig]{double bond sep}}},
        decorate
    },
    %
    secondfgright/.style 2 args={
        secondfgbond={#1}{#2},
        decoration={mcfsecondstroke,raise=-{\useKV[chemfig]{double bond sep}}},
        decorate
    },
    %
    dbl/.style 2 args={
      preaction={draw,secondleft={#1}{#2}}
    },
    %
    dbr/.style 2 args={
      preaction={draw,secondright={#1}{#2}}
    },
    %
    trpl/.style 2 args={
      preaction={draw,secondleft={#1}{#2}},
      preaction={draw,secondright={#1}{#2}}
    },
    %
    dblx/.style n args={4}{
      preaction={draw,secondfgleft={#1}{#2}},
      mcfx={#3}{#4}
    },
    %
    dbrx/.style n args={4}{
      preaction={draw,secondfgright={#1}{#2}},
      mcfx={#3}{#4}
    },
    %
    trplx/.style n args={4}{
      preaction={draw,secondfgleft={#1}{#2}},
      preaction={draw,secondfgright={#1}{#2}},
      mcfx={#3}{#4}
    },
    %
    drh/.style={dbr={58}{58}},
    dlh/.style={dbl={58}{58}},
    drhs/.style={dbr={58}{0}},
    dlhs/.style={dbl={58}{0}},
    drhe/.style={dbr={0}{58}},
    dlhe/.style={dbl={0}{58}},
    drn/.style={dbr={0}{0}},
    dln/.style={dbl={0}{0}}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Conveniences for drawing push arrows
% the \mcfelmove command is adapted from the
% myChemistry package by Clemens Niederberger

\newcommand{\mcfelmove}[5][]{%
\node at (0,0) {% dummy wrapper node
\chemmove{\draw[mcfpusharrow,#1](#2).. controls +(#3) and +(#5)..(#4);%
}};}

% and, since the most common use for tikz code
% is arrow shortening and lengthening: a command streamlined for that.

\newcommandtwoopt{\mcfpush}[6][][]{% we use empties to keep same defaults
\@ifmtarg{#2}{
    \@ifmtarg{#1}{\mcfelmove{#3}{#4}{#5}{#6}}
                 {\mcfelmove[shorten <=#1]{#3}{#4}{#5}{#6}}
}{% #2 not empty
    \@ifmtarg{#1}{\mcfelmove[shorten >=#2]{#3}{#4}{#5}{#6}}
                 {\mcfelmove[shorten <=#1, shorten >=#2]{#3}{#4}{#5}{#6}}
}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Stacking atoms horizontally and vertically
\newlength{\mcfvspace}
\setlength{\mcfvspace}{1.5pt}

\newcommand{\mcfabove}[2]{\chemabove[\mcfvspace]{#1}{#2}}
\newcommand{\mcfbelow}[2]{\chembelow[\mcfvspace]{#1}{#2}}

\newlength{\mcf@boxwidth}
\newlength{\mcf@boxheight}

\newcommand{\mcf@box}[3][l]{
\settowidth{\mcf@boxwidth}{\printatom{#2}}
\settoheight{\mcf@boxheight}{\printatom{#2}}
\makebox[\mcf@boxwidth][#1]{\raisebox{0pt}[\mcf@boxheight][0pt]{\printatom{#3}}}}

\newcommand{\mcfleft}[2]{\mcf@box[r]{#2}{#1#2}}
\newcommand{\mcfright}[2]{\mcf@box{#1}{#1#2}}

\newcommand{\mcfaboveright}[3]{\mcfabove{#1}{\mcf@box{#2}{#2#3}}}
\newcommand{\mcfbelowright}[3]{\mcfbelow{#1}{\mcf@box{#2}{#2#3}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Formatting of charges and atom numbers

% Charges - could for example be defined as \oplus and \ominus
\newcommand{\mcfplus}{+}
\newcommand{\mcfminus}{-}

% atom numbers (used when option atom-numbers is selected)
\newcommand{\mcfatomno}[1]%
{\raisebox{2pt}{\color{mcfatomnocolor}{\ensuremath{\mathsf{_{#1}}}}}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% a little help with direct processing of mol2chemfig commands
\newcommand{\mcfinput}[1]{\@@input|"mol2chemfig #1"}
