\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"}