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