129 lines
5.7 KiB
TeX
129 lines
5.7 KiB
TeX
\ifdefined\CFname\else
|
|
\errmessage{Chemfig is not loaded, lewis cannot work}%
|
|
\expandafter\endinput
|
|
\fi
|
|
|
|
\csname lewisloadonce\endcsname
|
|
\let\lewisloadonce\endinput
|
|
|
|
\begingroup
|
|
\def\X#1{\catcode\number`#1=\number\catcode`#1\relax}
|
|
\xdef\CFrestorecatcode{\X\[\X\]\X\:\X\(\X\)\X\,\X\-\X\=\X\~\X\!\X\?\X\<\X\>\X\;\X\*\X\|\X\@\X\ \X\_}%
|
|
\endgroup
|
|
|
|
\catcode`\[12 \catcode`\]12 \catcode`\:12 \catcode`\(12
|
|
\catcode`\)12 \catcode`\,12 \catcode`\-12 \catcode`\=12
|
|
\catcode`\~12 \catcode`\!12 \catcode`\?12 \catcode`\<12
|
|
\catcode`\>12 \catcode`\;12 \catcode`\*12 \catcode`\|12
|
|
\catcode`\@12 \catcode`\#6 \catcode`\ 10 \catcode`\_11
|
|
|
|
\newif\ifCF_lewisoverlay
|
|
\newbox\CF_boxlewis
|
|
|
|
\defKV[chemfig]{%
|
|
lewis | width = \CF_defifempty\CF_lewiswidthdouble {#1}{0.3ex},
|
|
lewis sep = \CF_defifempty\CF_lewisoffset {#1}{0.4ex},
|
|
lewis length = \CF_defifempty\CF_lewislength {#1}{1.5ex},
|
|
lewis style = \def\CF_lewisstyle {#1},
|
|
lewis dist = \CF_defifempty\CF_lewisdist {#1}{0.3em},
|
|
lewis radius = \CF_defifempty\CF_lewisradius {#1}{0.15ex},
|
|
lewis diag coeff = \CF_defifempty\CF_lewisdiagcoeff {#1}{1}
|
|
}
|
|
\setKVdefault[chemfig]{%
|
|
lewis | width = 0.3ex,
|
|
lewis sep = 0.4ex,
|
|
lewis length = 1.5ex,
|
|
lewis style = {},
|
|
lewis dist = 0.3em,
|
|
lewis radius = 0.15ex,
|
|
lewis diag coeff = 1
|
|
}
|
|
|
|
\def\Lewis{%
|
|
\CF_lewisoverlayfalse
|
|
\CF_testopt\CF_lewisa{}%
|
|
}
|
|
|
|
\def\lewis{%
|
|
\CF_lewisoverlaytrue
|
|
\CF_testopt\CF_lewisa{}%
|
|
}
|
|
|
|
\def\CF_lewisa[#1]{%
|
|
\begingroup
|
|
\CF_doifnotempty{#1}{\setchemfig{#1}}%
|
|
\ifCF_lewisoverlay
|
|
\CF_addtomacro\CF_lewisstyle{,overlay}%
|
|
\fi
|
|
\CF_lewisb
|
|
}
|
|
|
|
\def\CF_lewisb#1{%
|
|
\CF_lewisc#1\_nil
|
|
\endgroup
|
|
}
|
|
|
|
\def\CF_lewisc#1,#2\_nil{%
|
|
\setbox\CF_boxlewis\hbox{\printatom{#2}}% mettre en dehors de tikzpicture (si \printatom ne passe pas en mode math)
|
|
\CF_ifinsidetikz
|
|
{\pgfinterruptpicture
|
|
\let\CF_atendoflewis\endpgfinterruptpicture
|
|
}
|
|
{\let\CF_atendoflewis\relax
|
|
}%
|
|
\tikzpicture[every node/.style={anchor=base,inner sep=0pt,outer sep=0pt,minimum size=0pt},baseline]%
|
|
\CF_makeother;\CF_makeother:%
|
|
\node(CF_lewis@anchor){};
|
|
\def\CF_lewisremainpos{#1}%
|
|
\let\CF_lewispreviouspos\empty
|
|
\loop
|
|
\unless\ifx\CF_lewisremainpos\empty
|
|
\edef\CF_lewiscurrentpos{\expandafter\CF_firsttonil\CF_lewisremainpos\_nil}%
|
|
\edef\CF_lewisremainpos{\expandafter\CF_gobarg\CF_lewisremainpos}%
|
|
\pgfmathsetmacro\CF_lewisx{\wd\CF_boxlewis/2+\ifcase\CF_lewiscurrentpos\space1\or1\or0\or-1\or-1\or-1\or0\or1\fi*(\wd\CF_boxlewis/2)}%
|
|
\pgfmathsetmacro\CF_lewisy{\ht\CF_boxlewis/2+\ifcase\CF_lewiscurrentpos\space0\or1\or1\or1\or0\or-1\or-1\or-1\fi*(\ht\CF_boxlewis/2\ifnum\CF_lewiscurrentpos>4 +\dp\CF_boxlewis\fi)}%
|
|
\edef\CF_lewisxoffset{\ifcase\CF_lewiscurrentpos\space1\or0.70711\or0\or-0.70711\or-1\or-0.70711\or0\or0.70711\fi}%
|
|
\edef\CF_lewisyoffset{\ifcase\CF_lewiscurrentpos\space0\or0.70711\or1\or0.70711\or0\or-0.70711\or-1\or-0.70711\fi}%
|
|
\ifodd\CF_lewiscurrentpos\relax
|
|
\pgfmathsetmacro\CF_lewiscurrentoffset{\CF_lewisoffset*\CF_lewisdiagcoeff}%%
|
|
\else
|
|
\let\CF_lewiscurrentoffset\CF_lewisoffset
|
|
\fi
|
|
\if.\expandafter\CF_firsttonil\CF_lewisremainpos\relax\_nil
|
|
\edef\CF_lewisremainpos{\expandafter\CF_gobarg\CF_lewisremainpos}%
|
|
\CF_expafter{\draw[fill,black,}{\CF_lewisstyle]}%
|
|
(\CF_lewisx pt+\CF_lewisxoffset*\CF_lewiscurrentoffset,\CF_lewisy pt+\CF_lewisyoffset*\CF_lewiscurrentoffset)circle(\CF_lewisradius);%
|
|
\else
|
|
\if|\expandafter\CF_firsttonil\CF_lewisremainpos\relax\_nil
|
|
\edef\CF_lewisremainpos{\expandafter\CF_gobarg\CF_lewisremainpos}%
|
|
\pgfmathsetmacro\CF_lewisx{\CF_lewisx pt+\CF_lewisxoffset*\CF_lewiscurrentoffset}%
|
|
\pgfmathsetmacro\CF_lewisy{\CF_lewisy pt+\CF_lewisyoffset*\CF_lewiscurrentoffset}%
|
|
\CF_expafter{\draw[}\CF_lewisstyle]%
|
|
(\CF_lewisx pt+\CF_lewislength*\CF_lewisyoffset/2 pt,\CF_lewisy-\CF_lewislength*\CF_lewisxoffset/2 pt)--
|
|
(\CF_lewisx pt+\CF_lewislength*\CF_lewisyoffset/2 pt+\CF_lewisxoffset*\CF_lewiswidthdouble,\CF_lewisy-\CF_lewislength*\CF_lewisxoffset/2 pt+\CF_lewisyoffset*\CF_lewiswidthdouble)--
|
|
(\CF_lewisx pt-\CF_lewislength*\CF_lewisyoffset/2 pt+\CF_lewisxoffset*\CF_lewiswidthdouble,\CF_lewisy+\CF_lewislength*\CF_lewisxoffset/2 pt+\CF_lewisyoffset*\CF_lewiswidthdouble)--
|
|
(\CF_lewisx pt-\CF_lewislength*\CF_lewisyoffset/2 pt,\CF_lewisy+\CF_lewislength*\CF_lewisxoffset/2 pt)--cycle;%
|
|
\else
|
|
\if:\expandafter\CF_firsttonil\CF_lewisremainpos\relax\_nil
|
|
\edef\CF_lewisremainpos{\expandafter\CF_gobarg\CF_lewisremainpos}%
|
|
\pgfmathsetmacro\CF_lewisx{\CF_lewisx pt+\CF_lewisxoffset*\CF_lewiscurrentoffset}%
|
|
\pgfmathsetmacro\CF_lewisy{\CF_lewisy pt+\CF_lewisyoffset*\CF_lewiscurrentoffset}%
|
|
\CF_expafter{\draw[fill,black,}{\CF_lewisstyle]}%
|
|
(\CF_lewisx pt+\CF_lewisdist*\CF_lewisyoffset/2 pt,\CF_lewisy-\CF_lewisdist*\CF_lewisxoffset/2 pt)circle(\CF_lewisradius)%
|
|
(\CF_lewisx pt-\CF_lewisdist*\CF_lewisyoffset/2 pt,\CF_lewisy+\CF_lewisdist*\CF_lewisxoffset/2 pt)circle(\CF_lewisradius);%
|
|
\else
|
|
\pgfmathsetmacro\CF_lewisx{\CF_lewisx pt+\CF_lewisxoffset*\CF_lewiscurrentoffset}%
|
|
\pgfmathsetmacro\CF_lewisy{\CF_lewisy pt+\CF_lewisyoffset*\CF_lewiscurrentoffset}%
|
|
\CF_expafter{\draw[}\CF_lewisstyle]%
|
|
(\CF_lewisx pt+\CF_lewislength*\CF_lewisyoffset/2 pt,\CF_lewisy-\CF_lewislength*\CF_lewisxoffset/2 pt)--%
|
|
(\CF_lewisx pt-\CF_lewislength*\CF_lewisyoffset/2 pt,\CF_lewisy+\CF_lewislength*\CF_lewisxoffset/2 pt);%
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\repeat
|
|
\node[anchor=base west]at(CF_lewis@anchor){\box\CF_boxlewis};%
|
|
\endtikzpicture
|
|
\CF_atendoflewis
|
|
}
|
|
\CFrestorecatcode
|
|
\endinput |