diff options
author | Norbert Preining <norbert@preining.info> | 2019-11-26 03:00:45 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-11-26 03:00:45 +0000 |
commit | bd1c54bb99e58d8c140acb0b0a536037f96349b4 (patch) | |
tree | a819ef21fdb386c28b7becb459d3adfdde0fce15 /graphics/mol2chemfig/latex | |
parent | 447c94ee79e6bd2ecba4c822e4c07763b492747e (diff) |
CTAN sync 201911260300
Diffstat (limited to 'graphics/mol2chemfig/latex')
-rw-r--r-- | graphics/mol2chemfig/latex/mol2chemfig.sty | 233 |
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"} |