diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty | 843 |
1 files changed, 532 insertions, 311 deletions
diff --git a/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty index d789aef77ce..dcf361df406 100644 --- a/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty +++ b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty @@ -4,7 +4,7 @@ % - a collection of macros to make typesetting chemistry documents more convenient ---- % % ------------------------------------------------------------------------------------- % % - Clemens Niederberger -------------------------------------------------------------- % -% - 2011/05/15 ------------------------------------------------------------------------ % +% - 2011/06/22 ------------------------------------------------------------------------ % % ------------------------------------------------------------------------------------- % % - http://www.mychemistry.eu/ -------------------------------------------------------- % % - contact@mychemistry.eu ------------------------------------------------------------ % @@ -28,385 +28,606 @@ % - - % % - This work consists of the files chemmacros.sty, chemmacros_doc_de.tex, - % % - chemmacros_doc_de.tex, README - % -% ------------------------------------------------------------------------------------- % -% - Version history: ------------------------------------------------------------------ % -% 2011/05/15 version 1.0 CTAN release % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\CM@version{1.0} -\def\CM@date{2011/05/15} -\def\CM@name{chemmacros} -\ProvidesPackage{chemmacros}[\CM@date] -\typeout{\CM@name\space v\CM@version, \CM@date\space Clemens Niederberger} -\RequirePackage{xkeyval,amsmath,tikz} +\newcommand*\CM@version{1.1}% +\newcommand*\CM@date{2011/06/22}% +\newcommand*\CM@name{chemmacros}% +\NeedsTeXFormat{LaTeX2e}[2009/09/24]% +\ProvidesPackage{chemmacros}[2011/06/22 v1.1 chemistry macros]% +\RequirePackage{amsmath,tikz,xparse,ifthen,siunitx}% +\usetikzlibrary{calc}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - package options ------------------------------------------------------------------- % +% - ifs ------------------------------------------------------------------------------- % +\newif\if@CM@circled\@CM@circledfalse% +\newif\if@CM@german\@CM@germanfalse% +\newif\if@CM@xspace\@CM@xspacefalse% +\newif\if@CM@mhchemloaded\@CM@mhchemloadedfalse% +\newif\if@CM@chemstyleloaded\@CM@chemstyleloadedfalse% +\newif\if@CM@bpchemloaded\@CM@bpchemloadedfalse% +\newif\if@CM@bpchem\@CM@bpchemfalse% +\newif\if@CM@mychemistryloaded\@CM@mychemistryloadedfalse% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newif\if@circled\@circledtrue -\newif\if@mhchemloaded\@mhchemloadedfalse -\newif\if@xspaceloaded\@xspaceloadedfalse -\newif\if@siunitxloaded\@siunitxloadedfalse -\newif\if@chemstyleloaded\@chemstyleloadedfalse - -\define@boolkey+[CM]{chemmacros.sty}[CM@]{circled}{ - \ifCM@circled - \@circledtrue - \else - \@circledfalse - \fi -}{ - \PackageWarning{chemmacros}{option `circled' is not boolean} +% - package options ------------------------------------------------------------------- % +% circled: +\DeclareOption{circled}{% + \@CM@circledtrue% } -\define@key[CM]{chemmacros.sty}{xspace}{ - \def\CM@xspace@value{#1}% +% xspace: +\newcommand*\CM@xspace{} +\DeclareOption{xspace}{% + \@CM@xspacetrue% } -\ProcessOptionsX[CM] - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - tools ----------------------------------------------------------------------------- % -\def\CM@false{false}% -\def\CM@true{true}% -\def\CM@off{off}% -\def\CM@on{on}% -\def\CM@right{right}% -% Optional Argument Analysis ---------------------------------------------------------- % -% Prüfen ob #2 in #1 enthalten ist -% (das Makro ist eine Kopie von \CF@if@instr in chemfig.tex von Christian Tellechea) -\def\CM@if@instr#1#2{% - \def\CM@if@instr@i##1#2##2\@nil{\ifx\@empty##2\@empty\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}% - \CM@if@instr@i#1\@@nil#2\@nil% +% german: +\DeclareOption{german}{% + \@CM@germantrue% } -% Am ersten , splitten, #1 in #3 speichern, #2 in \CM@remainargs -% (das Makro ist eine Kopie von \CF@analyze@movearg in chemfig.tex von Christian Tellechea) -\def\CM@splitfirst#1,#2\@nil#3{% - \def#3{#1}\def\CM@remainargs{#2}% + +% bpchem: +\DeclareOption{bpchem}{ + \@CM@bpchemtrue } -% ein durch , in 3 Teile getrenntes Argument splitten -% (das Makro ist eine Abwandlung von \CF@analyze@movearg in chemfig.tex von Christian Tellechea) -\def\CM@splitarg#1{% - \CM@if@instr{#1}{,}{\expandafter\CM@splitfirst#1\@nil\CM@firstarg}{\def\CM@firstarg{#1}}% - \expandafter\CM@if@instr\expandafter{\CM@remainargs}{,}{\expandafter\CM@splitfirst\CM@remainargs\@nil\CM@secondarg}{\expandafter\def\expandafter\CM@secondarg\expandafter{\CM@remainargs}}% - \ifx\CM@remainargs\CM@secondarg\let\CM@thirdarg\@empty\else\expandafter\def\expandafter\CM@thirdarg\expandafter{\CM@remainargs}\fi% + +% unknown options: +\DeclareOption*{% + \PackageWarning{chemmacros}{Unknown option `\CurrentOption'}% } +\ProcessOptions\relax -\let\CM@xspace\empty% -\ifx\CM@xspace@value\CM@false\def\CM@xspace{}\fi% -\ifx\CM@xspace@value\CM@true% - \@ifpackageloaded{xspace}{}{\RequirePackage{xspace}} - \def\CM@xspace{\xspace}% +\if@CM@bpchem + \RequirePackage{bpchem} \fi -\ifx\CM@xspace@value\CM@off\def\CM@xspace{}\fi% -\ifx\CM@xspace@value\CM@on% - \@ifpackageloaded{xspace}{}{\RequirePackage{xspace}}% - \def\CM@xspace{\xspace}% + +\if@CM@xspace + \RequirePackage{xspace}% + \let\CM@xspace\xspace% \fi -\@ifpackageloaded{mhchem}{\@mhchemloadedtrue}{\@mhchemloadedfalse} -\@ifpackageloaded{siunitx}{\@siunitxloadedtrue}{\@siunitxloadedfalse} -\@ifpackageloaded{chemstyle}{\@chemstyleloadedtrue}{\@chemstyleloadedfalse} +\AtBeginDocument{% + \@ifpackageloaded{mhchem}{\@CM@mhchemloadedtrue}{\@CM@mhchemloadedfalse} + \@ifpackageloaded{chemstyle}{\@CM@chemstyleloadedtrue}{\@CM@chemstyleloadedfalse} + \@ifpackageloaded{bpchem}{\@CM@bpchemloadedtrue}{\@CM@bpchemloadedfalse} + \@ifpackageloaded{mychemistry}{\@CM@mychemistryloadedtrue}{\@CM@mychemistryloadedfalse} -\if@mhchemloaded% - \def\CM@atom#1{\cf{#1}}% -\else% - \def\CM@atom#1{\ensuremath{\text{#1}}}% -\fi + \if@CM@mhchemloaded + \newcommand*\CM@atom[1]{\cf{#1}}% + \else + \newcommand*\CM@atom[1]{\mbox{#1}}% + \fi + + \if@CM@circled + \let\CM@plus\oplus + \let\CM@minus\ominus + \else + \newcommand*\CM@plus{+}% + \newcommand*\CM@minus{-}% + \fi +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% - tools ----------------------------------------------------------------------------- % +% Test if #2 is part of #1 +% (the macro is a copy of chemfig's \CF@if@instr by Christian Tellechea) +\newcommand*\CM@ifinstr[2]{% + \def\CM@ifinstr@i##1#2##2\@nil{\ifx\@empty##2\@empty\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}% + \CM@ifinstr@i#1#2\@nil% +} + +% split at comma, save part before in #3, save part after in \CM@RemainStr +% (the macro is a copy of chemfig's \CF@analyze@movearg by Christian Tellechea) +\def\CM@split#1,#2\@nil#3{% + \def#3{#1}\def\CM@RemainStr{#2}% +} + +% Optional Argument Analysis ---------------------------------------------------------- % +\newcounter{CM@tmp@cnt} +\setcounter{CM@tmp@cnt}{0} +\newcounter{CM@splitting@cnt} +% empty \CM@arg@<num> +\newcommand*\CM@ClearArgs[1]{% + \whiledo{\value{CM@tmp@cnt}<#1}{% + \stepcounter{CM@tmp@cnt}% + \expandafter\let\csname CM@arg@\roman{CM@tmp@cnt}\endcsname\@empty% + }% + \setcounter{CM@tmp@cnt}{0}% +} +% split a list separated by commas into \CM@arg@<num>, number of arguments chosen by #2 +\newcommand*\CM@splitting[2]{% + \CM@ClearArgs{#2}% + \setcounter{CM@splitting@cnt}{#2-1}% + \def\CM@RemainStr{#1}% + \whiledo{\value{CM@tmp@cnt}<\value{CM@splitting@cnt}}{% + \expandafter\CM@ifinstr\expandafter{\CM@RemainStr}{,}{% + \stepcounter{CM@tmp@cnt}% + \expandafter\CM@split\CM@RemainStr\@nil\CM@tmp@name% + \expandafter\let\csname CM@arg@\roman{CM@tmp@cnt}\endcsname\CM@tmp@name% + }{% + \stepcounter{CM@tmp@cnt}% + \expandafter\let\csname CM@arg@\roman{CM@tmp@cnt}\endcsname\CM@RemainStr% + \let\CM@RemainStr\@empty% + \setcounter{CM@tmp@cnt}{\value{CM@splitting@cnt}}% + }% + }% + \stepcounter{CM@tmp@cnt}% + \expandafter\let\csname CM@arg@\roman{CM@tmp@cnt}\endcsname\CM@RemainStr% + \setcounter{CM@tmp@cnt}{0}% +} + +% check commands for equality --------------------------------------------------------- % +\newcommand*\CM@compareCs[2]{% + \expandafter\let\expandafter\CM@cs@one\csname#1\endcsname% + \expandafter\let\expandafter\CM@cs@two\csname#2\endcsname% + \ifx\CM@cs@one\CM@cs@two\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi +} + +% check strings for equality ---------------------------------------------------------- % +\newcommand*\CM@compareStr[2]{% + \edef\CM@cs@one{#1}% + \edef\CM@cs@two{#2}% + \ifx\CM@cs@one\CM@cs@two\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi +} -\if@circled% - \def\CM@plus{\oplus}% - \def\CM@minus{\ominus}% -\else% - \def\CM@plus{+}% - \def\CM@minus{-}% -\fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - particles, charges, other helpers ------------------------------------------------- % +% - particles, charges ---------------------------------------------------------------- % % electron -\def\el{\ensuremath{e^\CM@minus}\CM@xspace}% +\newcommand*\el{\ensuremath{e^\CM@minus}\CM@xspace} % proton -\def\prt{\ensuremath{p^\CM@plus}\CM@xspace}% +\newcommand*\prt{\ensuremath{p^\CM@plus}\CM@xspace} % charges -\def\mch{\@ifnextchar[{\mch@ii}{\mch@i}}% - \def\mch@i{\ensuremath{{}^{\CM@minus}}}% - \def\mch@ii[#1]{\ensuremath{{}^{#1\CM@minus}}}% -\def\pch{\@ifnextchar[{\pch@ii}{\pch@i}}% - \def\pch@i{\ensuremath{{}^{\CM@plus}}}% - \def\pch@ii[#1]{\ensuremath{{}^{#1\CM@plus}}}% -\def\delm{\ensuremath{\text{\tiny$\delta\CM@minus$}}\CM@xspace}% -\def\delp{\ensuremath{\text{\tiny$\delta\CM@plus$}}\CM@xspace}% -\def\scrm{\ensuremath{\scriptstyle\CM@minus}}% -\def\scrp{\ensuremath{\scriptstyle\CM@plus}}% +\newcommand*\mch[1][]{\ensuremath{{}^{#1\CM@minus}}} +\newcommand*\pch[1][]{\ensuremath{{}^{#1\CM@plus}}} +\newcommand*\delm{\mbox{\tiny$\delta\CM@minus$}\CM@xspace} +\newcommand*\delp{\mbox{\tiny$\delta\CM@plus$}\CM@xspace} +\newcommand*\scrm{\ensuremath{\scriptstyle\CM@minus}} +\newcommand*\scrp{\ensuremath{\scriptstyle\CM@plus}} % neutron -\def\ntr{\ensuremath{n^0}\CM@xspace}% +\newcommand*\ntr{\ensuremath{n^0}\CM@xspace} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - stereo descriptors ---------------------------------------------------------------- % +% - stereo descriptors and sim. ------------------------------------------------------- % % Cahn-Ingold-Prelog -\def\Rcip{\textit{(R)}}% -\def\Scip{\textit{(S)}}% -\def\cip#1{\textit{(#1)}}% -\def\Sconf{\@ifnextchar[{\sconf@ii}{\sconf@i}}% S-Konfiguration - \def\sconf@ii[#1]{\tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]{\draw node(a) at (0,0) {#1};\draw[->,thick,rotate=90] (20:.3cm) arc (20:340:.3cm);}}% - \def\sconf@i{\tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]{\draw node(a) at (0,0) {S};\draw[->,thick,rotate=90] (20:.3cm) arc (20:340:.3cm);}}% -\def\Rconf{\@ifnextchar[{\rconf@ii}{\rconf@i}}% R-Konfiguration - \def\rconf@ii[#1]{\tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]{\draw node(a) at (0,0) {#1};\draw[<-,thick,rotate=90] (20:.3cm) arc (20:340:.3cm);}}% - \def\rconf@i{\tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]{\draw node(a) at (0,0) {R};\draw[<-,thick,rotate=90] (20:.3cm) arc (20:340:.3cm);}}% -% E/Z -\def\E{\textit{(E)}}% -\def\Z{\textit{(Z)}}% -\def\cis{\textit{cis}}% -\def\trans{\textit{trans}}% +\newcommand*\Rcip{\textit{(R)}} +\newcommand*\Scip{\textit{(S)}} +\newcommand*\cip[1]{\textit{(#1)}} +\newcommand*\Sconf[1][S]{\tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]{\draw node(a) {#1};\draw[->,thick,rotate=90] ($(a.center)+(20:.8em)$) arc (20:340:.8em);}} +\newcommand*\Rconf[1][R]{\tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]{\draw node(a) {#1};\draw[<-,thick,rotate=90] ($(a.center)+(20:.8em)$) arc (20:340:.8em);}} +% E(ntgegen)/Z(usammen) +\newcommand*\E{\textit{(E)}} +\newcommand*\Z{\textit{(Z)}} +\AtBeginDocument{\if@CM@bpchemloaded + \renewcommand*\cis{\textit{cis}\CM@xspace} + \renewcommand*\trans{\textit{trans}\CM@xspace} + \else + \newcommand*\cis{\textit{cis}\CM@xspace} + \newcommand*\trans{\textit{trans}\CM@xspace} +\fi} +\newcommand*\tert{\textit{tert}\CM@xspace} % Fischer -\def\Dfi{\textsc{d}}% -\def\Lfi{\textsc{l}}% +\newcommand*\Dfi{\textsc{d}} +\newcommand*\Lfi{\textsc{l}} % ortho/meta/para -\def\ortho{\textsl{o}}% -\def\meta{\textsl{m}}% -\def\para{\textsl{p}}% +\newcommand*\ortho{\textsl{o}} +\newcommand*\meta{\textsl{m}} +\newcommand*\para{\textsl{p}} + +% latin phrases +\AtBeginDocument{\if@CM@chemstyleloaded + \newcommand*\insitu{\latin{in situ}\CM@xspace} + \newcommand*\abinitio{\latin{ab initio}\CM@xspace} +\else + \newcommand*\insitu{\textit{in situ}\CM@xspace} + \newcommand*\abinitio{\textit{ab initio}\CM@xspace} +\fi} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% - ions, molecules ------------------------------------------------------------------- % +% Proton, Hydroxide, Hydronium/Oxonium, water, nucleophile, electrophile +\newcommand*\Hpl{\CM@atom{H\pch}\CM@xspace} +\newcommand*\Hyd{\CM@atom{OH\mch}\CM@xspace} +\newcommand*\HtO{\CM@atom{H$_3$O\pch}\CM@xspace} +\newcommand*\water{\CM@atom{H$_2$O}\CM@xspace} +\newcommand*\Nu{\CM@atom{Nu\mch}\CM@xspace} +\newcommand*\El{\CM@atom{E\pch}\CM@xspace} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% - acid/base ------------------------------------------------------------------------- % +\newcommand*\pH{\mbox{\textsl{p}H}\CM@xspace} +\newcommand*\pOH{\mbox{\textsl{p}OH}\CM@xspace} +\newcommand*\pKa[1][]{\mbox{\textsl{p}$K_\mathrm{\if@CM@german S\else A\fi#1}$}\CM@xspace} +\newcommand*\pKb[1][]{\mbox{\textsl{p}$K_\mathrm{B#1}$}\CM@xspace} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% - substituents ---------------------------------------------------------------------- % +% \R[<sign>]{<subscript>} +\newcommand*\R[2][]{\CM@atom{R$_{\mathrm{#2}}^{\ifx#1+\CM@plus\else\ifx#1-\CM@minus\fi\fi}$}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - ions ------------------------------------------------------------------------------ % -% Proton, Hydroxid, Hydronium -\def\Hpl{\CM@atom{H$^\CM@plus$}\CM@xspace}% -\def\Hyd{\CM@atom{OH$^\CM@minus$}\CM@xspace}% -\def\HtO{\CM@atom{H$_3$O$^\CM@plus$}\CM@xspace}% +% - units ----------------------------------------------------------------------------- % +\DeclareSIUnit{\atm}{atm} +\DeclareSIUnit{\atmosphere}{atm} +\DeclareSIUnit{\calory}{cal} +\DeclareSIUnit{\cal}{cal} +\AtBeginDocument{\if@CM@chemstyleloaded\else + \DeclareSIUnit{\cmc}{\cubic\centi\metre} + \DeclareSIUnit{\molar}{\mole\per\cubic\deci\metre} + \DeclareSIUnit{\Molar}{\textsc{m}} +\fi} +\DeclareSIUnit{\moLar}{\mole\per\liter} +\DeclareSIUnit{\MolMass}{\gram\per\mole} +\DeclareSIUnit{\normal}{\textsc{n}} +\DeclareSIUnit{\torr}{torr} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% - reaction mechanisms --------------------------------------------------------------- % +% \mech[<type>] +% <type> - substitutions: {}, 1, 2, se, 1e, 2e, ar +% - eliminations: e, e1, e2, cb +\newcommand*\CM@Substitution[1][]{% + \CM@compareStr{#1}{se}{\def\CM@subst@mol{_\mathrm{E}}\let\CM@subst@ar\@empty}{% + \CM@compareStr{#1}{1e}{\def\CM@subst@mol{_\mathrm{E}1}\let\CM@subst@ar\@empty}{% + \CM@compareStr{#1}{2e}{\def\CM@subst@mol{_\mathrm{E}2}\let\CM@subst@ar\@empty}{% + \CM@compareStr{#1}{ar}{\def\CM@subst@mol{_\mathrm{E}}\def\CM@subst@ar{Ar-}}{% + \def\CM@subst@mol{_\mathrm{N}#1}\let\CM@subst@ar\@empty}}}}% + \CM@atom{\mbox{\CM@subst@ar S}$\CM@subst@mol$}\CM@xspace% +} +\newcommand*\CM@Elimination[1][]{% + \CM@compareStr{#1}{cb}{\def\CM@elim@mol{1_\mathrm{cb}}}{\def\CM@elim@mol{#1}}% + \CM@atom{E$\CM@elim@mol$}\CM@xspace% +} +\newcommand*\mech[1][]{% + \CM@compareStr{#1}{se}{\def\CM@mech@type{S}\def\CM@mech@mol{_\mathrm{E}}\let\CM@mech@ar\@empty}{% + \CM@compareStr{#1}{1e}{\def\CM@mech@type{S}\def\CM@mech@mol{_\mathrm{E}1}\let\CM@mech@ar\@empty}{% + \CM@compareStr{#1}{2e}{\def\CM@mech@type{S}\def\CM@mech@mol{_\mathrm{E}2}\let\CM@mech@ar\@empty}{% + \CM@compareStr{#1}{ar}{\def\CM@mech@type{S}\def\CM@mech@mol{_\mathrm{E}}\def\CM@mech@ar{Ar-}}{% + \CM@compareStr{#1}{e}{\def\CM@mech@type{E}\def\CM@mech@mol{}\let\CM@mech@ar\@empty}{% + \CM@compareStr{#1}{e1}{\def\CM@mech@type{E}\def\CM@mech@mol{1}\let\CM@mech@ar\@empty}{% + \CM@compareStr{#1}{e2}{\def\CM@mech@type{E}\def\CM@mech@mol{2}\let\CM@mech@ar\@empty}{% + \CM@compareStr{#1}{cb}{\def\CM@mech@type{E}\def\CM@mech@mol{1_\mathrm{cb}}\let\CM@mech@ar\@empty}{% + \def\CM@mech@type{S}\def\CM@mech@mol{_\mathrm{N}#1}\let\CM@mech@ar\@empty}}}}}}}}% + \CM@atom{\mbox{\CM@mech@ar\CM@mech@type}$\CM@mech@mol$}\CM@xspace% +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % - oxidation numbers ----------------------------------------------------------------- % % \ox{<number>,<atom>} -\def\CM@ox@sign#1{% - \ifx -#1{$-$}% - \else \ifx +#1{$+$}% +\newcommand*\CM@ox@sign[1]{% + \ifx -#1{$-$}% TODO: bad method here, do you see what happens if #1 is more than 1 token??? Use \@car to avoid the bug! + \else \ifx +#1{$+$}% TODO: bad method here, do you see what happens if #1 is more than 1 token??? Use \@car to avoid the bug! \else #1% \fi\fi% } -\def\ox#1{% - \let\CM@remainargs\@empty\CM@splitarg{#1}% - \ifx\CM@firstarg\@empty\PackageError{chemmacros}{\string\ox: oxidation number missing}\fi% - \ifx\CM@secondarg\@empty\PackageError{chemmacros}{\string\ox: atom missing}\fi% - \let\CM@thirdarg\@empty% - \ensuremath{\overset{\text{\tiny\expandafter\CM@ox@sign\CM@firstarg}}{\expandafter\CM@atom\expandafter{\CM@secondarg}}}% -}% +% I don't quite understand the problem: that macro is used ONLY in \ox (lines 286-291) where no other input than arabic or (more often) roman numbers with a sign make any sense at all (chemically speaking*). In these cases everything happens as it is supposed to: the signs are changed into the math ones but the letters/numbers stay as they are. I must confess I didn't test senseless cases... +%* And I would like to think that users who use a macro for oxidation numbers know what oxidation numbers are +\DeclareRobustCommand\ox[1]{% needs to be robust in order to be used in mhchem's \ce macro + \CM@splitting{#1}{2}% + \CM@compareCs{CM@arg@i}{@empty}{\PackageError{chemmacros}{\string\ox: oxidation number missing}{}}{}% + \CM@compareCs{CM@arg@ii}{@empty}{\PackageError{chemmacros}{\string\ox: atom missing}{}}{}% + \ensuremath{\overset{\mbox{\tiny\expandafter\CM@ox@sign\CM@arg@i}}{\expandafter\CM@atom\expandafter{\CM@arg@ii}}}% +} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % - oxidation arrows ------------------------------------------------------------------ % +% place and name nodes: % \OX{<name>,<atom>} -% \redox(<name1>,<name2>)[<tikz>][<dim>]{<text>} -% node setzen und benennen: -\def\OX#1{% - \let\CM@remainargs\@empty\CM@splitarg{#1}% - \ifx\CM@firstarg\@empty\PackageError{chemmacros}{\string\OX: node name missing}\fi% - \ifx\CM@secondarg\@empty\PackageError{chemmacros}{\string\OX: atom missing}\fi% - \let\CM@thirdarg\@empty% - \tikz[baseline=(\CM@firstarg.base),remember picture]{\node[inner sep=0](\CM@firstarg){\expandafter\CM@atom\expandafter{\CM@secondarg}};}% +\DeclareRobustCommand*\OX[1]{% needs to be robust in order to be used in mhchem's \ce macro + \CM@splitting{#1}{2}% + \CM@compareCs{CM@arg@i}{@empty}{\PackageError{chemmacros}{\string\OX: node name missing}{}}{}% + \CM@compareCs{CM@arg@i}{@empty}{\PackageError{chemmacros}{\string\OX: atom missing}{}}{}% + \tikz[baseline=(\CM@arg@i.base),remember picture]{\node[inner sep=0](\CM@arg@i){\expandafter\CM@atom\expandafter{\CM@arg@ii}};}% } -% nodes mit Linie verbinden: -\def\redox(#1){% - \let\CM@redox@tikz\@empty% - \let\CM@remainargs\@empty\CM@splitarg{#1}% - \ifx\CM@firstarg\@empty\PackageError{chemmacros}{\string\redox: you must specify coordinates}\fi% - \ifx\CM@secondarg\@empty\PackageError{chemmacros}{\string\redox: you must specify coordinates}\fi% - \let\CM@thirdarg\@empty% - \let\CM@redox@begin\CM@firstarg% - \let\CM@redox@end\CM@secondarg% - \redox@i% -} -\def\redox@i{\@ifnextchar[{\redox@ii}{\def\CM@redox@shift{.6em}\def\CM@redox@anchor{above}\def\CM@redox@side{north}\def\CM@redox@dist{.2em}\redox@v}} -\def\redox@ii[#1]{% - \ifx\@empty#1\@empty - \let\CM@redox@tikz\@empty% - \else% - \def\CM@redox@tikz{#1}% - \fi - \redox@iii% -} -\def\redox@iii{\@ifnextchar[{\redox@iv}{\def\CM@redox@shift{.6em}\def\CM@redox@anchor{above}\def\CM@redox@side{north}\def\CM@redox@dist{.2em}\redox@v}} -\def\redox@iv[#1]{% - \ifx\@empty#1\@empty% - \let\CM@redox@shift\@empty% - \else% - \pgfmathparse{#1<0} - \ifnum\pgfmathresult=1% - \def\CM@redox@anchor{below}\def\CM@redox@side{south}\def\CM@redox@dist{-.2em}% +% connect nodes with "redox"-line +% \redox(<name1>,<name2>)[<tikz>][<dim>]{<text>} +\newcommand*\CM@redox@dist{.6em} +\newcommand*\setredoxdist[1]{\ifx\@empty#1\@empty\renewcommand*\CM@redox@dist{.6em}\else\renewcommand*\CM@redox@dist{#1}\fi} +\NewDocumentCommand\redox{d()oom}{% + \IfNoValueTF{#1}{% + \PackageError{chemmacros}{\string\redox: You need to specify coordinates}{} + }{% + \CM@splitting{#1}{2}% + \let\CM@redox@begin\CM@arg@i% + \let\CM@redox@end\CM@arg@ii% + } + \IfNoValueTF{#2}{\def\CM@redox@tikz{}}{\def\CM@redox@tikz{#2}} + \IfNoValueTF{#3}{% + \def\CM@redox@shift{1}% + \def\CM@redox@anchor{above}% + \def\CM@redox@side{north}% + \def\CM@redox@sep{.2em}% + }{% + \pgfmathparse{#3<0}% TODO : You should learn to test if an integer is less than 0: \ifnum#1<\z@ +% #3 is not necessarily an integer. It is more likely real; if you know a way to test if '-.5' is less than 0 that's easier than \pgfmathparse, please let me know. + \ifnum\pgfmathresult=1 % + \def\CM@redox@anchor{below}\def\CM@redox@side{south}\def\CM@redox@sep{-.2em}% \else% - \def\CM@redox@anchor{above}\def\CM@redox@side{north}\def\CM@redox@dist{.2em}% + \def\CM@redox@anchor{above}\def\CM@redox@side{north}\def\CM@redox@sep{.2em}% \fi% - \def\CM@redox@shift{#1}% - \fi% - \redox@v% + \def\CM@redox@shift{#3}% + } + \tikz[remember picture,overlay]{\expandafter\draw\expandafter[\CM@redox@tikz] ($(\CM@redox@begin.\CM@redox@side)+(0,\CM@redox@sep)$) -- ++(0,\CM@redox@shift*\CM@redox@dist) -| node[pos=.25,\CM@redox@anchor]{#4} ($(\CM@redox@end.\CM@redox@side)+(0,\CM@redox@sep)$);}% } -\def\redox@v#1{% - \ifx\CM@redox@tikz\@empty\def\CM@redox@tikz{}\fi% - \ifx\CM@redox@shift\@empty\def\CM@redox@shift{.6em}\def\CM@redox@anchor{above}\fi% - \tikz[remember picture,overlay]{\expandafter\draw\expandafter[\CM@redox@tikz] ($(\CM@redox@begin.\CM@redox@side)+(0,\CM@redox@dist)$) -- ++(0,\CM@redox@shift) -| node[pos=.25,\CM@redox@anchor]{#1} ($(\CM@redox@end.\CM@redox@side)+(0,\CM@redox@dist)$);}% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% - spectroscopy ---------------------------------------------------------------------- % +% \NMR(<num>,<elem>)[<num>,<unit>]{<solvent>} ALL arguments are optional +% \NMR* same but without ": $\delta$" at end +\AtBeginDocument{ + \NewDocumentCommand\NMR{sG{1,H}d()o}{% + \IfBooleanTF{#1}{\let\CM@nmr@delta\@empty}{\ifmmode\def\CM@nmr@delta{\mbox{: }\delta}\else\def\CM@nmr@delta{: $\delta$}\fi}% + \CM@splitting{#2}{2}% + \let\CM@nmr@istp\CM@arg@i + \let\CM@nmr@elem\CM@arg@ii + \IfNoValueTF{#3}{% + \let\CM@nmr@spec\@empty + \let\CM@nmr@freq\@empty + }{% + \let\CM@nmr@spec\relax + \CM@splitting{#3}{2}% + \CM@compareCs{CM@arg@ii}{@empty}{\def\CM@nmr@unit{\mega\hertz}}{\def\CM@nmr@unit{\CM@arg@ii}}% + \def\CM@nmr@freq{\expandafter\SI\expandafter{\CM@arg@i}{\CM@nmr@unit}}% + }% + \IfNoValueTF{#4}{% + \let\CM@nmr@lm\@empty + \let\CM@nmr@comma\@empty + }{% + \let\CM@nmr@spec\relax + \def\CM@nmr@lm{\CM@atom{#4}}% + \CM@compareCs{CM@nmr@freq}{@empty}{\let\CM@nmr@comma\@empty}{\def\CM@nmr@comma{,\ifmmode\medspace\else\hspace{\smallskipamount}\fi}}% + }% + \CM@compareCs{CM@nmr@spec}{@empty}{}{% + \def\CM@nmr@spec{\hspace{\smallskipamount}(\CM@nmr@freq\CM@nmr@comma\CM@nmr@lm)}% + }% + \if@CM@bpchem + \ifmmode + \expandafter\text\expandafter{\IUPAC{\^{\CM@nmr@istp}\CM@nmr@elem-NMR}\CM@nmr@spec}\CM@nmr@delta + \else + \IUPAC{\^{\CM@nmr@istp}\CM@nmr@elem-NMR}\CM@nmr@spec\CM@nmr@delta\CM@xspace + \fi + \else + \ifmmode + ^{\CM@nmr@istp}\expandafter\CM@atom\expandafter{\CM@nmr@elem}\mbox{-}\text{NMR}\CM@nmr@spec\CM@nmr@delta + \else + $^{\CM@nmr@istp}$\expandafter\CM@atom\expandafter{\CM@nmr@elem}-NMR\CM@nmr@spec\CM@nmr@delta\CM@xspace + \fi + \fi + } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - reaction environments for mhchem -------------------------------------------------- % -\if@mhchemloaded - \RequirePackage{mathtools,environ} - \newtagform{CMreaction}{\{}{\}} - \newcounter{save@reaction}% - \newcounter{reaction}% - \def\CM@AtBeginReaction{\setcounter{save@reaction}{\value{equation}}\setcounter{equation}{\value{reaction}}\usetagform{CMreaction}}% - \def\CM@AtEndReaction{\setcounter{reaction}{\value{equation}}\setcounter{equation}{\value{save@reaction}}\usetagform{default}}% - % - \NewEnviron{reaction}{\CM@AtBeginReaction\begin{equation}\expandafter\ce\expandafter{\BODY}\end{equation}\CM@AtEndReaction} - \NewEnviron{reaction*}{\begin{equation*}\expandafter\ce\expandafter{\BODY}\end{equation*}} - % - \NewEnviron{reactions}{\CM@AtBeginReaction\begin{align}\expandafter\cee\expandafter{\BODY}\end{align}\CM@AtEndReaction} - \NewEnviron{reactions*}{\begin{align*}\expandafter\cee\expandafter{\BODY}\end{align*}} -\fi +% - for use with mhchem --------------------------------------------------------------- % +\AtBeginDocument{\if@CM@mhchemloaded +% placing text below atom/molecule + \newcommand*\CM@mhName@textattr@default{\centering\tiny}% +% \setmhName{<commands>} + \newcommand*\setmhName[1]{% + \ifx\@empty#1\@empty + \renewcommand*\CM@mhName@textattr@default{\centering\tiny}% + \else + \renewcommand*\CM@mhName@textattr@default{#1}% + \fi + } +% \mhName[<width>][<textattr>]{<formula>}{<text>} + \newlength{\CM@mhName@boxlength}% + \NewDocumentCommand\mhName{oomm}{% + \IfNoValueTF{#1}{% + \settowidth{\CM@mhName@boxlength}{#3}% + }{% + \ifx\@empty#1\@empty + \settowidth{\CM@mhName@boxlength}{#3}% + \else + \setlength{\CM@mhName@boxlength}{#1}% + \fi + }% + \IfNoValueTF{#2}{% + \let\CM@mhName@textattr\CM@mhName@textattr@default + }{% + \def\CM@mhName@textattr{#2} + } + \def\CM@mhName@formula{#3} + \ensuremath{\underset{\parbox{\CM@mhName@boxlength}{\CM@mhName@textattr#4}}{\expandafter\ce\expandafter{\CM@mhName@formula}}}% + } +% reaction environments for mhchem + \RequirePackage{mathtools,environ} + \newtagform{CMreaction}{\{}{\}} + \newcounter{save@reaction}% + \newcounter{reaction}% + \newcommand*\CM@AtBeginReaction{\setcounter{save@reaction}{\value{equation}}\setcounter{equation}{\value{reaction}}\usetagform{CMreaction}}% + \newcommand*\CM@AtEndReaction{\setcounter{reaction}{\value{equation}}\setcounter{equation}{\value{save@reaction}}\usetagform{default}}% +% \newreaction*+{<name>}{<type>} +% * and + are optional + \NewDocumentCommand\newreaction{st+mm}{% + \@ifundefined{#3}{% + \IfBooleanTF{#2}{% + \NewEnviron{#3}[1]{\CM@AtBeginReaction\begin{#4}{##1}\expandafter\cee\expandafter{\BODY}\end{#4}\CM@AtEndReaction} + \IfBooleanTF{#1}{% + \NewEnviron{#3*}[1]{\begin{#4*}{##1}\expandafter\cee\expandafter{\BODY}\end{#4*}}% + }{}% + }{% + \NewEnviron{#3}{\CM@AtBeginReaction\begin{#4}\expandafter\cee\expandafter{\BODY}\end{#4}\CM@AtEndReaction} + \IfBooleanTF{#1}{% + \NewEnviron{#3*}{\begin{#4*}\expandafter\cee\expandafter{\BODY}\end{#4*}}% + }{}% + }% + }{\PackageError{chemmacros}{The environment/command #3 is already defined}{}}% + } +% predefined: + \newreaction*{reaction}{equation}% + \newreaction*{reactions}{align}% +\fi} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% - phases ---------------------------------------------------------------------------- % +\newcommand*\solid[1][]{\ensuremath{_\mathrm{(\ifx\@empty#1\@empty\if@CM@german f\else s\fi\else#1\fi)}}} +\newcommand*\gas{\ensuremath{_\mathrm{(g)}}} +\newcommand*\liquid[1][]{\ensuremath{_\mathrm{(\ifx\@empty#1\@empty\if@CM@german f\/l\else l\fi\else#1\fi)}}} +\newcommand*\aq{\ensuremath{_\mathrm{(aq)}}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % - transition state symbol ----------------------------------------------------------- % -\def\transitionstatesymbol{\tikz[inner sep=0,outer sep=0,minimum size=0]{% - \coordinate (@TSa) at (0,0);% - \coordinate (@TSb) at (0,.6em);% - \draw(@TSa)--node[pos=.3333](@TSx){}node[pos=.6667](@TSy){}(@TSb);% +\AtBeginDocument{% +\newcommand*\CM@transition@state@symbol{\tikz[inner sep=0,outer sep=0,minimum size=0]{% + \draw(0,0)--node[pos=.3333](@TSx){}node[pos=.6667](@TSy){}(0,.6em);% \draw(@TSx)++(-.3em,0)--++(.6em,0);% \draw(@TSy)++(-.3em,0)--++(.6em,0);}% } +% make sure symbol scales correctly: +\if@CM@mychemistryloaded + \renewcommand*\transitionstatesymbol{\ifmmode\text{\CM@transition@state@symbol}\else\CM@transition@state@symbol\fi} +\else + \newcommand*\transitionstatesymbol{\ifmmode\text{\CM@transition@state@symbol}\else\CM@transition@state@symbol\fi} +\fi} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% - enthalpy, entropy ----------------------------------------------------------------- % -% \State[<exp>,<Delta>,right]{<Symbol>}{<Index>} -\def\State{\@ifnextchar[{\CM@state@ii}{\CM@state@i}}% - \def\CM@state@i#1#2{\ensuremath{\Delta_\mathrm{#2}#1\if@chemstyleloaded^\standardstate\fi}}% - \def\CM@state@ii[#1]#2#3{% - \let\CM@remainargs\@empty\CM@splitarg{#1}% - \ensuremath{\ifx\CM@secondarg\@empty\Delta\else\CM@secondarg\fi\ifx\CM@thirdarg\CM@right\else_\mathrm{#3}\fi#2\ifx\CM@thirdarg\CM@right_\mathrm{#3}\fi\ifx\CM@firstarg\@empty\if@chemstyleloaded^{\standardstate}\fi\else^{\CM@firstarg}\fi}% - }% +% - thermodynamics et.al. ------------------------------------------------------------- % +\AtBeginDocument{\if@CM@chemstyleloaded\else\newcommand*\standardstate{\circ}\fi -\if@siunitxloaded - \if@chemstyleloaded\else\def\standardstate{}\fi - \let\CM@standard@state@symbol\standardstate% - \def\setnewstate{\@ifnextchar[{\CM@setnewstate@ii}{\let\CM@current@standard@state@symbol\@empty\def\CM@state@delta{\Delta}\def\CM@state@kind@right{}\CM@setnewstate@i}}% - \def\CM@setnewstate@ii[#1]{% - \let\CM@remainargs\@empty\CM@splitarg{#1}% exp,Delta,right - \ifx\CM@firstarg\@empty\let\CM@current@standard@state@symbol\@empty\else\let\CM@current@standard@state@symbol\CM@firstarg\fi% - \ifx\CM@secondarg\@empty\def\CM@state@delta{\Delta}\else\let\CM@state@delta\CM@secondarg\fi% - \ifx\CM@thirdarg\CM@right\let\CM@state@kind@right\CM@right\else\def\CM@state@kind@right{}\fi% - \CM@setnewstate@i% - } - \def\CM@setnewstate@i#1#2#3{% - \ifx\CM@current@standard@state@symbol\@empty\let\CM@current@standard@state@symbol\standardstate\fi% - \expandafter\let\csname CM@#1@symbol\endcsname\CM@current@standard@state@symbol% - \expandafter\let\csname CM@#1@delta\endcsname\CM@state@delta% - \expandafter\def\csname#1\endcsname{\@ifnextchar[{\csname CM@#1@ii\endcsname}{\csname CM@#1@i\endcsname}}% - \expandafter\def\csname CM@#1@i\endcsname##1{\ensuremath{\State[\csname CM@#1@symbol\endcsname,\csname CM@#1@delta\endcsname]{#2}{}=\SI{##1}{#3}}}% - \expandafter\def\csname CM@#1@ii\endcsname[##1]##2{% - \let\CM@remainargs\@empty\CM@splitarg{##1}% index,exp,einheit - \let\CM@state@index\CM@firstarg% - \let\CM@state@symbol\CM@secondarg% - \let\CM@state@unit\CM@thirdarg% - \ensuremath{\State[\CM@state@symbol,\csname CM@#1@delta\endcsname]{#2}{\CM@state@index} = \SI{##2}{\ifx\CM@state@unit\@empty#3\else\CM@state@unit\fi}}% +% \setstatesubscript{right/left} +\newcommand*\CM@State@subscript{left} +\newcommand*\setstatesubscript[1]{% + \renewcommand*\CM@State@subscript{\ifx\relax#1\relax left\else#1\fi} +} + +% \State[<exp>,<Delta>,<subscript pos>]{<Symbol>}{<Index>} +% {<Index>} is an optional argument! +\NewDocumentCommand\State{omG{}}{% + \IfNoValueTF{#1}{\CM@splitting{}{3}}{\CM@splitting{#1}{3}}% + \ensuremath{% + \CM@compareCs{CM@arg@iii}{@empty}{% + \CM@compareStr{\CM@State@subscript}{right}{\let\CM@State@sub@left\@empty\def\CM@State@sub@right{_\mathrm{#3}}}{\let\CM@State@sub@right\@empty\def\CM@State@sub@left{_\mathrm{#3}}}% + }{ + \CM@compareStr{\CM@arg@iii}{right}{\let\CM@State@sub@left\@empty\def\CM@State@sub@right{_\mathrm{#3}}}{% + \CM@compareStr{\CM@arg@iii}{left}{\let\CM@State@sub@right\@empty\def\CM@State@sub@left{_\mathrm{#3}}}{% + \PackageWarning{chemmacros}{\string\State: <subscript pos> can only have the values 'left' or 'right'}{}% + } }% - }% - \setnewstate{Enthalpy}{H}{\kilo\joule\per\mole}% - \setnewstate[, ]{Entropy}{S}{\joule\per\kelvin\per\mole}% - \setnewstate{Gibbs}{G}{\kilo\joule\per\mole}% -\fi% + }% + \CM@compareCs{CM@arg@ii}{@empty}{\Delta}{\CM@arg@ii}\CM@State@sub@left#2\CM@State@sub@right% + \CM@compareCs{CM@arg@i}{@empty}{^{\standardstate}}{^{\CM@arg@i}}}% +} + +% \setnewstate[<exp>,<Delta>,<subscript pos>]{<command>}{<letter>}{<unit>} +% \renewstate[<exp>,<Delta>,<subscript pos>]{<command>}{<letter>}{<unit>} +\newcommand*\CM@setnewstate[4][]{% + \CM@splitting{#1}{3}% [<exp>,<Delta>,<subscript pos>] + \CM@compareCs{CM@arg@i}{@empty}{\expandafter\let\csname CM@#2@supscript\endcsname\standardstate}{\expandafter\let\csname CM@#2@supscript\endcsname\CM@arg@i}% + \CM@compareCs{CM@arg@ii}{@empty}{\expandafter\let\csname CM@#2@delta\endcsname\Delta}{\expandafter\let\csname CM@#2@delta\endcsname\CM@arg@ii} + \CM@compareCs{CM@arg@iii}{@empty}{\@namedef{CM@#2@right}{left}}{\expandafter\let\csname CM@#2@right\endcsname\CM@arg@iii}% + \@namedef{#2}{\@ifnextchar[{\@nameuse{CM@#2@ii}}{\@nameuse{CM@#2@i}}}% + \@namedef{CM@#2@i}##1{\ensuremath{\State[\@nameuse{CM@#2@supscript},\@nameuse{CM@#2@delta},\@nameuse{CM@#2@right}]{#3}{}=\SI{##1}{#4}}}% + \@namedef{CM@#2@ii}[##1]##2{% + \CM@splitting{##1}{4}% [<index>,<exp>,<unit>,<subscript pos>] + \let\CM@State@index\CM@arg@i + \CM@compareCs{CM@arg@ii}{@empty}{\def\CM@State@supscript{\@nameuse{CM@#2@supscript}}}{\let\CM@State@supscript\CM@arg@ii}% + \CM@compareCs{CM@arg@iii}{@empty}{\def\CM@State@unit{#4}}{\let\CM@State@unit\CM@arg@iii}% + \CM@compareCs{CM@arg@iv}{@empty}{\def\CM@State@right{\@nameuse{CM@#2@right}}}{\let\CM@State@right\CM@arg@iv}% + \ensuremath{\State[\CM@State@supscript,\@nameuse{CM@#2@delta},\CM@State@right]{#3}{\CM@State@index} = \SI{##2}{\CM@State@unit}}% + }% +} +\newcommand*\setnewstate[4][]{% + \@ifundefined{#2}{\CM@setnewstate[#1]{#2}{#3}{#4}}{\PackageError{chemmacros}{\string\setnewstate: state #2 is already defined}{}}% +} +\newcommand*\renewstate[4][]{% + \@ifundefined{#2}{\PackageError{chemmacros}{\string\renewstate: state #2 is not defined}{}}{\CM@setnewstate[#1]{#2}{#3}{#4}}% +} +\setnewstate{Enthalpy}{H}{\kilo\joule\per\mole}% +\setnewstate[, ]{Entropy}{S}{\joule\per\kelvin\per\mole}% +\setnewstate{Gibbs}{G}{\kilo\joule\per\mole}% +} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % - p-orbitals ------------------------------------------------------------------------ % -% \phorb[<size factor>,<color>,<angle>] -\def\CM@phorb{\@ifnextchar[{\CM@phorb@ii}{\let\CM@firstarg\@empty\let\CM@secondarg\@empty\let\CM@thirdarg\@empty\CM@phorb@i}} -\def\CM@phorb@ii[#1]{\let\CM@remainargs\@empty\CM@splitarg{#1}\CM@phorb@i} -\def\CM@phorb@i{ - \ifx\CM@firstarg\@empty\def\CM@orb@flip{1.5*\CM@orb@height}\else\def\CM@orb@flip{\CM@firstarg*1.5*\CM@orb@height}\fi - \ifx\CM@secondarg\@empty\def\CM@orb@color{black}\else\def\CM@orb@color{\CM@secondarg}\fi - \ifx\CM@thirdarg\@empty\def\CM@orb@ang{0}\else\def\CM@orb@ang{\CM@thirdarg}\fi - \tikzpicture[overlay,rotate={\CM@orb@ang-90},opacity=.5,inner sep=0pt,outer sep=0pt,text height=0pt,text depth=0pt] - \pgfsetfillopacity{.5} - \node(\CM@orb@node){}; - \draw[draw=\CM@orb@color,fill=\CM@orb@color] (\CM@orb@node) .. controls ++(-.9*\CM@orb@height,\CM@orb@flip) and ++(.9*\CM@orb@height,\CM@orb@flip) .. (\CM@orb@node); - \endtikzpicture +\newcommand*\CM@porb[1][]{% + \CM@splitting{#1}{3}% + \CM@compareCs{CM@arg@i}{@empty}{\let\CM@orbital@height\CM@orb@height}{\def\CM@orbital@height{\CM@arg@i*\CM@orb@height}}% + \CM@compareCs{CM@arg@ii}{@empty}{\def\CM@orb@color{black}}{\let\CM@orb@color\CM@arg@ii}% + \CM@compareStr{\CM@orb@color}{white}{\def\CM@orb@color@draw{black}}{\let\CM@orb@color@draw\CM@orb@color}% + \CM@compareCs{CM@arg@iii}{@empty}{\def\CM@orb@ang{0}}{\let\CM@orb@ang\CM@arg@iii}% + \tikzpicture[overlay,rotate={\CM@orb@ang-90},opacity=.5,inner sep=0pt,outer sep=0pt,text height=0pt,text depth=0pt]% + \pgfsetfillopacity{.5}% + \CM@compareStr{\CM@orb@half}{false}{% + \draw[draw=black] (0,0) .. controls ++(-.9*\CM@orbital@height,-1.5*\CM@orbital@height) and ++(.9*\CM@orbital@height,-1.5*\CM@orbital@height) .. (0,0);% + }{}% + \draw[draw=\CM@orb@color@draw,fill=\CM@orb@color] (0,0) .. controls ++(-.9*\CM@orbital@height,1.5*\CM@orbital@height) and ++(.9*\CM@orbital@height,1.5*\CM@orbital@height) .. (0,0);% + \endtikzpicture% } -\def\phorb{\CM@phorb} - +% full orbital: % \porb[<size factor>,<color>,<angle>] -\def\CM@porb{\@ifnextchar[{\CM@porb@ii}{\let\CM@firstarg\@empty\let\CM@secondarg\@empty\let\CM@thirdarg\@empty\CM@porb@i}} -\def\CM@porb@ii[#1]{\let\CM@remainargs\@empty\CM@splitarg{#1}\CM@porb@i} -\def\CM@porb@i{ - \ifx\CM@firstarg\@empty\def\CM@orb@flip{1.5*\CM@orb@height}\else\def\CM@orb@flip{\CM@firstarg*1.5*\CM@orb@height}\fi - \ifx\CM@secondarg\@empty\def\CM@orb@color{black}\else\def\CM@orb@color{\CM@secondarg}\fi - \ifx\CM@thirdarg\@empty\def\CM@orb@ang{0}\else\def\CM@orb@ang{\CM@thirdarg}\fi - \tikzpicture[overlay,rotate={\CM@orb@ang-90},opacity=.5,inner sep=0pt,outer sep=0pt,text height=0pt,text depth=0pt] - \pgfsetfillopacity{.5} - \node(\CM@orb@node){}; - \draw[draw=black] (\CM@orb@node) .. controls ++(-.9*\CM@orb@height,\CM@orb@flip) and ++(.9*\CM@orb@height,\CM@orb@flip) .. (\CM@orb@node); - \draw[draw=\CM@orb@color,fill=\CM@orb@color] (\CM@orb@node) .. controls ++(-.9*\CM@orb@height,-\CM@orb@flip) and ++(.9*\CM@orb@height,-\CM@orb@flip) .. (\CM@orb@node); - \endtikzpicture -} -\def\porb{\CM@porb} +\newcommand*\porb{\def\CM@orb@half{false}\CM@porb}% +% half of an orbital: +% \phorb[<size factor>,<color>,<angle>] +\newcommand*\phorb{\def\CM@orb@half{true}\CM@porb}% -\def\CM@orb@node{x} -\def\CM@orb@height{1em} -\def\setorbheight#1{ +% predefined orbitals: +\newcommand*\pzorb{\porb[,,90]}% +\newcommand*\pyorb{\porb[,,0]}% +\newcommand*\pxorb{\porb[,,-135]}% + +% change orbital settings: +\newcommand*\CM@orb@height{1em}% +\newcommand*\setorbheight[1]{% \ifx\@empty#1\@empty - \def\CM@orb@height{1em} + \renewcommand*\CM@orb@height{1em}% \else - \def\CM@orb@height{#1} + \renewcommand*\CM@orb@height{#1}% \fi } -\def\pzorb{\porb[,,90]} -\def\pyorb{\porb[,,0]} -\def\pxorb{\porb[,,-135]} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % - Newman projections ---------------------------------------------------------------- % -\let\CM@newman@tikz@ring\@empty% -\let\CM@newman@tikz@one\@empty% -\let\CM@newman@tikz@two\@empty% -\def\newman{\@ifnextchar[{\CM@newman@ii}{\def\CM@newman@angle{0}\def\CM@newman@scale{1}\let\CM@newman@tikz@ring\@empty\let\CM@newman@tikz@one\@empty\let\CM@newman@tikz@two\@empty\CM@newman@i}}% -\def\CM@newman@ii[#1]{% - \let\CM@remainargs\@empty\CM@splitarg{#1}% - \ifx\CM@firstarg\@empty\def\CM@newman@angle{0}\else\let\CM@newman@angle\CM@firstarg\fi% - \ifx\CM@secondarg\@empty\def\CM@newman@scale{1}\else\let\CM@newman@scale\CM@secondarg\fi% - \ifx\CM@thirdarg\@empty\let\CM@newman@tikz@ring\else\let\CM@newman@tikz@ring\CM@thirdarg\fi% - \CM@newman@iii% -} -\def\CM@newman@iii{\@ifnextchar[{\CM@newman@iv}{\CM@newman@i}} -\def\CM@newman@iv[#1]{% - \ifx\@empty#1\@empty\let\CM@newman@tikz@one\@empty\else\edef\CM@newman@tikz@one{#1}\fi% - \let\CM@newman@tikz@two\CM@newman@tikz@one% - \CM@newman@v% -} -\def\CM@newman@v{\@ifnextchar[{\CM@newman@vi}{\CM@newman@i}} -\def\CM@newman@vi[#1]{% - \ifx\@empty#1\@empty\else\edef\CM@newman@tikz@two{#1}\fi% - \CM@newman@i% -} -\def\CM@newman@i#1{% - \let\CM@remainargs\@empty\CM@splitarg{#1}% - \ifx\CM@firstarg\@empty\let\CM@newman@node@one\@empty\else\let\CM@newman@node@one\CM@firstarg\fi% - \ifx\CM@secondarg\@empty\let\CM@newman@node@two\CM@newman@tikz@one\else\let\CM@newman@node@two\CM@secondarg\fi% - \let\CM@remainargs\@empty% - \expandafter\CM@splitarg\expandafter{\CM@thirdarg}% - \ifx\CM@firstarg\@empty\let\CM@newman@node@three\@empty\else\let\CM@newman@node@three\CM@firstarg\fi% - \ifx\CM@secondarg\@empty\let\CM@newman@node@four\@empty\else\let\CM@newman@node@four\CM@secondarg\fi% - \let\CM@remainargs\@empty% - \expandafter\CM@splitarg\expandafter{\CM@thirdarg}% - \ifx\CM@firstarg\@empty\let\CM@newman@node@five\@empty\else\let\CM@newman@node@five\CM@firstarg\fi% - \ifx\CM@secondarg\@empty\let\CM@newman@node@six\@empty\else\let\CM@newman@node@six\CM@secondarg\fi% - \let\CM@thirdarg\@empty% - \edef\CM@newman@tikz{scale=\CM@newman@scale,atomF/.style={inner sep=0,outer sep=0,\CM@newman@tikz@one},atomB/.style={inner sep=0,outer sep=0,\CM@newman@tikz@two}} - \expandafter\tikz\expandafter[\CM@newman@tikz]{% - \coordinate (a) at (0,0); - \expandafter\draw\expandafter[\CM@newman@tikz@ring] (a) circle (.5); - \foreach\i in{30+\CM@newman@angle,150+\CM@newman@angle,270+\CM@newman@angle} - {\expandafter\draw\expandafter[\CM@newman@tikz@ring] ($(a)+(\i:0.5)$) --++(\i:.5);} - \node[atomB,anchor=-150+\CM@newman@angle] at ($(a)+(30+\CM@newman@angle:1.05)$) {\CM@newman@node@five}; - \node[atomB,anchor=-30+\CM@newman@angle] at ($(a)+(150+\CM@newman@angle:1.05)$){\CM@newman@node@six}; - \node[atomB,anchor=90+\CM@newman@angle] at ($(a)+(270+\CM@newman@angle:1.05)$){\CM@newman@node@four}; - \foreach\i in{90,210,330} - {\expandafter\draw\expandafter[\CM@newman@tikz@ring] (a) --++(\i:1);} - \node[atomF,anchor=-90] at ($(a)+(90:1.05)$) {\CM@newman@node@one}; - \node[atomF,anchor=30] at ($(a)+(210:1.05)$){\CM@newman@node@two}; - \node[atomF,anchor=150] at ($(a)+(330:1.05)$){\CM@newman@node@three}; +% \newman[<angle>,<scale>,<tikz ring>][<tikz (front) nodes>][<tikz back nodes>]{<1>,<2>,<3>,<4>,<5>,<6>} +\NewDocumentCommand\newman{ooom}{% + \IfNoValueTF{#1}{% + \def\CM@newman@angle{0}% + \def\CM@newman@scale{1}% + \def\CM@newman@tikz@ring{}% + }{% + \CM@splitting{#1}{3}% + \CM@compareCs{CM@arg@i}{@empty}{\def\CM@newman@angle{0}}{\let\CM@newman@angle\CM@arg@i}% + \CM@compareCs{CM@arg@ii}{@empty}{\def\CM@newman@scale{1}}{\let\CM@newman@scale\CM@arg@ii}% + \expandafter\def\expandafter\CM@newman@tikz@ring\expandafter{\CM@arg@iii}% + } + \IfNoValueTF{#2}{% + \let\CM@newman@tikz@one\@empty% + }{% + \def\CM@newman@tikz@one{#2}% } + \IfNoValueTF{#3}{% + \let\CM@newman@tikz@two\CM@newman@tikz@one% + }{% + \def\CM@newman@tikz@two{#3}% + } + \CM@splitting{#4}{6}% + \edef\CM@newman@tikz{scale=\CM@newman@scale,CMatomFront/.style={inner sep=0,outer sep=0,\CM@newman@tikz@one},CMatomBack/.style={inner sep=0,outer sep=0,\CM@newman@tikz@two}} + \expandafter\tikz\expandafter[\CM@newman@tikz]{% + \expandafter\draw\expandafter[\CM@newman@tikz@ring] (0,0) circle (.5);% + \foreach\i in{30+\CM@newman@angle,150+\CM@newman@angle,270+\CM@newman@angle}{% + \expandafter\draw\expandafter[\CM@newman@tikz@ring] (\i:0.5) --++(\i:.5);% + }% + \node[CMatomBack,anchor=-150+\CM@newman@angle] at (30+\CM@newman@angle:1.05) {\CM@arg@v};% + \node[CMatomBack,anchor=-30+\CM@newman@angle] at (150+\CM@newman@angle:1.05) {\CM@arg@vi};% + \node[CMatomBack,anchor=90+\CM@newman@angle] at (270+\CM@newman@angle:1.05) {\CM@arg@iv};% + \foreach\i in{90,210,330}{% + \expandafter\draw\expandafter[\CM@newman@tikz@ring] (0,0) --++(\i:1);% + }% + \node[CMatomFront,anchor=-90] at (90:1.05) {\CM@arg@i};% + \node[CMatomFront,anchor=30] at (210:1.05) {\CM@arg@ii};% + \node[CMatomFront,anchor=150] at (330:1.05) {\CM@arg@iii};% + }% } - -\endinput
\ No newline at end of file +\endinput +% - Version history: ------------------------------------------------------------------ % +% 2011/05/15 version 1.0 CTAN release % +% 2011/06/22 version 1.1 "LaTeXified" whole package for safer usage % +% less user work required (like loading package after another) % +% more particle macros % +% latin phrases % +% extra units % +% acid/base commands % +% \mech % +% \NMR % +% \mhName, \setmhName, \newreaction, phases % +% \renewstate, \setstatesubscript % +% improved orbitals % +% simpler package options, option german, bpchem % +% bug fixes %
\ No newline at end of file |