summaryrefslogtreecommitdiff
path: root/graphics/mol2chemfig/latex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-11-26 03:00:45 +0000
committerNorbert Preining <norbert@preining.info>2019-11-26 03:00:45 +0000
commitbd1c54bb99e58d8c140acb0b0a536037f96349b4 (patch)
treea819ef21fdb386c28b7becb459d3adfdde0fce15 /graphics/mol2chemfig/latex
parent447c94ee79e6bd2ecba4c822e4c07763b492747e (diff)
CTAN sync 201911260300
Diffstat (limited to 'graphics/mol2chemfig/latex')
-rw-r--r--graphics/mol2chemfig/latex/mol2chemfig.sty233
1 files changed, 233 insertions, 0 deletions
diff --git a/graphics/mol2chemfig/latex/mol2chemfig.sty b/graphics/mol2chemfig/latex/mol2chemfig.sty
new file mode 100644
index 0000000000..67af8f52c5
--- /dev/null
+++ b/graphics/mol2chemfig/latex/mol2chemfig.sty
@@ -0,0 +1,233 @@
+\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"}