From 9ed2be15b632f76247ead6f36a0cbc913057fa48 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Fri, 22 May 2020 03:00:58 +0000 Subject: CTAN sync 202005220300 --- macros/generic/chemfig/README | 4 +- macros/generic/chemfig/chemfig-en.pdf | Bin 1087404 -> 1088180 bytes macros/generic/chemfig/chemfig-en.tex | 3 + macros/generic/chemfig/chemfig-fr.pdf | Bin 1115715 -> 1116252 bytes macros/generic/chemfig/chemfig-fr.tex | 3 + macros/generic/chemfig/chemfig.tex | 24 +- macros/generic/chemfig/chemfigold.tex | 2835 --------------------------------- 7 files changed, 23 insertions(+), 2846 deletions(-) delete mode 100644 macros/generic/chemfig/chemfigold.tex (limited to 'macros/generic') diff --git a/macros/generic/chemfig/README b/macros/generic/chemfig/README index 1068cd4dce..ab9a6ebfd6 100644 --- a/macros/generic/chemfig/README +++ b/macros/generic/chemfig/README @@ -2,9 +2,9 @@ ___________________________________ The Chemfig package - v1.53 + v1.54 - 2020/04/27 + 2020/05/21 ___________________________________ Maintainer: Christian Tellechea diff --git a/macros/generic/chemfig/chemfig-en.pdf b/macros/generic/chemfig/chemfig-en.pdf index 1e5152ae55..3a3df880ef 100644 Binary files a/macros/generic/chemfig/chemfig-en.pdf and b/macros/generic/chemfig/chemfig-en.pdf differ diff --git a/macros/generic/chemfig/chemfig-en.tex b/macros/generic/chemfig/chemfig-en.tex index 8d29f8403a..3c6797732b 100644 --- a/macros/generic/chemfig/chemfig-en.tex +++ b/macros/generic/chemfig/chemfig-en.tex @@ -217,6 +217,9 @@ \setitemize{leftmargin=3em,topsep=0pt,parsep=0pt,itemsep=0pt} \part{Introduction} \section{New in v1.5} +\subsection{The primitive \texttt{\protect\textbackslash expanded}} +As of version 1.54, \CF requires a \TeX{} engine that provides the \verb|\expanded| primitive. If this is not available, \CF will not be loaded. It is strongly recommended that you update your \LaTeX{} distribution in order to take advantage of the newer engine that provide for the use of this new primitive. + \subsection{The macro \texttt{\protect\textbackslash charge}} Version 1.5 implements the macros \verb|\charge| and \verb|\Charge| (see page~\pageref{charge}) whose purpose is to place arbitrary elements around an atom that can be placed with great precision. These macros will replace the \verb|\lewis| and \verb|\Lewis| macros because they are much more powerful and configurable, even if more verbose. It is therefore important to note that the macros \verb|\lewis| and \verb|\Lewis| \textcolor{red}{\bfseries are no longer documented and will be removed from the \CF package}. diff --git a/macros/generic/chemfig/chemfig-fr.pdf b/macros/generic/chemfig/chemfig-fr.pdf index fd399ee621..14d02f6fba 100644 Binary files a/macros/generic/chemfig/chemfig-fr.pdf and b/macros/generic/chemfig/chemfig-fr.pdf differ diff --git a/macros/generic/chemfig/chemfig-fr.tex b/macros/generic/chemfig/chemfig-fr.tex index 392f6dd8f8..e15417157e 100644 --- a/macros/generic/chemfig/chemfig-fr.tex +++ b/macros/generic/chemfig/chemfig-fr.tex @@ -217,6 +217,9 @@ \setitemize{leftmargin=3em,topsep=0pt,parsep=0pt,itemsep=0pt,label=--} \part{Introduction} \section{Nouveau dans la v1.5} +\subsection{Primitive \texttt{\protect\textbackslash expanded}} +À partir de la version 1.54, \CF nécessite un moteur \TeX{} fournissant la primitive \texttt{\string\expanded}. Si ce n'est pas le cas, le package \CF ne sera pas chargé : il est donc vivement conseillé de mettre à jour sa distribution \LaTeX{} afin de profiter d'un moteur récent permettant l'utilisation de cette nouvelle primitive. + \subsection{La macro \texttt{\protect\textbackslash charge}} La version 1.5 met en place les macros \verb|\charge| et \verb|\Charge| (voir page~\pageref{charge}) dont le but est de placer atour d'un atome des éléments arbitraires avec une grande précision. Ces macros remplaceront, à terme, les macros \verb|\lewis| et \verb|\Lewis| car elles sont bien plus puissantes et configurables, même si plus verbeuses quant à leur emploi. Il est donc important de noter que les macros \verb|\lewis| et \verb|\Lewis| \textcolor{red}{\bfseries ne sont plus documentées et seront supprimées de l'extension \CF}. diff --git a/macros/generic/chemfig/chemfig.tex b/macros/generic/chemfig/chemfig.tex index 3764ace94d..69e966ba31 100644 --- a/macros/generic/chemfig/chemfig.tex +++ b/macros/generic/chemfig/chemfig.tex @@ -4,9 +4,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\CFname {chemfig} % -\def\CFver {1.53} % +\def\CFver {1.54} % % % -\def\CFdate {2020/04/27} % +\def\CFdate {2020/05/21} % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -33,8 +33,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% P R É A L A B L E %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\csname CFloadonce\endcsname +\let\CFloadonce\endinput %-------------------------- Annonce package -------------------------- -\ifdefined\ProvidesPackage\else +\ifdefined\CFfromsty\else \immediate\write -1 {% Package: \CFname\space\CFdate\space\space v\CFver\space\space Draw molecule with an easy syntax (CT)}% @@ -60,16 +62,16 @@ \endgroup \ifx\__tempa\__tempb\else \CF_error{#2}% - \def\CF_temp{#3}% - \CFrestorecatcode\expandafter\CF_temp + \def\CF_temp{\CFrestorecatcode#3}% + \expandafter\CF_temp \fi } \CF_checkprimitive\eTeXversion {You are not using an eTeX engine, \CFname\space cannot work.} {\endinput}% \CF_checkprimitive\expanded - {the \string\expanded\space primitive is not provided by your TeX engine, \CFname\space v\CFver\space cannot work: loading \CFname\space v1.4} - {\input chemfigold.tex\relax\endinput}% + {the \string\expanded\space primitive is not provided by your TeX engine, \CFname\space cannot work.} + {\endinput}% %------------------------ Chargement simplekv ------------------------ \input simplekv.tex @@ -1751,7 +1753,7 @@ \def\charge_d#1={% \CF_ifx\CF_quark{#1}% {} - {\CF_striplastsp{#1}\charge_e}=% + {\CF_striplastsp{#1}\charge_e=}% bugfix 1.54 } \def\charge_e#1={% \CF_ifinstr{#1}[ @@ -3075,4 +3077,8 @@ v1.52 2020/04/14 v1.53 2020/04/27 - mise à jour en fonction des nouvelles fonctionnalités de l'extension simplekv - - bug : \CF_ifzerodim interrompt maintenant le tracé dans la \hbox \ No newline at end of file + - bug : \CF_ifzerodim interrompt maintenant le tracé dans la \hbox +---------------------------------------------------------------------- +v1.54 2020/05/21 + - chemfig ne peut plus fonctionner sans \expanded + - bug : un signe "=" laissé par erreur dans le flux \ No newline at end of file diff --git a/macros/generic/chemfig/chemfigold.tex b/macros/generic/chemfig/chemfigold.tex deleted file mode 100644 index a7826763ca..0000000000 --- a/macros/generic/chemfig/chemfigold.tex +++ /dev/null @@ -1,2835 +0,0 @@ -% !TeX encoding = ISO-8859-1 -% Ce fichier contient le code de l'extension "chemfig" -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -\def\CFname {chemfig} % -\def\CFver {1.4} % -% % -\def\CFdate {2019/04/18} % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -%____________________________________________________________________ -% Author : Christian Tellechea | -% Status : Maintained | -% Email : unbonpetit@netc.fr | -% Package URL: https://www.ctan.org/pkg/chemfig | -% Bug tracker: https://framagit.org/unbonpetit/chemfig/issues | -% Repository : https://framagit.org/unbonpetit/chemfig/tree/master | -% Copyright : Christian Tellechea 2010-2019 | -% Licence : Released under the LaTeX Project Public License v1.3c | -% or later, see http://www.latex-project.org/lppl.txt | -% Files : 1) chemfig.tex | -% 2) chemfig.sty | -% 3) t-chemfig.tex | -% 4) README | -% 5) chemfig_doc_fr.tex | -% 6) chemfig_doc_fr.pdf | -% 7) chemfig_doc_en.tex | -% 8) chemfig_doc_fr.pdf | -%-------------------------------------------------------------------- - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% P R É A L A B L E %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%-------------------------- Annonce package -------------------------- -\ifdefined\ProvidesPackage\else - \immediate\write -1 {% - Package: \CFname\space\CFdate\space\space v\CFver\space\space - Draw molecule with an easy syntax (CT)}% -\fi - -%------------------------- Vérification etex ------------------------- -\begingroup - \edef\CFtempa{\meaning\eTeXversion} - \edef\CFtempb{\string\eTeXversion} - \let\CFtemp\endgroup - \unless\ifx\CFtempa\CFtempb - \errmessage{Package \CFname\space Error: you are not using an eTeX engine, chemfig cannot work.}% - \def\CFtemp{\endgroup\endinput}% - \fi -\CFtemp - -%------------------------ Chargement simplekv ------------------------ -\unless\ifdefined\skvname - \begingroup\def\CFtemp{\endgroup\input simplekv.tex\relax}% - \expandafter\CFtemp -\fi - -%-------------------------- Chargement tikz -------------------------- -\unless\ifdefined\tikzpicture - \begingroup\def\CFtemp{\endgroup\input tikz.tex\relax}% - \expandafter\CFtemp -\fi -\usetikzlibrary{arrows.meta} - -%-------------------------- Régime catcodes -------------------------- -\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 - -%--------------------------- Allocations ----------------------------- -\newcount\CF_cntatomgroup -\newcount\CF_cntgroup -\newcount\CF_cntatom -\newcount\CF_cntcycle -\newcount\CF_cntcompound - -\newif\ifCF_incycle -\newif\ifCF_cyclearc -\newif\ifCF_definesubmol -\newif\ifCF_adjustnamedp -\newif\ifCF_macrofixedbondlength -\newif\ifCF_lewisoverlay - -\newdimen\CF_dim -\newdimen\CF_arrowsize -\newdimen\CF_zero \CF_zero=0pt - -\newbox\CF_boxlewis -\newbox\CF_box -\newbox\CF_boxstuff - -\newtoks\CF_substtoks - -%-------------------------- Petites macros --------------------------- -\let\CF_begintikzpicture\tikzpicture -\let\CF_endtikzpicture \endtikzpicture -\def\CF_quark{\CF_quark} -\def\CF_execfirst#1#2{#1} -\def\CF_execsecond#1#2{#2} -\def\CF_id#1{#1} -\def\CF_gobarg#1{} -\def\CF_gobtwoargs#1#2{} -\def\CF_firsttonil#1#2\_nil{#1} -\def\CF_sanitizelastitem#1,\empty#2\_nil{#1} -\def\CF_gobtikzinstruction#1;{} -\def\CF_makeother#1{\catcode`#1=12\relax} -\def\CF_lettoken#1#2{\let#1= #2}\CF_lettoken\CF_sptoken{ } -\def\CF_ifx#1#2{\ifx#1#2\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi} -\def\CF_ifempty#1{\ifx\empty#1\empty\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi} -\def\CF_ifnum#1{\ifnum#1\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi} -\def\CF_doifempty#1{\ifx\empty#1\empty\expandafter\CF_id\else\expandafter\CF_gobarg\fi} -\def\CF_doifnotempty#1{\ifx\empty#1\empty\expandafter\CF_gobarg\else\expandafter\CF_id\fi} -\def\CF_gobtonil#1\_nil{} -\edef\CFhash{\string#} -\begingroup - \catcode`\_8 - \expandafter\gdef\csname CF\string_underscore\endcsname{_} -\endgroup -\def\CF_threeea{\expandafter\expandafter\expandafter} -\def\CF_exptwomacroargs#1#2#3{\CF_expsecond{\CF_expsecond#1{#2}}{#3}} -\def\CF_expthreemacroargs#1#2#3#4{\CF_expsecond{\CF_exptwomacroargs#1{#2}{#3}}{#4}} -\def\CF_swaparg#1#2{#2{#1}} -\def\CF_expsecond#1#2{\expandafter\CF_swaparg\expandafter{#2}{#1}}% \CF_expsecond<{arg1>}{} donne "{*}" -\def\CF_eexpsecond#1#2{\expandafter\expandafter\expandafter\CF_swaparg\expandafter\expandafter\expandafter{#2}{#1}}% \CF_eexpsecond{}{} donne "{**}" -\def\CF_swapunbrace#1#2{#2#1} -\def\CF_expafter#1#2{\expandafter\CF_swapunbrace\expandafter{#2}{#1}}% \CF_expafter{}{} donne "*" -\def\CF_eexpafter#1#2{\expandafter\expandafter\expandafter\CF_swapunbrace\expandafter\expandafter\expandafter{#2}{#1}}% \CF_eexpafter{}{} donne "**" -\def\CF_addtomacro#1#2{\CF_expsecond{\def#1}{#1#2}} -\def\CF_eaddtomacro#1#2{\CF_expsecond{\CF_addtomacro#1}{#2}} -\def\CF_preaddtomacro#1#2{\CF_expsecond{\CF_preaddtomacroa#1{#2}}#1} -\def\CF_preaddtomacroa#1#2#3{\def#1{#2#3}} -\def\CF_addtotoks#1#2{#1\expandafter{\the#1#2}} -\def\CF_eaddtotoks#1#2{\expandafter\CF_addtotoks\expandafter#1\expandafter{#2}} -\def\CF_assigntonil#1#2\_nil{\def#1{#2}} -\def\CF_edefaddtomacro#1#2{% - \edef\CF_temp{#2}% - \CF_expsecond{\CF_addtomacro#1}{\CF_temp}% -} -\def\CF_ifnextchar#1#2#3{% - \let\CF_ifnextchartok=#1% <- espace indésirable, bugfix v1.31 - \def\CF_ifnextcharcodetrue{#2}% - \def\CF_ifnextcharcodefalse{#3}% - \futurelet\CF_temptok\CF_ifnextchara -} -\def\CF_ifnextchara{% - \CF_ifx\CF_temptok\CF_sptoken - {\CF_ifnextcharb - } - {\CF_ifx\CF_temptok\CF_ifnextchartok - \CF_ifnextcharcodetrue - \CF_ifnextcharcodefalse - }% -} -\expandafter\def\expandafter\CF_ifnextcharb\space{\futurelet\CF_temptok\CF_ifnextchara} -\def\CF_ifstar#1{\CF_ifnextchar*{\CF_execfirst{#1}}} -\def\CF_testopt#1#2{\CF_ifnextchar[{#1}{#1[{#2}]}} -\def\CF_error#1{\errmessage{Package \CFname\space Error: #1.}} -\def\CF_warning#1{\immediate\write-1{Package \CFname\space Warning: #1^^J}} -\def\CF_ifinteger#1{% - \begingroup - \afterassignment\CF_afterinteger - \CF_cntcycle0#1\relax -} -\def\CF_afterinteger#1\relax{% - \endgroup - \CF_ifempty{#1}% -} -\def\CF_iffirsttokmatch#1#2{% est ce que #1 et #2 commencent par les mêmes tokens ? - \futurelet\CF_toksa\CF_gobtonil#1\relax\_nil - \futurelet\CF_toksb\CF_gobtonil#2\relax\_nil - \CF_ifx\CF_toksa\CF_toksb -} -\def\CF_iffirsttokin#1{% teste si le token qui commence #1 appartient aux tokens mis dans #2 - \futurelet\CF_toksa\CF_gobtonil#1\relax\_nil - \CF_iffirsttokina -} -\def\CF_iffirsttokina#1{% - \CF_ifempty{#1} - {\CF_execsecond - } - {\futurelet\CF_toksb\CF_gobtonil#1\relax\_nil - \CF_ifx\CF_toksa\CF_toksb - {\CF_execfirst} - {\CF_expsecond\CF_iffirsttokina{\CF_gobarg#1}}% - }% -} -\def\CF_ifinstr#1#2{% - \def\CF_ifinstra##1#2##2\_nil{% - \ifx\empty##2\empty - \expandafter\CF_execsecond - \else - \expandafter\CF_execfirst - \fi}% - \CF_ifinstra#1\__nil#2\_nil -} -\def\CF_afterspace#1 #2\_nil{#2} -\def\CF_valuetomacro#1[#2]#3{% #1= macro #2=valeur défaut #3=clé - \CF_eexpsecond{\def#1}{\useKV[chemfig]{#3}}% - \CF_ifx#1\empty - {\def#1{#2}} - {}% -} - -%--------------------------- Substitution ---------------------------- -\def\CF_ifstartwith#1#2{% #1= #2= - \CF_ifempty{#1}% - {\CF_execsecond - } - {\def\CF_startwithcode{#1}% - \def\CF_startwithpattern{#2}% - \CF_ifstartwitha - }% -} -\def\CF_ifstartwitha{% - \CF_grabfirstarg\CF_startwithcode\CF_firstargcode - \CF_grabfirstarg\CF_startwithpattern\CF_firstargpattern - \CF_ifx\CF_firstargcode\CF_firstargpattern - {\CF_expsecond\CF_ifempty\CF_startwithpattern - {\CF_execfirst - } - {\CF_expsecond\CF_ifempty\CF_startwithcode - \CF_execsecond - \CF_ifstartwitha - }% - } - {\CF_execsecond - }% -} -\def\CF_grabfirstarg#1#2{% - \CF_ifx#1\empty - {\let#2\empty - } - {\def\CF_grabmacro{#2}% - \CF_expsecond\CF_ifbracefirst#1% - {\expandafter\CF_grabbracearg#1\_nil#1} - {\CF_expafter{\futurelet\CF_nexttok\CF_grabfirstarga}#1\_nil#1}% - }% -} -\def\CF_grabfirstarga{% - \CF_ifx\CF_nexttok\CF_sptoken - \CF_grabspacearg - \CF_grabnormalarg -} -\def\CF_grabbracearg#1{% - \expandafter\def\CF_grabmacro{{#1}}% - \CF_grabargassigntonil\relax -} -\expandafter\def\expandafter\CF_grabspacearg\space{% - \expandafter\def\CF_grabmacro{ }% - \CF_grabargassigntonil\relax -} -\def\CF_grabnormalarg#1{% - \expandafter\def\CF_grabmacro{#1}% - \CF_grabargassigntonil\relax -} -\def\CF_grabargassigntonil#1\_nil#2{\CF_expsecond{\def#2}{\CF_gobarg#1}} -\def\CF_ifbracefirst#1{\CF_ifnum{\catcode\CF_threeea`\expandafter\CF_firsttonil\detokenize{#1.}\_nil=1 }} -\def\CF_substonly#1#2{% #1=entier maxi>0 #2=macro : dans la sc#1, remplace tous les par sauf lorsque le motif est suivi d'un caractère >#1 - \def\CF_atendsubstitute{\edef#2{\the\CF_substtoks}}% macro exécutée à la fin - \let\CF_substnogroups\CF_substnogrouponly - \CF_ifnum{#1>0 } - {\let\CF_testifx\empty - \foreach\CF_x in {1,...,#1}{\xdef\CF_testifx{\unexpanded\expandafter{\CF_testifx}\unexpanded\expandafter{\expandafter\ifx\CF_x\CF_nexttok1\fi}}}% - \let\CF_testif\empty - \foreach\CF_x in {1,...,#1}{\xdef\CF_testif{\unexpanded\expandafter{\CF_testif}\unexpanded\expandafter{\expandafter\if\CF_x\CF_nexttok1\fi}}}% - \CF_expsecond\CF_substi#2% - } - {\CF_substall#2% - }% -} -\def\CF_substnogrouponly{% - \CF_exptwomacroargs\CF_ifstartwith\CF_substcode\CF_substsubst - {\CF_grabfirstarg\CF_substcode\CF_temp - \CF_expafter{\futurelet\CF_nexttok\CF_gobtonil}\CF_substcode\relax\_nil - \CF_ifnum{0\CF_testifx=1 }% si le prochain token est \let-égal à 1...#1 - {\edef\CF_nexttok{\CF_threeea\CF_firsttonil\expandafter\string\CF_substcode\_nil}% le détokéniser - \CF_ifnum{0\CF_testif=1 } - {\CF_eaddtotoks\CF_substtoks\CF_temp - \CF_grabfirstarg\CF_substcode\CF_temp - \CF_eaddtotoks\CF_substtoks\CF_temp - } - {\CF_eaddtotoks\CF_substtoks\CF_substpattern - }% - } - {\CF_eaddtotoks\CF_substtoks\CF_substpattern - }% - \CF_substgroups - } - {\CF_expsecond\CF_ifempty\CF_substcode - {\CF_atendsubstitute - } - {\CF_grabfirstarg\CF_substcode\CF_substauxarg - \CF_eaddtotoks\CF_substtoks\CF_substauxarg - \CF_substgroups - }% - }% -} -\def\CF_substall#1{% #1=macro - \def\CF_atendsubstitute{\edef#1{\the\CF_substtoks}}% macro exécutée à la fin - \let\CF_substnogroups\CF_substnogroupall - \CF_expsecond\CF_substi#1% -} -\def\CF_substnogroupall{% - \CF_exptwomacroargs\CF_ifstartwith\CF_substcode\CF_substsubst - {\CF_eaddtotoks\CF_substtoks\CF_substpattern - \CF_grabfirstarg\CF_substcode\CF_temp - \CF_substgroups - } - {\CF_expsecond\CF_ifempty\CF_substcode - {\CF_atendsubstitute - } - {\CF_grabfirstarg\CF_substcode\CF_substauxarg - \CF_eaddtotoks\CF_substtoks\CF_substauxarg - \CF_substgroups - }% - }% -} -\def\CF_substi#1#2#3{% #1= #2= #3= - \def\CF_substcode{#1}\def\CF_substsubst{#2}\def\CF_substpattern{#3}% - \CF_substtoks={}% - \CF_substgroups -} - -\def\CF_substgroups{% - \CF_expsecond\CF_ifbracefirst\CF_substcode - {\CF_grabfirstarg\CF_substcode\CF_substauxarg - \begingroup - \def\CF_atendsubstitute{% - \expandafter\endgroup\expandafter\CF_addtotoks\expandafter\CF_substtoks\expandafter{\expandafter{\the\CF_substtoks}}% - \CF_substgroups - }% - \CF_substtoks{}% initialiser à vide - \expandafter\def\expandafter\CF_substcode\CF_substauxarg - \CF_substgroups - }% - {\CF_substnogroups - }% -} - -%---------------------------- Paramètres ----------------------------- -\def\setchemfig{\setKV[chemfig]} -\def\resetchemfig{% - \setKVdefault[chemfig]{% - atom style ={},% code tikz mis à la fin de every node/.style - chemfig style ={},% code tikz mis à la fin de l'arugment optionnel de \tikzpicture - bond join =false, - fixed length =false, - cram rectangle =false, - cram width =1.5ex, - cram dash width =1pt, - cram dash sep =2pt, - atom sep =3em, - bond offset =2pt, - double bond sep =2pt, - angle increment =45, - node style ={}, - bond style ={}, - 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, - cycle radius coeff =0.75, - stack sep =1.5pt, - scheme debug =false, - compound style ={}, - compound sep =5em, - arrow offset =4pt, - arrow angle =0, - arrow coeff =1, - arrow style ={}, - arrow double sep =2pt, - arrow double coeff =0.6, - arrow double harpoon=true, - arrow label sep =3pt, - arrow head =-CF, - + sep left =0.5em, - + sep right =0.5em, - + vshift =0pt, - }% -} -\resetchemfig - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% D E S S I N M O L É C U L E S %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\CF_sanitizecatcode{% - \CF_makeother\[\CF_makeother\]\CF_makeother\:\CF_makeother\(\CF_makeother\)% - \CF_makeother\,\CF_makeother\-\CF_makeother\=\CF_makeother\~\CF_makeother\!% - \CF_makeother\?\CF_makeother\<\CF_makeother\>\CF_makeother\;\CF_makeother\*% - \CF_makeother\|\CF_makeother\#\CF_makeother\@% -} - -\def\CF_nodecontent{\CF_expsecond\printatom{\csname atom_\number\CF_cntatom\endcsname\CF_nodestrut}} - -\def\chemskipalign{% - \CF_doifempty\CF_bondoutcontentsaved% sauf si un \chemskipalign a été fait à l'atome précédent - {\global\let\CF_bondoutcontentsaved\CF_bondoutcontent}% sauvegarder l'atome d'où vient la liaison - \let\CF_nodestrut\empty -} - -\def\CF_emptynode{{}} - -\def\definesubmol{\CF_definesubmoltrue\def_submol} -\def\redefinesubmol{\CF_definesubmolfalse\def_submol} - -\def\def_submol#1{% - \CF_cntatomgroup=0 % nombre d'arguments supposé - \def\CF_temp{#1}% nom - \futurelet\CF_toksa\CF_submoltestnxttok -} - -\def\CF_submoltestnxttok{% - \if[\noexpand\CF_toksa\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi - {\begingroup\CF_sanitizecatcode\CF_expsecond\CF_submolgrabopt{\CF_temp}% - } - {\afterassignment\CF_submoltestnxttoka% pas d'argument entre crochet - \CF_cntatomgroup=0% cherche le nombre d'arguments éventuels - }% -} - -\def\CF_submoltestnxttoka{\futurelet\CF_toksa\CF_submoltestnxttokb} - -\def\CF_submoltestnxttokb{% - \if[\noexpand\CF_toksa\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi - {\begingroup\CF_sanitizecatcode\CF_expsecond\CF_submolgrabopt{\CF_temp}} - {\CF_expsecond{\def_submola}\CF_temp{}}% -} - -\def\CF_submolgrabopt#1[#2]#{\endgroup\def_submola{#1}{#2}} - -\def\def_submola#1{% #1 nom - \CF_ifnum{0\CF_ifnum{\CF_cntatomgroup<0 }1{\CF_ifnum{\CF_cntatomgroup>9 }10}>0 } - {\CF_error{Invalid number of arguments in submol \detokenize\expandafter{\string#1}. Defining it with 0 argument}% - \CF_cntatomgroup=0 - } - {}% - \ifcat\relax\expandafter\noexpand\CF_firsttonil#1\_nil\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi% si #1 est une séquence de contrôle - {\expandafter\ifdefined\CF_firsttonil#1\_nil - \ifCF_definesubmol - \CF_warning{the submol \expandafter\string\CF_firsttonil#1\_nil\space is already defined, the previous definition is lost}% - \fi - \fi - \begingroup - \CF_sanitizecatcode - \def_submolb{#1}% - } - {\ifcsname CF__#1\endcsname - \ifCF_definesubmol - \CF_warning{the submol "#1" is already defined, the previous definition is lost}% - \fi - \fi - \begingroup - \CF_sanitizecatcode - \expandafter\def_submolb\csname CF__#1\endcsname - }% -} - -\def\def_submolb#1#2#3{% #1 nom sous forme de macro, #2 = code si liaison arrive de droite , #3 = code si liaison arrive de gauche, \CF_cntatomgroup = nombre d'arguments - \def\CF_tempa{#2}\CF_doifnotempty{#2}{\CF_expsecond{\CF_expsecond\CF_substonly{\number\CF_cntatomgroup}\CF_tempa}{\CFhash}{\CFhash}}% - \def\CF_tempb{#3}\CF_expsecond{\CF_expsecond\CF_substonly{\number\CF_cntatomgroup}\CF_tempb}{\CFhash}{\CFhash}% - \CF_expsecond{\CF_expsecond{\def_submolc{#1}}\CF_tempa}\CF_tempb -} - -\def\def_submolc#1#2#3{% #1 nom sous forme de macro, #2 = code si liaison arrive de droite , #3 = code si liaison arrive de gauche, \CF_cntatomgroup = nombre d'arguments - \endgroup - \begingroup - \global\toks0{\gdef\CFthesubmol}% - \CF_ifnum{\CF_cntatomgroup>0 } - {\foreach\CF_x in {1,...,\CF_cntatomgroup}{% - \edef\CF_temp{\CFhash\CF_x}% - \global\toks0\expandafter\expandafter\expandafter{\expandafter\the\expandafter\toks\expandafter0\CF_temp}% - }% - } - {}% - \CF_sanitizecatcode \catcode`\#6 \endlinechar-1 \everyeof{\noexpand}% - \CF_ifempty{#2}% - {\scantokens\expandafter{\the\toks0{\empty#3}}% - }% - {\scantokens\expandafter{% - \the\toks0{% - \romannumeral - \csname CF_exec% - \ifdim\csname CF_currentangle\endcsname pt>90pt - \ifdim\csname CF_currentangle\endcsname pt<270pt - first% - \else - second% - \fi - \else - second% - \fi - \endcsname - {0 #2}{0 #3}% - }% - }% - }% - \endgroup - \let#1\CFthesubmol -} - -\def\CF_seeknode#1#2#3{% cherche un noeud au début de #1 l'assigne dans la sc #2 et met le reste dans #3 - \let#2\empty - \def#3{#1}% - \CF_iffirsttokmatch{#1}{ }% - {\CF_expsecond\CF_seeknodea{\romannumeral-`\.\noexpand#1}#2#3}% ignore les espaces au début du groupe d'atome - {\CF_seeknodea{#1}#2#3}% -} - -\def\CF_seeknodea#1#2#3{% - \CF_ifempty{#1}% - {\let#3\empty - } - {\futurelet\CF_toksa\CF_gobtonil#1\relax\_nil - \CF_ifx\CF_toksa\CF_sptoken - {\CF_addtomacro#2{ }% - \CF_expsecond\CF_seeknodea{\CF_afterspace#1\_nil}#2#3% - }% - {\CF_ifx\CF_toksa\bgroup - {\CF_eaddtomacro#2{\expandafter{\CF_firsttonil#1\_nil}}% - \CF_expsecond\CF_seeknodea{\CF_gobarg#1}#2#3% - }% - {\CF_iffirsttokina{-=(*<>!~}% - {\def#3{#1}% - }% - {\CF_eaddtomacro#2{\CF_firsttonil#1\_nil}% - \CF_expsecond\CF_seeknodea{\CF_gobarg#1}#2#3% - }% - }% - }% - }% -} - -% on sait que #1 commence par -,=,~,<,>. On analyse cette liaison -% #2 reçoit le type de liaisons (1 pour -, 2 pour =, 3 pour ~) -\def\CF_assignbondcode#1#2{% - \futurelet\CF_toksa\CF_gobtonil#1\_nil - \edef#2{% - \ifx-\CF_toksa1\else - \ifx=\CF_toksa2\else - \ifx~\CF_toksa3\else - \ifx>\CF_toksa4\else - \ifx<\CF_toksa5\else0% si 0 --> il y a une erreur non due à l'utilisateur - \fi\fi\fi\fi\fi}% - \ifnum#2>3 % si c'est une liaison de Cram - \CF_expafter{\futurelet\CF_toksa\CF_gobtonil}{\CF_gobarg#1\_nil}% chope le caractère suivant - \CF_ifx:\CF_toksa - {\edef#2{\number\numexpr#2+2}% si c 'est un ":", signe du pointillé, ajoute 2 - }% - {\CF_ifx|\CF_toksa% si c 'est un "|", signe du triangle évidé, ajouter 4 - {\edef#2{\number\numexpr#2+4}} - {}% - }% - \fi -} - -\def\CF_grabbondoffseta#1,#2\_nil{% - \def\CF_startoffset{#1}\def\CF_endoffset{#2}% -} - -\def\CF_grabbondoffset#1(#2)#3\_nil{% - \CF_doifnotempty{#2}% - {\CF_ifinstr{#2},% - {\CF_grabbondoffseta#2\_nil}% - {\def\CF_startoffset{#2}}% - }% - \def\CF_remainafterbond{#3}% -} - -\def\CF_analysebond#1#2{% - \CF_assignbondcode{#1}#2% - \CF_expsecond{\def\CF_remainafterbond}{\CF_gobarg#1}%mange le premier signe de la liaison - \let\CF_doublebondtype\CF_zero - \ifnum#2=2 % si c'est une double liaison, regarde s'il y a un + ou - derrière - \CF_expafter{\futurelet\CF_toksa\CF_gobtonil}{\CF_gobarg#1\_nil}% - \CF_ifx^\CF_toksa - {\def\CF_doublebondtype{1}% - \CF_expsecond{\def\CF_remainafterbond}{\CF_gobtwoargs#1}% mange le "^" - } - {\expandafter\ifx\CF_underscore\CF_toksa - \def\CF_doublebondtype{2}% - \CF_expsecond{\def\CF_remainafterbond}{\CF_gobtwoargs#1}% mange le "_" - \fi - }% - \else - \ifnum#2>5 % si c'est une laision de Cram pointillée ou triangle évidé - \CF_expsecond{\def\CF_remainafterbond}{\CF_gobtwoargs#1}% mange un caractère de plus - \fi - \fi - \CF_expsecond\CF_iffirsttokmatch\CF_remainafterbond\CFhash - {\CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_remainafterbond.}(%si parenthèse juste après - {\expandafter\CF_grabbondoffset\CF_remainafterbond\_nil} - {}% - }% - {}% - \CF_expsecond\CF_iffirsttokmatch\CF_remainafterbond @% - {\expandafter\CF_grabmovearg\CF_remainafterbond\_nil}% - {}% - \CF_expsecond\CF_iffirsttokmatch{\CF_remainafterbond}[% - {\expandafter\CF_analyseoptarg\CF_remainafterbond\_nil\CF_remainafterbond - }% - {\let\CF_currentstringangle\CF_defaultstringangle - \let\CF_currentlength\CF_defaultlength - \let\CF_currentfromatom\CF_defaultfromatom - \let\CF_currenttoatom\CF_defaulttoatom - \let\CF_currenttikz\CF_defaulttikz - \let\CF_movebondname\empty - }% - \ifCF_incycle - \pgfmathsetmacro\CF_cycleincrementangle{360/\CF_cyclenum+\CF_initcycleangle}% - \edef\CF_currentstringangle{::+\CF_cycleincrementangle}% - \def\CF_initcycleangle{0}% - \let\CF_currentlength\CF_defaultlength% et on ignore la longueur de liaison spécifiée - \fi - \CF_expsecond\CF_setbondangle{\CF_currentstringangle}\CF_currentangle -} - -\def\CF_setbondangle#1#2{% le code de la direction est contenu dans #1, en sortie, #2 contient l'angle - \CF_ifempty{#1}% - {\let#2\CF_defaultangle - } - {\if:\expandafter\noexpand\CF_firsttonil#1\_nil - \if:\CF_threeea\noexpand\expandafter\CF_firsttonil\CF_gobarg#1\_nil - \pgfmathsetmacro#2{\CF_previousangle+\expandafter\CF_gobarg\CF_gobarg#1}% - \else - \pgfmathsetmacro#2{\CF_gobarg#1}% - \fi - \else - \pgfmathsetmacro#2{#1*\CF_angleincrement}% - \fi% puis normalise l'angle entre 0 et 360 - \ifdim\ifdim#2pt<0pt -\fi#2pt>360pt - \pgfmathsetmacro#2{#2-360*floor(#2/360)}% - \fi% si |#2|>360 - \ifdim#2pt<0pt - \pgfmathsetmacro#2{#2+360}% - \fi - }% -} - -\def\CF_analysemovearg#1,#2\_nil#3{% - \def#3{#1}\def\CF_movebondcoeff{#2}% -} - -% Argument limités légitimes ici car #2 (qui est ce qui suit "@{}" dans l'argument optionnel) ne DOIT PAS -% commencer par une accolade. -\def\CF_grabmovearg @#1#2\_nil{% - \CF_ifinstr{#1},% - {\CF_analysemovearg#1\_nil\CF_movebondname}% - {\def\CF_movebondname{#1}\def\CF_movebondcoeff{0.5}}% - \def\CF_remainoptarg{#2}% -} - -\def\CF_testemptyandassign#1#2#3{% - \CF_ifempty{#2} - {\let#1#3} - {\def#1{#2}}% -} - -\def\CF_parseoptlist#1,#2,#3,#4,#5\_nil{% - \CF_testemptyandassign\CF_currentstringangle{#1}\CF_defaultstringangle - \CF_testemptyandassign\CF_currentlength {#2}\CF_defaultlength - \CF_testemptyandassign\CF_currentfromatom {#3}\CF_defaultfromatom - \CF_testemptyandassign\CF_currenttoatom {#4}\CF_defaulttoatom - \CF_expsecond{\CF_testemptyandassign\CF_currenttikz}{\CF_sanitizelastitem#5,\empty\_nil}\CF_defaulttikz -}% - -\def\CF_analyseoptarg[#1]{% - \CF_doifnotempty{#1}% - {\CF_iffirsttokmatch{#1}{@}% - {\CF_grabmovearg#1\_nil - } - {\let\CF_movebondname\empty - \def\CF_remainoptarg{#1}% - }% - \expandafter\CF_parseoptlist\CF_remainoptarg,\empty,\empty,\empty,\empty\_nil - }% - \CF_analyseoptarga\relax -} - -\def\CF_analyseoptarga#1\_nil#2{% - \CF_expsecond{\def#2}{\CF_gobarg#1}% -} - -\def\CF_seeksubmol{% - \CF_expsecond{\def\CF_molecule}{\romannumeral-`\.\expandafter\noexpand\CF_molecule}% - \CF_expsecond\CF_iffirsttokmatch{\CF_molecule}!% - {\CF_eexpsecond{\def\CF_molecule}{\expandafter\CF_gobarg\CF_molecule}% enlève le "!" - \CF_ifx\empty\CF_molecule - {\CF_error{no submol name found after "!"}} - {}% - \ifcat\relax\CF_threeea\noexpand\expandafter\CF_firsttonil\CF_molecule*\_nil - \expandafter\CF_seeksubmola\CF_molecule\_nil - \else - \expandafter\CF_seeksubmolb\CF_molecule\_nil - \fi - \CF_seeksubmol - }% - {}% -} - -\def\CF_seeksubmola#1{\CF_seeksubmolc#1\relax} - -\def\CF_seeksubmolb#1{\expandafter\CF_seeksubmolc\csname CF__#1\endcsname\relax}% nom de la sous molécule - -\def\CF_seeksubmolc#1#2\_nil{%#1=macro de la sous molécule #2=reste du code commençant par \relax - \CF_expsecond{\CF_eexpsecond{\def\CF_molecule}}{\expandafter#1\CF_gobarg#2}% supprime le \relax puis ajoute la macro au début et la 2-développe -} - -\def\CF_insertemptygroup#1{% insère {} au début de la sc #1 - \CF_expsecond{\def#1}{\expandafter{\expandafter}#1}% -} - -\def\chemfig{\CF_testopt\CF_chemfiga{}} - -\def\CF_chemfiga[#1]{% - \begingroup - \edef\CF_temp{% - \unexpanded\expandafter{\CF_begintikzpicture}% - [remember picture,% - every node/.style={% - anchor=base,% - inner sep=0pt,% - outer sep=0pt,% - minimum size=0pt,% - \unexpanded\CF_threeea{\useKV[chemfig]{atom style}}% - },% - baseline,% - \unexpanded\CF_threeea{\useKV[chemfig]{chemfig style}}% - ]% - }% - \CF_sanitizecatcode - \CF_exptwomacroargs\CF_chemfigb\CF_begintikzpicture\CF_endtikzpicture[#1]% -} - -\def\CF_chemfigb#1#2[#3]#4{% - \endgroup - \begingroup - \setchemfig{#3}% - \edef\CF_temp{% - \unexpanded{#1}[% - remember picture,% - every node/.style={% - anchor=base,% - inner sep=0pt,% - outer sep=0pt,% - minimum size=0pt,% - \unexpanded\CF_threeea{\useKV[chemfig]{atom style}}% - },% - baseline,% - \unexpanded\CF_threeea{\useKV[chemfig]{chemfig style}}% - ]% - }% - \CF_temp% début du tikzpicture - \begingroup% \endgroup rajouté en sortie de tracé par \CF_chemfigd - \let\CF_hooklist\empty - \CF_expsecond\setchemfig{#3}% - \ifboolKV[chemfig]{fixed length} - {\CF_macrofixedbondlengthtrue} - {\CF_macrofixedbondlengthfalse}% - \ifboolKV[chemfig]{bond join} - {\let\CF_drawaxisbond\CF_drawaxisbondjoin} - {\let\CF_drawaxisbond\CF_drawaxisbondnojoin}% - \ifboolKV[chemfig]{cram rectangle} - {\let\CF_clipcramornot\CF_gobtikzinstruction} - {\let\CF_clipcramornot\clip}% - \CF_valuetomacro\CF_crambasewidth [1.5ex]{cram width}% - \CF_valuetomacro\CF_cramdashlength [1pt]{cram dash width}% - \CF_valuetomacro\CF_cramdashsep [2pt]{cram dash sep}% - \CF_valuetomacro\CF_atomsep [3em]{atom sep}% espacement des atomes liés - \CF_valuetomacro\CF_bondoffset [2pt]{bond offset}% - \CF_valuetomacro\CF_doublesep [2pt]{double bond sep}% - \CF_valuetomacro\CF_angleincrement [45]{angle increment}% - \CF_valuetomacro\CF_nodestyle []{node style}% - \CF_valuetomacro\CF_bondstyle []{bond style}% - \CF_valuetomacro\CF_stacksep [1.5pt]{stack sep}% - \CF_valuetomacro\CF_cycleradiuscoeff[0.75]{cycle radius coeff}% coeff multiplicateur du rayon des arcs dans les cycles - \CF_incyclefalse - \CF_cntgroup0 - \let\CF_lastaction\CF_zero% 0=début du dessin 1=tracé d'un noeud 2=tracé d'une liaison - \let\CF_startoffset\empty - \let\CF_endoffset\empty - \let\CF_bondoutcontentsaved\empty - \def\CF_cycleanglecorrection{180/\CF_cyclenum}% - \def\CF_defaultangle{0}% - \def\CF_defaultstringangle{:0}% angle pris par défaut si le champ est vide - \def\CF_defaultlength{1}% - \let\CF_defaultfromatom\empty% numero de l'atome d'où partent les liaisons par défaut - \let\CF_defaulttoatom\empty% numéro de l'atome où arrivent les laisons par défaut - \let\CF_defaulttikz\empty - \let\CF_previousbondangle\empty - \let\CF_joinbond\CF_zero - \let\CF_previoustikz\empty - \everyeof{\_nil}\endlinechar-1 - \CF_sanitizecatcode - \expandafter\CF_assigntonil\expandafter\CF_molecule\scantokens{#4}% - \CF_expsecond{\CF_substall\CF_molecule}\CFhash\CFhash - \CF_expsecond\CF_chemfigc{\CF_molecule}% - %\endgroup <-- rajouté par \CF_chemfigd - #2% fin du tikzpicture - \endgroup - \let\CF_flipstate\CF_zero -} - -\def\CF_chemfigc#1{% #1 est le code de la molécule - \ifnum\CF_lastaction=3 - \ifCF_incycle - \def\CF_defaultangle{0}% - \else - \ifnum\CF_cntcycle=0 % si c'est le début d'un cycle - \pgfmathsetmacro\CF_defaultangle{\CF_previousangle+180+\CF_cycleanglecorrection}% on met la liaison à +180° + correction - \else - \pgfmathsetmacro\CF_defaultangle{\CF_previousangle-90+180/\CF_cyclenum}% sinon à la bissectrice du sommet du cycle - \fi - \fi - \let\CF_defaultstringangle\empty - \fi - \let\CF_currentangle\CF_defaultangle - \def\CF_molecule{#1}% - \CF_seeksubmol% alias en premier ? - \if[\CF_threeea\noexpand\expandafter\CF_firsttonil\CF_molecule\_nil - \expandafter\CF_analyseoptarg\CF_molecule\_nil\CF_molecule - \CF_expsecond\CF_setbondangle{\CF_currentstringangle}\CF_currentangle - \let\CF_defaultangle\CF_currentangle - \let\CF_previousangle\CF_currentangle - \CF_doifnotempty\CF_currentstringangle{\let\CF_defaultangle\CF_currentangle}% - \CF_doifnotempty\CF_currentlength {\let\CF_defaultlength\CF_currentlength}% - \CF_doifnotempty\CF_currentfromatom {\let\CF_defaultfromatom\CF_currentfromatom}% - \CF_doifnotempty\CF_currenttoatom {\let\CF_defaulttoatom\CF_currenttoatom}% - \CF_doifnotempty\CF_currenttikz {\let\CF_defaulttikz\CF_currenttikz}% - \CF_seeksubmol - \fi - \edef\CF_defaultstringangle{:\CF_defaultangle}% - \let\CF_currentlength\CF_defaultlength - \let\CF_currentfromatom\CF_defaultfromatom - \let\CF_currenttoatom\CF_defaulttoatom - \let\CF_currenttikz\CF_defaulttikz - \ifCF_incycle% si on commence un cycle - \let\CF_currentangle\CF_previousangle - \ifCF_cyclearc% on doit tracer l'arc de cercle dans le cycle ? - \pgfmathsetmacro\CF_cyclearcradius{\CF_cycleradiuscoeff*\CF_currentlength*\CF_atomsep/(2*tan(180/\CF_cyclenum))}% - \pgfmathsetmacro\CF_cyclearcinitangle{\CF_currentangle+\CF_initcycleangle+180/\CF_cyclenum+90} - \pgfmathparse{\CF_currentlength*\CF_atomsep/(2*sin(180/\CF_cyclenum))}% - \node[at=(\CF_bondoutnode),shift=(\CF_cyclearcinitangle:\pgfmathresult pt)](arccenter){};% le centre de l'arc - \node[at=(arccenter),shift=(\CF_cyclearcstartangle:\CF_cyclearcradius pt)](initarc){};% le début de l'arc - \CF_expafter{\draw[}\CF_cyclearcdirecttikz](initarc) arc (\CF_cyclearcstartangle:\CF_cyclearcendangle:\CF_cyclearcradius pt); - \fi - \else - \let\CF_currentangle\CF_defaultangle - \fi - \ifnum\CF_lastaction=0 - \let\CF_previousangle\CF_defaultangle - \node(CF_node){}; - \CF_expsecond\CF_iffirsttokin{\CF_molecule}{-=(*~?<>}% - {\CF_insertemptygroup\CF_molecule}% - {}% - \fi - \CF_chemfigd -} - -\def\CF_chemfigd{% - \let\CF_nextaction\CF_chemfigd% à priori, on reboucle - \CF_ifx\CF_molecule\empty - {\let\CF_nextaction\endgroup - } - {\CF_seeksubmol - \CF_expsecond\CF_seeknode{\CF_molecule}\CF_currentatomgroup\CF_molecule - \CF_ifx\empty\CF_currentatomgroup% pas de noeud pour commencer ? - {\def\CF_bondoutnode{% - n\CF_lastgroupnumber-% - \ifx\CF_currentfromatom\empty - \ifdim\CF_currentangle pt<90pt - \number\CF_cntatomgroup - \else - \ifdim\CF_currentangle pt>270pt - \number\CF_cntatomgroup - \else - 1% - \fi - \fi - \else - \CF_currentfromatom - \fi}% - \CF_expafter{\futurelet\CF_toksa\CF_gobtonil}{\CF_molecule\relax\_nil}% - \CF_iffirsttokina{-=<>~}% la suite est une liaison - {\ifnum\CF_lastaction=2 % c'est la deuxième liaison consécutive ? - \CF_insertemptygroup\CF_molecule% insère un groupe vide - \edef\CF_bondoutnode{\CF_bondoutnode}% - \else - \ifCF_incycle - \advance\CF_cntcycle1 - \fi - \CF_expsecond\CF_analysebond{\CF_molecule}\CF_bondtype - \edef\CF_bondoutnode{\CF_bondoutnode}% - \let\CF_molecule\CF_remainafterbond - \ifCF_incycle - \ifnum\CF_cntcycle=\CF_cyclenum\relax - \CF_threeea\CF_execfirst - \else - \ifnum\CF_cntcycle=1 - \let\CF_cyclefirsttikz\CF_currenttikz - \CF_doifnotempty\CF_startoffset{\let\CF_cyclejoinlast\CF_zero}% - \fi - \CF_threeea\CF_execsecond - \fi - \else - \expandafter\CF_execsecond - \fi - {\let\CF_nextaction\endgroup - \CF_drawbond\CF_bondtype{\CF_bondoutnode}{\CF_hookcycle}\CF_previousatomgroup\CF_hookatomgroup - }% - {\node[at=(\CF_bondoutnode\ifCF_incycle\else\ifCF_macrofixedbondlength.\CF_currentangle\fi\fi),shift=(\ifcase\CF_flipstate\or180-\or-\fi\CF_currentangle:\CF_currentlength*\CF_atomsep)](CF_node){}; - \let\CF_previousangle\CF_currentangle - \def\CF_lastaction{2}% - }% - \fi - \ifcat\relax\detokenize\expandafter{\romannumeral-`\.\expandafter\noexpand\CF_molecule}\relax - % s'il ne reste plus rien après la liaison (sans tenir compte de l'espace devant)-> insère un groupe vide - \CF_insertemptygroup\CF_molecule - \fi - }% - {\edef\CF_bondoutnode{\CF_bondoutnode}% évalue le l'atome de départ de liaison - \CF_ifx(\CF_toksa% une parenthèse pour commencer ? - {\ifnum\CF_lastaction=2 % il y avait une liaison juste avant ? - \CF_insertemptygroup\CF_molecule - \else - \CF_expsecond\CF_grabsubmol{\CF_molecule}% - \begingroup - \ifCF_incycle\def\CF_lastaction{3}\fi% on était dans un cycle - \CF_incyclefalse - \aftergroup\CF_chemfigd - \def\CF_nextaction{\CF_expsecond\CF_chemfigc{\CF_molinparen}}% - \fi - }% - {\CF_ifx\CF_molecule\empty - {\let\CF_nextaction\endgroup - } - {% ce qui reste après le noeud courant n'est pas vide, ne commence pas par "-=~", ni par une parenthèse - \CF_ifx*\CF_toksa% un cycle ? - {\ifnum\CF_lastaction=2 - \CF_insertemptygroup\CF_molecule% insère un groupe vide - \else - \ifCF_incycle - \def\CF_lastaction{3}% - \fi% on était dans un cycle - \ifnum\CF_lastaction=3 - \let\CF_lastcyclenum\CF_cyclenum - \fi - \CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_molecule}*% - {\CF_eexpsecond{\def\CF_molecule}{\expandafter\CF_gobarg\CF_molecule}% enlève la 1er étoile - \CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_molecule}[% un crochet ensuite ? - {\expandafter\CF_cycleparsepreamblewithoptarg\CF_molecule\_nil% \begingroup inclus - }% - {\def\CF_cyclearcstartangle{0}\def\CF_cyclearcendangle{360}% - \let\CF_cyclearcdirecttikz\empty - \expandafter\CF_cycleparsepreamble\CF_molecule\_nil% \begingroup inclus - }% - \CF_cyclearctrue - }% - {\expandafter\CF_cycleparsepreamble\CF_molecule\_nil% \begingroup inclus - \CF_cyclearcfalse - }% - \CF_cntcycle0 - \edef\CF_hookcycle{\CF_bondoutnode}% - \let\CF_hookatomgroup\CF_previousatomgroup - \CF_ifx\CF_hookatomgroup\CF_emptynode - {\def\CF_cyclejoinlast{1}}% joindre le dernier - {\def\CF_cyclejoinlast{0}} - \CF_incycletrue - \ifnum\CF_lastaction=3 - \pgfmathsetmacro\CF_initcycleangle{360/\CF_lastcyclenum-180}% c'est un cycle dans un cycle - \else - \pgfmathsetmacro\CF_initcycleangle{-180/\CF_cyclenum-90+\CF_cycleanglecorrection}% - \fi - \aftergroup\CF_chemfigd - \def\CF_nextaction{\CF_expsecond\CF_chemfigc{\CF_molinparen}}% - \fi - }% - {\CF_error{something went wrong here: \detokenize\expandafter{\CF_molecule}^^JIf you think it's a bug, please, send a Minimal Example to the author}% - }% - }% - }% - }% - }% - {\CF_expthreemacroargs\CF_drawatomgroup\CF_currentangle\CF_currenttoatom\CF_currentatomgroup - }% - }% - \CF_nextaction -} - -\def\CF_cycleparsepreamble*#1#2\_nil{% - \ifnum#1<3 - \CF_error{a cycle must be at least a triangle.^^JThe number following "*" must be 3 or more}% - \fi - \def\CF_molecule{#2}% - \CF_expsecond\CF_grabsubmol{\CF_molecule}% - \begingroup - \def\CF_cyclenum{#1}% -} - -\def\CF_cycleparsepreamblewithoptarg*[#1]#2#3\_nil{% - \CF_cycleparseoptarg#1,\empty,\empty,\empty\_nil - \CF_cycleparsepreamble*#2#3\_nil -} - -\def\CF_cycleparseoptarg#1,#2,#3\_nil{% - \CF_ifempty{#1} - {\def\CF_cyclearcstartangle{0}} - {\def\CF_cyclearcstartangle{#1}}% - \CF_ifempty{#2} - {\def\CF_cyclearcendangle{360}} - {\def\CF_cyclearcendangle{#2}}% - \CF_expsecond{\def\CF_cyclearcdirecttikz}{\CF_sanitizelastitem#3,\empty\_nil}% -} - -\def\CF_grabsubmol#1{% - \begingroup - \catcode`(1 \catcode`)2 - \CF_threeea - \endgroup - \expandafter\CF_grabsubmola\scantokens{\relax#1}% -} - -\def\CF_grabsubmola#1\_nil{% - \expandafter\CF_assigntonil\expandafter\CF_molecule\scantokens\CF_threeea{\expandafter\CF_gobarg \CF_gobarg#1}% - \expandafter\CF_assigntonil\expandafter\CF_molinparen\scantokens\CF_threeea{\expandafter\CF_firsttonil\CF_gobarg#1\_nil}% -} - -\def\CF_ifcarisupperletter#1{% - \ifcat\relax\noexpand#1% - \let\CF_next\CF_execsecond% faux si c'est une sc - \else - \ifnum`#1<`A - \let\CF_next\CF_execsecond - \else - \ifnum`#1>`Z - \let\CF_next\CF_execsecond - \else - \let\CF_next\CF_execfirst - \fi - \fi - \fi - \CF_next -} - -% Créé 4 noeuds au dessus et au dessous des noeuds #1 et #2 -% à une distance de #3 du noeud #1 et #4 du noeud #2 -\def\CF_createnormnodes#1#2#3#4{% - \CF_doifnotempty{#3} - {\node[shape=coordinate,at=(#1),xshift=#3*\CF_normx,yshift=#3*\CF_normy](#11){}; - \node[shape=coordinate,at=(#1),xshift=-#3*\CF_normx,yshift=-#3*\CF_normy](#12){}; - }% - \CF_doifnotempty{#4} - {\node[shape=coordinate,at=(#2),xshift=#4*\CF_normx,yshift=#4*\CF_normy](#21){}; - \node[shape=coordinate,at=(#2),xshift=-#4*\CF_normx,yshift=-#4*\CF_normy](#22){}; - }% -} - -\def\CF_computenodevect#1#2{% - \pgfextractx\CF_dim{\pgfpointanchor{#1}{center}}\edef\CF_dimax{\the\CF_dim}% - \pgfextracty\CF_dim{\pgfpointanchor{#1}{center}}\edef\CF_dimay{\the\CF_dim}% - \pgfextractx\CF_dim{\pgfpointanchor{#2}{center}}\edef\CF_dimbx{\the\CF_dim}% - \pgfextracty\CF_dim{\pgfpointanchor{#2}{center}}\edef\CF_dimby{\the\CF_dim}% - \pgfmathsetmacro\CF_vectorlen{veclen(\CF_dimbx-\CF_dimax,\CF_dimby-\CF_dimay)}% - \pgfmathsetmacro\CF_normx{(\CF_dimay-\CF_dimby)/\CF_vectorlen}% - \pgfmathsetmacro\CF_normy{(\CF_dimbx-\CF_dimax)/\CF_vectorlen}% -} - -\def\CF_setoffset#1#2{% - \CF_doifempty#1% - {\edef#1{% - \ifx#2\CF_emptynode - 0pt% - \else - \ifx#2\empty - 0pt% - \else - \CF_bondoffset - \fi - \fi}% - }% -} - -\def\CF_drawbond#1#2#3#4#5{% #1=type de liaison #2 et #3:nom de noeuds de début et fin #4 et #5: contenu des atomes de début et fin - \CF_setoffset\CF_startoffset#4% - \CF_setoffset\CF_endoffset#5% - \let\CF_currentbondstyle\CF_bondstyle - \CF_doifnotempty\CF_currenttikz{\CF_eaddtomacro\CF_currentbondstyle{\expandafter,\CF_currenttikz}}% - \path(#2)--(#3)coordinate[pos=0](#2@)coordinate[pos=1](#3@);% - \CF_computenodevect{#2@}{#3@}% - \pgfmathsetmacro\CF_startcoeff{\CF_startoffset/\CF_vectorlen}% - \pgfmathsetmacro\CF_endcoeff{1-\CF_endoffset/\CF_vectorlen}% - \path(#2@)--(#3@)coordinate[pos=\CF_startcoeff](#2@@)coordinate[pos=\CF_endcoeff](#3@@);% - \CF_doifnotempty\CF_movebondname% on doit poser un noeud sur la liaison - {\path(#2@@)--(#3@@)coordinate[overlay,pos=\CF_movebondcoeff](\CF_movebondname); - \let\CF_movebondname\empty - }% - \ifcase#1\relax - \CF_error{unknown bond type, this error should not occur^^JIf you think it's a bug, send a Minimal Example to the author}% - \or% 1 = liaison simple - \CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe - \or% 2 = liaison double - \ifCF_incycle - \ifnum\CF_doublebondtype=0 - \def\CF_doublebondtype{1}% - \fi - \ifnum\CF_flipstate>0 - \def\CF_doublebondtype{2}% - \fi - \pgfmathsetmacro\CF_doublebondlengthcorrection{\CF_doublesep*tan(180/\CF_cyclenum)}% - \fi - \ifcase\CF_doublebondtype - \CF_createnormnodes{#2@@}{#3@@}{\CF_doublesep/2}{\CF_doublesep/2}% - \CF_drawbonda(#2@@1)--(#3@@1); - \CF_drawbonda(#2@@2)--(#3@@2); - \let\CF_joinbond\CF_zero - \or - \CF_createnormnodes{#2@@}{#3@@}\CF_doublesep\CF_doublesep - \CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe\CF_drawbonda(#2@@)--(#3@@); - \begingroup% ajuste éventuellement les longueurs des liaisons doubles - \ifCF_incycle - \ifdim\CF_startoffset=0pt - \CF_edefaddtomacro\CF_currentbondstyle{,shorten <=\CF_doublebondlengthcorrection pt}% - \fi - \ifdim\CF_endoffset=0pt - \CF_edefaddtomacro\CF_currentbondstyle{,shorten >=\CF_doublebondlengthcorrection pt}% - \fi - \fi - \CF_drawbonda(#2@@1)--(#3@@1); - \endgroup - \or - \CF_createnormnodes{#2@@}{#3@@}\CF_doublesep\CF_doublesep - \CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe\CF_drawbonda(#2@@)--(#3@@); - \begingroup% ajuste éventuellement les longueurs des liaisons doubles - \ifCF_incycle - \ifdim\CF_startoffset=0pt - \CF_edefaddtomacro\CF_currentbondstyle{,shorten \ifnum\CF_flipstate=0 <=-\else>=\fi\CF_doublebondlengthcorrection pt}% - \fi - \ifdim\CF_endoffset=0pt - \CF_edefaddtomacro\CF_currentbondstyle{,shorten \ifnum\CF_flipstate=0 >=-\else<=\fi\CF_doublebondlengthcorrection pt}% - \fi - \fi - \CF_drawbonda(#2@@2)--(#3@@2); - \endgroup - \fi - \or% 3 = liaison triple - \CF_createnormnodes{#2@@}{#3@@}\CF_doublesep\CF_doublesep - \CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe\CF_drawbonda(#2@@)--(#3@@); - \CF_drawbonda(#2@@1)--(#3@@1); - \CF_drawbonda(#2@@2)--(#3@@2); - \or% 4 = liaison Cram pleine de #2 vers #3 - \CF_createnormnodes{#2@@}{#3@@}{\CF_crambasewidth/2}{}% - \CF_expafter{\filldraw[}\CF_currentbondstyle,line join=bevel](#2@@1)--(#2@@2)--(#3@@)--cycle; - \let\CF_joinbond\CF_zero - \or% 5 = liaison Cram creuse de #3 vers #2 - \CF_createnormnodes{#3@@}{#2@@}{\CF_crambasewidth/2}{}% - \CF_expafter{\filldraw[}\CF_currentbondstyle,line join=bevel](#3@@1)--(#3@@2)--(#2@@)--cycle; - \let\CF_joinbond\CF_zero - \or% 6 = liaison Cram pointillée de #2 vers #3 - \scope - \CF_createnormnodes{#2@@}{#3@@}{\CF_crambasewidth/2}{}% - \CF_clipcramornot(#2@@1)--(#2@@2)--(#3@@)--(#2@@1); - \CF_expafter{\draw[}\CF_currentbondstyle,dash pattern=on \CF_cramdashlength off \CF_cramdashsep,line width=\CF_crambasewidth](#2@@)--(#3@@); - \endscope - \let\CF_joinbond\CF_zero - \or% 7 = liaison Cram pointillée de #3 vers #2 - \scope - \CF_createnormnodes{#3@@}{#2@@}{\CF_crambasewidth/2}{}% - \CF_clipcramornot(#3@@1)--(#3@@2)--(#2@@)--(#3@@1); - \CF_expafter{\draw[}\CF_currentbondstyle,dash pattern=on \CF_cramdashlength off \CF_cramdashsep,line width=\CF_crambasewidth](#3@@)--(#2@@); - \endscope - \let\CF_joinbond\CF_zero - \or% 8 = liaison cram rectangle évidé de #2 vers #3 - \CF_createnormnodes{#2@@}{#3@@}{\CF_crambasewidth/2}{}% - \CF_expafter{\draw[}\CF_currentbondstyle,line join=bevel](#2@@1)--(#2@@2)--(#3@@)--cycle; - \let\CF_joinbond\CF_zero - \or% 9 = liaison cram rectangle évidé de #3 vers #1 - \CF_createnormnodes{#3@@}{#2@@}{\CF_crambasewidth/2}{}% - \CF_expafter{\draw[}\CF_currentbondstyle,line join=bevel](#3@@1)--(#3@@2)--(#2@@)--cycle; - \let\CF_joinbond\CF_zero - \else - \CF_error{unknown bond type, this error should not occur^^JIf you think it's a bug, send a Minimal Example to the author}% - \fi - \let\CF_startoffset\empty - \let\CF_endoffset\empty - \let\CF_previoustikz\CF_currenttikz - \let\CF_previousbondangle\CF_previousangle - \def\CF_previousbond{#1}% -} - -\def\CF_drawaxisbondnojoin#1#2{\CF_drawbonda(#1@@)--(#2@@);} - -\def\CF_drawaxisbondjoin#1#2{% dessine une liaison simple dans l'axe avec raccord rétrograde - \ifCF_incycle\ifnum\CF_cntcycle=\CF_cyclenum\relax - \let\CF_nexttikz\CF_cyclefirsttikz - \fi\fi - \ifnum\CF_joinbond=0 - \ifCF_incycle - \ifnum\CF_cntcycle=\CF_cyclenum\relax - \ifnum\CF_cyclejoinlast=1 - \CF_drawbonda(#1@@)--(#2@@)--% - ([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@); - \else - \CF_drawbonda(#1@@)--(#2@@); - \fi - \else - \CF_drawbonda(#1@@)--(#2@@); - \fi - \else - \CF_drawbonda(#1@@)--(#2@@); - \fi - \def\CF_joinbond{1}% - \else - \CF_ifx\CF_previoustikz\CF_currenttikz - {\def\CF_joinbond{1}% - \CF_ifx\CF_previousatomgroup\CF_emptynode - {\CF_ifx\CF_previousbondangle\empty% si début molécule - {\CF_drawbonda(#1@@)--(#2@@); - } - {\ifdim\CF_startoffset=0pt - \ifCF_incycle - \ifnum\CF_cntcycle=\CF_cyclenum\relax - \ifnum\CF_cyclejoinlast=1 - \CF_ifx\CF_cyclefirsttikz\CF_currenttikz - {\CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@)--% - ([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@); - } - {\CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@); - }% - \else - \CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@); - \fi - \else - \CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@); - \fi - \else - \CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@); - \fi - \else - \CF_drawbonda(#1@@)--(#2@@); - \fi - }% - } - {\CF_drawbonda(#1@@)--(#2@@);}% - } - {\ifCF_incycle - \ifnum\CF_cntcycle=\CF_cyclenum\relax - \ifnum\CF_cyclejoinlast=1 - \CF_ifx\CF_nexttikz\CF_currenttikz - {\CF_drawbonda(#1@@)--(#2@@)--([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@);}% - {\CF_drawbonda(#1@@)--(#2@@);}% - \else - \CF_drawbonda(#1@@)--(#2@@); - \fi - \else - \CF_drawbonda(#1@@)--(#2@@); - \fi - \else - \CF_drawbonda(#1@@)--(#2@@); - \fi - }% - \fi - \ifdim\CF_endoffset=0pt \else - \let\CF_joinbond\CF_zero - \fi -} - -\def\CF_drawbonda{\CF_expafter{\draw[}\CF_currentbondstyle]} - -\def\CF_hookdrawall{% dessine tous les crochets contenus dans la sc \CF_hookdraw - \CF_doifnotempty\CF_hookdrawlist - {\expandafter\CF_hookdrawfirst\CF_hookdrawlist\_nil% trace un lien de crochet à crochet - \CF_hookdrawall - }% -} - -\def\CF_hookdrawfirst[#1,#2,#3]#4#5#6#7#8\_nil{% - \def\CF_hookdrawlist{#8}% - \begingroup - \let\CF_joinbond\CF_zero - \def\CF_currenttikz{#3}% - \def\CF_hookstartcontent{#6}\def\CF_hookendcontent{#7}% - \CF_ifinteger{#2}% - {\CF_drawbond{#2}{#4}{#5}\CF_hookstartcontent\CF_hookendcontent - }% - {\CF_assignbondcode{#2}\CF_bondcurrentnum - \CF_drawbond\CF_bondcurrentnum{#4}{#5}\CF_hookstartcontent\CF_hookendcontent - }% - \endgroup -} - -\def\CF_extractatom#1-#2\_nil{#2}% transforme le bound@outnode en n° de l'atome - -\def\CF_gobblemovearg @#1#2\_nil#3{% - \expandafter\def\csname atom_\number\CF_cntatom\endcsname{#2}% - \CF_ifinstr{#1},% - {\CF_analysemovearg#1\_nil#3\let\CF_movebondcoeff\empty}% - {\def#3{#1}}% - \CF_doifempty{#2}{\let\CF_nodestrut\empty}% -}% - -\def\hflipnext{\def\CF_flipstate{1}} - -\def\vflipnext{\def\CF_flipstate{2}} -\let\CF_flipstate\CF_zero - -\def\CF_drawatomgroup#1#2#3{% #1=angle d'arrivée de la liaison #2=numero atome sur lequel arrive la liaison #3=groupe d'atomes - \expandafter\let\expandafter\CF_bondoutcontent% assigne le contenu de l'atome d'où part la liaison - \csname - \ifdefined\CF_bondoutnode - atom_\expandafter\CF_extractatom\CF_bondoutnode\_nil - \else - empty% - \fi - \endcsname - \global\advance\CF_cntgroup1 - \let\CF_currentatom\empty - \global\let\CF_hookdrawlist\empty - \CF_cntatomgroup0 - \CF_iffirsttokmatch{#3}? - {\CF_drawatomgroupa{{}#3}} - {\CF_drawatomgroupa{#3}}% - \def\CF_currentatomgroup{#3}% - \CF_removemovearg\CF_currentatomgroup% enlève les "@{}" - \CF_ifinstr{#3}?% - {\CF_removehook\CF_currentatomgroup - \ifcat\relax\detokenize\expandafter{\romannumeral-`\.\expandafter\noexpand\CF_currentatomgroup}\relax - \let\CF_currentatomgroup\CF_emptynode - \fi - }% - {}% - \CF_doifnotempty{#2} - {\ifnum#2<1 - \CF_warning{no atom found at position #2, pershaps you mispelled the optional argument of the bond.}% - \else - \ifnum#2>\CF_cntatomgroup - \CF_error{no atom found at position #2, pershaps you mispelled the optional argument of the bond.}% - \fi - \fi - }% - \edef\CF_hookatomnumber{% - \CF_ifempty{#2} - {\ifdim#1pt>90pt - \ifdim#1pt<270pt - \number\CF_cntatomgroup - \else - 1% - \fi - \else - 1% - \fi - } - {#2% - }% - }% - \CF_cntatom\CF_hookatomnumber - \CF_ifx\CF_currentatomgroup\CF_emptynode - {\let\CF_nodestrut\empty - } - {\CF_ifx\empty\CF_bondoutcontentsaved - {\def\CF_nodestrut{\vphantom\CF_bondoutcontent}}% - {\def\CF_nodestrut{\vphantom\CF_bondoutcontentsaved}}% - }% - \edef\CF_optstring{anchor=\ifnum\CF_lastaction=0 base\else\ifCF_incycle center\else\ifCF_macrofixedbondlength 180+#1\else center\fi\fi\fi,at=(CF_node),\CF_nodestyle}% premier atome de la molécule affiché - \loop - \unless\ifnum\CF_cntatom>\CF_cntatomgroup - \CF_eexpafter - {\futurelet\CF_toksa} - {\expandafter\expandafter\expandafter\CF_gobtonil\csname atom_\number\CF_cntatom\endcsname\_nil}% - \CF_ifx @\CF_toksa% l'atome courant commence par un "@" - {\CF_threeea\CF_gobblemovearg\csname atom_\number\CF_cntatom\endcsname\_nil\CF_moveatomname - \CF_expafter{\node[}\CF_optstring,overlay](\CF_moveatomname){\phantom{\CF_nodecontent}};% - \let\CF_moveatomname\empty - } - {}% - \CF_expafter{\node[}\CF_optstring](n\number\CF_cntgroup-\number\CF_cntatom){\CF_nodecontent};% - \let\CF_nodestrut\empty - \advance\CF_cntatom1 - \edef\CF_optstring{anchor=base \ifnum\CF_flipstate=1 east\else west\fi,at=(n\number\CF_cntgroup-\number\numexpr\CF_cntatom-1.base \ifnum\CF_flipstate=1 west\else east\fi),\CF_nodestyle}% - \repeat - \CF_cntatom\CF_hookatomnumber - \ifnum\CF_lastaction=2 % s'il faut tracer une liaison - \gdef\CF_cycleanglecorrection{0}% alors c'est qu'un cycle ne peut pas commencer la molécule : annulation de la correction d'angle - \CF_drawbond\CF_bondtype{\CF_bondoutnode}{n\number\CF_cntgroup-\number\CF_cntatom}\CF_previousatomgroup\CF_currentatomgroup - \fi - \def\CF_lastaction{1}% met la dernière action à 1 : affichage d'un noeud - \loop - \ifnum\CF_cntatom>1 - \advance\CF_cntatom-1 - \edef\CF_optstring{anchor=base \ifnum\CF_flipstate=1 west\else east\fi,at=(n\number\CF_cntgroup-\number\numexpr\CF_cntatom+1.base \ifnum\CF_flipstate=1 east\else west\fi),\CF_nodestyle}% - \CF_eexpafter - {\futurelet\CF_toksa} - {\expandafter\expandafter\expandafter\CF_gobtonil\csname atom_\number\CF_cntatom\endcsname\_nil}% - \CF_ifx @\CF_toksa% l'atome courant commence par un "@" - {\CF_threeea\CF_gobblemovearg\csname atom_\number\CF_cntatom\endcsname\_nil\CF_moveatomname - \CF_expafter{\node[}\CF_optstring,overlay](\CF_moveatomname){\phantom{\CF_nodecontent}};% - \let\CF_moveatomname\empty - } - {}% - \CF_expafter{\node[}\CF_optstring](n\number\CF_cntgroup-\number\CF_cntatom){\CF_nodecontent};% - \repeat - \CF_hookdrawall - \edef\CF_lastgroupnumber{\number\CF_cntgroup}% - \let\CF_previousatomgroup\CF_currentatomgroup -} - -\def\CF_keepmovearg @#1#2\_nil{\def\CF_currentatom{@{#1}}} - -\def\CF_drawatomgroupa#1{% transforme #1 en un groupe d'atomes - \CF_ifempty{#1} - {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom - } - {\advance\CF_cntatomgroup1 - \futurelet\CF_toksa\CF_gobtonil#1\_nil - \CF_ifx @\CF_toksa - {\CF_keepmovearg#1\_nil - \CF_removemovearga#1\_nil\CF_aftermovearg - \CF_expsecond\CF_drawatomgroupb{\CF_aftermovearg}% - }% - {\let\CF_currentatom\empty - \CF_drawatomgroupb{#1}% - }% - }% -} - -\def\CF_drawatomgroupb#1{% - \CF_ifempty{#1} - {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom - } - {\futurelet\CF_toksa\CF_gobtonil#1\_nil - \CF_ifx\bgroup\CF_toksa - {\CF_eaddtomacro\CF_currentatom{\expandafter{\CF_firsttonil#1\_nil}}% - \CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}% - }% - {\CF_ifx\CF_sptoken\CF_toksa - {\CF_addtomacro\CF_currentatom{ }% - \CF_expsecond\CF_drawatomgroupba{\CF_afterspace#1\_nil}% - }% - {\CF_eaddtomacro\CF_currentatom{\CF_firsttonil#1\_nil}% - \CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}% - }% - }% - }% -} - -% enlève tous les "@{nom}" de la sc #1 -\def\CF_removemovearg#1{% - \CF_expsecond\CF_ifinstr{#1}@% - {\expandafter\CF_removemovearga#1\_nil#1% - \CF_removemovearg#1% - }% - {}% -} - -% enlève le premier "@{}" de l'argument et l'assigne à #2 -\def\CF_removemovearga#1\_nil#2{% - \def\CF_removemoveargb##1@{% - \CF_expsecond{\def#2}{\CF_gobarg##1}% mange le \relax - \CF_removemoveargc\relax - }% - \def\CF_removemoveargc##1\_nil{\CF_eaddtomacro#2{\CF_gobtwoargs##1}}% mange le \relax et le - \CF_removemoveargb\relax#1\_nil -} - -\def\CF_drawatomgroupba#1{% transforme #1 en un groupe d'atomes - \CF_ifempty{#1} - {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom - \let\CF_currentatom\empty - } - {\futurelet\CF_toksa\CF_gobtonil#1\_nil - \CF_ifx @\CF_toksa - {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom - \let\CF_currentatom\empty - \CF_drawatomgroupa{#1}% - }% - {\CF_ifx|\CF_toksa - {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom - \let\CF_currentatom\empty - \CF_expsecond\CF_drawatomgroupa{\CF_gobarg#1}% - }% - {\CF_ifx\CF_sptoken\CF_toksa - {\CF_addtomacro\CF_currentatom{ }% - \CF_expsecond\CF_drawatomgroupba{\CF_afterspace#1\_nil}% - }% - {\CF_ifx\bgroup\CF_toksa - {\CF_eaddtomacro\CF_currentatom{\expandafter{\CF_firsttonil#1\_nil}}% - \CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}% - }% - {\CF_expsecond\CF_ifcarisupperletter{\CF_firsttonil#1\_nil}% - {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom - \let\CF_currentatom\empty - \CF_drawatomgroupa{#1}% - }% - {\CF_ifx?\CF_toksa - {\CF_expsecond\CF_iffirsttokmatch{\CF_gobarg#1}[% un crochet après le "?" - {\expandafter\CF_graboptarg\CF_gobarg#1\_nil\CF_afterhook}% - {\CF_expafter{\CF_graboptarg[]}{\CF_gobarg#1}\_nil\CF_afterhook}% - \CF_exptwomacroargs\CF_ifinstr{\CF_hooklist}{\expandafter(\CF_hookcurrentname)}% crochet déjà défini ? - {\CF_expsecond\CF_hookparselist{\CF_hookcurrentname}% chercher les caractéristiques du crochet sauvegardé - \CF_edefaddtomacro\CF_hookdrawlist{% - [\CF_hookcurrentname,\CF_hookcurrentlink,\CF_hookcurrenttikz]{\CF_hooksavedcoord}{n\number\CF_cntgroup-\number\CF_cntatomgroup}}% - \CF_eaddtomacro\CF_hookdrawlist{\expandafter{\CF_hooksavedcontent}}% - \CF_eaddtomacro\CF_hookdrawlist{\expandafter{\CF_currentatom}}% ajoute les 4 arguments à la liste des crochets à tracer - \global\let\CF_hookdrawlist\CF_hookdrawlist - }% - {\CF_edefaddtomacro\CF_hooklist{(\CF_hookcurrentname)|n\number\CF_cntgroup-\number\CF_cntatomgroup|}% - \CF_eaddtomacro\CF_hooklist{\CF_currentatom|}% - \global\let\CF_hooklist\CF_hooklist - }% - \CF_expsecond\CF_drawatomgroupba{\CF_afterhook}% - }% - {\CF_eaddtomacro\CF_currentatom{\CF_firsttonil#1\_nil}% - \CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}% - }% - }% - }% - }% - }% - }% - }% -} - -\def\CF_kookdefaultname{a} -\def\CF_hookdefaultlink{-} -\def\CF_hookdefaulttikz{} - -\def\CF_hookparseoptarg#1,#2,#3\_nil{% - \CF_testemptyandassign\CF_hookcurrentname{#1}\CF_kookdefaultname - \CF_testemptyandassign\CF_hookcurrentlink{#2}\CF_hookdefaultlink - \CF_testemptyandassign\CF_hookcurrenttikz{#3}\CF_hookdefaulttikz -} - -\def\CF_graboptarg[#1]#2\_nil#3{% - \CF_hookparseoptarg#1,,\_nil - \def#3{#2}% -} - -\def\CF_hookparselist#1{% #1 est le nom du noeud à retrouver - \def\CF_hookparselista##1(#1)|##2|##3|##4\_nil{\def\CF_hooksavedcoord{##2}\def\CF_hooksavedcontent{##3}}% - \expandafter\CF_hookparselista\CF_hooklist\_nil -} - -\def\CF_removehook#1{% - \CF_expsecond\CF_ifinstr{#1}?% - {\CF_expafter{\CF_removehooka\relax}#1\_nil#1% - \CF_removehook#1% - } - {}% -} - -\def\CF_removehooka#1?#2\_nil#3{% - \CF_iffirsttokmatch{#2}[% - {\CF_removehookb#1?#2\_nil#3} - {\CF_expsecond{\def#3}{\CF_gobarg#1#2}}% -} - -\def\CF_removehookb#1?[#2]#3\_nil#4{\CF_expsecond{\def#4}{\CF_gobarg#1#3}} - -\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}}% - \CF_valuetomacro\CF_lewiswidthdouble[0.3ex]{lewis | width}% - \CF_valuetomacro\CF_lewisoffset [0.4ex]{lewis sep}% - \CF_valuetomacro\CF_lewislength [1.5ex]{lewis length}% - \CF_valuetomacro\CF_lewisstyle []{lewis style}% - \CF_valuetomacro\CF_lewisdist [0.3em]{lewis dist}% - \CF_valuetomacro\CF_lewisradius [0.15ex]{lewis radius}% - \CF_valuetomacro\CF_lewisdiagcoeff [1]{lewis diag coeff}% - \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) - \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 -} - -\def\Chembelow{\begingroup\let\CF_temp\CF_gobarg\CF_chembelowa} - -\def\chembelow{\begingroup\let\CF_temp\CF_id\CF_chembelowa} - -\def\CF_chembelowa{\CF_testopt\CF_chembelowb\CF_stacksep} - -\def\CF_chembelowb[#1]#2#3{% - \setbox\CF_box\hbox{\printatom{#2}}% - \expandafter\vtop\CF_temp{to\ht\CF_box}{% - \offinterlineskip - \hbox{\printatom{#2}}% - \kern#1\relax - \hbox to\wd\CF_box{\hss\printatom{#3}\hss}% - \CF_temp\vss - }% - \endgroup -} - -\def\Chemabove{\begingroup\let\CF_temp\CF_gobarg\CF_chemabovea} - -\def\chemabove{\begingroup\let\CF_temp\CF_id\CF_chemabovea} - -\def\CF_chemabovea{\CF_testopt\CF_chemaboveb\CF_stacksep} - -\def\CF_chemaboveb[#1]#2#3{% - \setbox\CF_box\hbox{\printatom{#2}}% - \expandafter\vbox\CF_temp{to\ht\CF_box}{% - \offinterlineskip - \CF_temp\vss - \hbox to\wd\CF_box{\hss\printatom{#3}\hss}% - \kern#1\relax - \hbox{\printatom{#2}}% - }% - \endgroup -} - -\def\chemmove{\CF_testopt\CF_chemmove{}} - -\def\CF_chemmove[#1]#2{% - \CF_doifnotempty{#2}% - {\expandafter\tikzpicture\romannumeral - \CF_ifempty{#1}% - {\CF_zero[overlay,remember picture,-CF]} - {\CF_zero[overlay,remember picture,-CF,#1]}% - #2 - \endtikzpicture - }% -} - -\def\chemnameinit#1{% - \setbox\CF_boxstuff\hbox{#1}% - \xdef\CF_dpmax{\the\dp\CF_boxstuff}% -} -\let\CF_dpmax\CF_zero - -\def\CF_parsemolname#1\\#2\_nil{% - \hbox to\CF_wdstuffbox{\hss#1\hss}% - \CF_doifnotempty{#2}{\CF_parsemolname#2\_nil}% -} - -\def\chemname{% - \CF_ifstar - {\CF_adjustnamedpfalse\CF_chemnamea} - {\CF_adjustnamedptrue \CF_chemnamea}% -} - -\def\CF_chemnamea{\CF_testopt\CF_chemnameb{1.5ex}} - -\def\CF_chemnameb[#1]#2#3{% - \setbox\CF_boxstuff\hbox{#2}% - \edef\CF_wdstuffbox{\the\wd\CF_boxstuff}\edef\CF_dpstuffbox{\the\dp\CF_boxstuff}% - \leavevmode - \ifdim\CF_dpmax<\CF_dpstuffbox\global\let\CF_dpmax\CF_dpstuffbox\fi - \vtop{% - \box\CF_boxstuff - \nointerlineskip - \kern\dimexpr#1\ifCF_adjustnamedp+\CF_dpmax-\CF_dpstuffbox\fi\relax - \CF_parsemolname#3\\\_nil - }% -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% S C H É M A S R É A C T I O N N E L S %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\let\CF_schemenest\CF_zero - -\def\CF_subscheme{\CF_testopt\CF_subschemea{}} -\def\CF_subschemea[#1]{\CF_testopt{\CF_subschemeb[#1]}{text}} -\def\CF_subschemeb[#1][#2]#3{\schemestart[#1][#2]#3\schemestop} - -\def\chemleft#1#2\chemright#3{% - \leavevmode - \begingroup - \setbox0\hbox{$\vcenter{\hbox{}}$}\edef\CF_delimmathht{\the\ht0}% - \setbox0\hbox{#2}\edef\CF_delimdim{\the\dimexpr(\ht0+\dp0)/2}% - \edef\CF_delimshift{\the\dimexpr(\ht0-\dp0)/2-\CF_delimmathht}% - \raise\CF_delimshift\hbox{$\left#1\vrule height\CF_delimdim depth\CF_delimdim width0pt\right.$}\box0 - \raise\CF_delimshift\hbox{$\left.\vrule height\CF_delimdim depth\CF_delimdim width0pt\right#3$}% - \endgroup -} - -\def\chemright#1{% - \CF_warning{"\string\chemright\string#1" ignored! No \string\chemleft\space previously found.}% -} - -\def\chemup#1#2\chemdown#3{% - \begingroup - \setbox0\hbox{\printatom{#2}}\edef\CF_delimdim{\the\dimexpr\wd0/2}% - \tikzpicture[every node/.style={inner sep=0pt,outer sep=0pt,minimum size=0pt},baseline]% - \node[anchor=base west](chem@stuff){\box0};% - \node[at=(chem@stuff.north),anchor=east,rotate=-90]{$\left#1\vrule height\CF_delimdim depth\CF_delimdim width0pt\right.$};% - \node[at=(chem@stuff.south),anchor=west,rotate=-90]{$\left.\vrule height\CF_delimdim depth\CF_delimdim width0pt\right#3$};% - \endtikzpicture - \endgroup -} - -\def\chemdown#1{% - \CF_warning{"\string\chemdown\string#1" ignored! No \string\chemup\space previously found.}% -} - -\def\CF_setstyle#1,#2,#3\_nil#4#5#6{% - \def#4{#1}\let#5\empty\let#6\empty - \CF_iffirsttokmatch\CF_quark{#2\relax} - {}% - {\def#5{#2}% - \CF_iffirsttokmatch\CF_quark{#3\relax} - {}% - {\CF_setstylea#3\_nil#6}% - }% -} -\def\CF_setstylea#1,\CF_quark#2\_nil#3{\def#3{#1}} - -\def\CF_and{\futurelet\CF_toksa\CF_anda} - -\def\CF_anda{% - \CF_ifx\CF_toksa\bgroup - {\CF_andb} - {\CF_andb{}}% -} - -\def\CF_andb#1{% - \CF_setstyle#1,\CF_quark,\CF_quark\_nil\CF_signspaceante\CF_signspacepost\CF_signvshift - \CF_doifempty\CF_signspaceante{\CF_valuetomacro\CF_signspaceante[0.5em]{+ sep left}}% - \CF_doifempty\CF_signspacepost{\CF_valuetomacro\CF_signspacepost[0.5em]{+ sep right}}% - \CF_doifempty\CF_signvshift{\CF_valuetomacro\CF_signvshift[0pt]{+ vshift}}% - \raise\CF_signvshift\hbox{\kern\CF_signspaceante$+$\kern\CF_signspacepost}% -} - -\def\schemestart{% - \begingroup - \xdef\CF_schemenest{\number\numexpr\CF_schemenest+1}% - \CF_testopt\CF_schemestarta{}% -} - -\def\CF_schemestarta[#1]{% - \CF_valuetomacro\CF_defaultcompoundstyle[]{compound style}% - \CF_setstyle#1,\CF_quark,\CF_quark\_nil\CF_arrowangle\CF_arrowlength\CF_arrowstyle - \CF_doifempty\CF_arrowangle{\CF_valuetomacro\CF_arrowangle[0]{arrow angle}}% - \CF_doifempty\CF_arrowlength{\CF_valuetomacro\CF_arrowlength[1]{arrow coeff}}% - \CF_valuetomacro\CF_defaultarrowstyle[]{arrow style}% - \CF_valuetomacro\CF_arrowoffset[1em]{arrow offset}% - \CF_valuetomacro\CF_compoundsep[5em]{compound sep}% - \CF_valuetomacro\CF_arrowlabelsep[3pt]{arrow label sep}% - \CF_valuetomacro\CF_arrowhead[-CF]{arrow head}% - \CF_eexpsecond{\def\CF_arrowtip}{\expandafter\CF_gobarg\CF_arrowhead}% - \CF_eexpsecond{\CF_preaddtomacro\CF_defaultarrowstyle}{\useKV[chemfig]{arrow head},}% - \CF_ifx\empty\CF_arrowstyle - {\let\CF_arrowstyle\CF_defaultarrowstyle} - {\CF_expsecond{\CF_preaddtomacro\CF_arrowstyle}{\CF_defaultarrowstyle,}}% se rajoute après le style par défaut - \CF_valuetomacro\CF_arrowdoublesep[2pt]{arrow double sep}% - \pgfmathsetmacro\CF_arrowdoublesep{\CF_arrowdoublesep/2}% - \CF_valuetomacro\CF_arrowdoubleposstart[0.6]{arrow double coeff}% - \pgfmathsetmacro\CF_arrowdoubleposstart{(1-\CF_arrowdoubleposstart)/2}% - \pgfmathsetmacro\CF_arrowdoubleposend{1-\CF_arrowdoubleposstart}% - \ifboolKV[chemfig]{scheme debug} - {\tikzpicture[every node/.style={draw,anchor=base,inner sep=0pt,outer sep=0pt,minimum size=1.5pt},baseline,remember picture]} - {\tikzpicture[every node/.style={anchor=base,inner sep=0pt,outer sep=0pt,minimum size=0pt},baseline,remember picture]}% - \let\merge\CF_merge - \expandafter\let\csname+\endcsname\CF_and - \let\arrow\CF_arrow - \let\schemestop\CF_schemestop - \let\subscheme\CF_subscheme - \CF_testopt{\CF_schemestartb}{text}% -} - -\def\CF_schemestartb[#1]{% - \ifnum\CF_schemenest=1 % la commande n'est pas imbriquée ? - \CF_cntcompound0 - \fi - \edef\CF_currentnodename{c\number\CF_cntcompound}% - \let\CF_nextnodename\empty - \let\CF_nextnodestyle\empty - \let\CF_directarrowlist\empty - \ifboolKV[chemfig]{scheme debug} - {\node[fill,green](\CF_currentnodename){};} - {\node(\CF_currentnodename){};}% - \def\CF_nextnodeanchor{#1}% - \CF_doifempty\CF_nextnodeanchor{\def\CF_nextnodeanchor{text}}% - \let\CF_compound\empty - \CF_schemestartc -} - -\def\CF_schemestartc{% - \futurelet\CF_toksa\CF_schemestarte -} - -\expandafter\def\expandafter\CF_schemestartd\space{\futurelet\CF_toksa\CF_schemestarte} - -\def\CF_schemestarte{% ... et l'examine : - \CF_iffirsttokina{\arrow\schemestop\merge}% - {} - {\CF_ifx\CF_toksa\bgroup - {\CF_addnextarg - } - {\CF_ifx\CF_toksa\CF_sptoken - {\CF_addtomacro\CF_compound{ }% - \CF_schemestartd - } - {\afterassignment\CF_schemestartc - \CF_addtomacro\CF_compound - }% - }% - }% -} - -\def\CF_addnextarg#1{\CF_addtomacro\CF_compound{{#1}}\CF_schemestartc} - -\def\CF_displaycompound#1#2{% #1 = nom et #2 = style - \CF_doifnotempty\CF_compound - {\global\advance\CF_cntcompound1 - \CF_ifx\CF_defaultcompoundstyle\empty - {\let\CF_currentnodestyle\empty} - {\CF_expsecond{\def\CF_currentnodestyle}{\CF_defaultcompoundstyle,}}% - \CF_addtomacro\CF_currentnodestyle{anchor=\CF_nextnodeanchor,at=(\CF_currentnodename)}% - \CF_ifempty{#2}% - {\CF_doifnotempty\CF_nextnodestyle - {\CF_eaddtomacro\CF_currentnodestyle{\expandafter,\CF_nextnodestyle}}% - } - {\CF_doifnotempty\CF_nextnodestyle - {\CF_warning{two styles for the same node, first style "\CF_nextnodestyle" ignored}% - }% - \CF_addtomacro\CF_currentnodestyle{,#2}% - }% - \CF_ifempty{#1} - {\edef\CF_temp{% - \CF_ifempty\CF_nextnodename - {c\number\CF_cntcompound} - {\CF_nextnodename}% - }% - } - {\CF_doifnotempty\CF_nextnodename - {\CF_warning{two names for the same node, first name "\CF_nextnodename" ignored}% - }% - \edef\CF_temp{#1}% - }% - \CF_expafter{\node[}\CF_currentnodestyle](\CF_temp){\CF_compound};% - \ifboolKV[chemfig]{scheme debug}% - {\node[draw=none,anchor=270,at=(\CF_temp.90),fill=green!60,overlay,opacity=0.5]{\scriptsize\bfseries\CF_temp};% - } - {}% - \let\CF_currentnodename\CF_temp - }% -} - -\def\CF_schemestop{% - \CF_displaycompound{}{}% - \CF_directarrowlist - \endtikzpicture - \xdef\CF_schemenest{\number\numexpr\CF_schemenest-1}% - \endgroup -} - -\def\CF_analysearrowarg#1{\CF_analysearrowarga#1[]\_nil} - -\def\CF_analysearrowarga#1[#2]#3\_nil{% - \CF_ifinstr{#1}. - {\CF_addtomacro\CF_temp{#1[#2]}} - {\CF_addtomacro\CF_temp{#1.[#2]}}% -} - -\def\CF_arrow{% - \CF_ifnextchar(% - {\CF_arrowa - } - {\CF_ifnextchar\bgroup - {\CF_arrowb(.[]--.[])} - {\CF_arrowb(.[]--.[]){}}% - }% -} - -\def\CF_arrowa(#1--#2){% - \def\CF_temp{(}% - \CF_analysearrowarg{#1}% - \CF_addtomacro\CF_temp{--}% - \CF_analysearrowarg{#2}% - \CF_addtomacro\CF_temp)% - \CF_ifnextchar\bgroup - {\expandafter\CF_arrowb\CF_temp} - {\expandafter\CF_arrowb\CF_temp{}}% -} - -\def\CF_arrowb(#1.#2[#3]--#4.#5[#6])#7{% - \def\CF_currentarrowtype{#7}% nom de la flèche - \CF_doifempty\CF_currentarrowtype{\def\CF_currentarrowtype{->}}% - \CF_testopt{\CF_arrowc(#1.#2[#3]--#4.#5[#6])}{}% -} - -\def\CF_arrowc(#1.#2[#3]--#4.#5[#6])[#7]{% - \def\CF_temp{\CF_arrowe(#1.#2[#3]--#4.#5[#6])}% - \CF_arrowd#7,\empty,\empty\_nil -} - -\def\CF_arrowd#1,#2,#3\_nil{% - \CF_addtomacro\CF_temp{{#1}}% - \CF_eaddtomacro\CF_temp{\expandafter{#2}}% - \expandafter\CF_eaddtomacro\expandafter\CF_temp\expandafter{\expandafter\expandafter\expandafter{\expandafter\CF_sanitizelastitem#3,\empty\_nil}}% - \CF_temp -} - -% #1, #4 : nom des nodes #2, #5 : ancres des nodes #3, #6 : styles des nodes -% #7 : angle flèche #8 : longueur flèche #9 : style tikz de la flèche -\def\CF_arrowe(#1.#2[#3]--#4.#5[#6])#7#8#9{% - \let\CF_arrowcurrentstyle\CF_arrowstyle - \if @\expandafter\CF_firsttonil\detokenize{#1.}\_nil% si #1 commence par @ - \if @\expandafter\CF_firsttonil\detokenize{#4.}\_nil - \CF_eaddtomacro\CF_directarrowlist{\expandafter\CF_directarrow\expandafter{\CF_currentarrowtype}{#1}{#2}{#4}{#5}{#9}}% - \let\CF_nextaction\CF_schemestartc - \else - \CF_doifnotempty\CF_arrowcurrentstyle{\CF_addtomacro\CF_arrowcurrentstyle,}% - \CF_doifnotempty{#9}{\CF_addtomacro\CF_arrowcurrentstyle{#9,}}% - \CF_displaycompound{}{#3}% - \def\CF_nextnodename{#4}% - \CF_expsecond{\def\CF_currentnodename}{\CF_gobarg#1}% - \let\CF_arrowstartname\CF_currentnodename - \let\CF_arrowendname\CF_nextnodename - \CF_arrowf{#7}{#8}{#2}{#5}% - \def\CF_nextnodestyle{#6}% - \fi - \else - \CF_doifnotempty\CF_arrowcurrentstyle{\CF_addtomacro\CF_arrowcurrentstyle,}% - \CF_doifnotempty{#9}{\CF_addtomacro\CF_arrowcurrentstyle{#9,}}% - \if @\expandafter\CF_firsttonil\detokenize{#2.}\_nil - \CF_error{syntax "(--@)" is not allowed}% - \else - \CF_displaycompound{#1}{#3}% - \edef\CF_arrowstartname{% - \CF_ifempty{#1} - \CF_currentnodename - {#1}% - \CF_doifnotempty{#2}{.#2}% - }% - \CF_arrowf{#7}{#8}{#2}{#5}% - \def\CF_nextnodename{#4}% - \def\CF_nextnodestyle{#6}% - \fi - \fi - \CF_arrowgobspaces% mange les espaces puis exécute \CF_nextaction -} - -\def\CF_arrowgobspaces{\futurelet\CF_toksa\CF_arrowgobspacesa} - -\def\CF_arrowgobspacesa{% - \CF_ifx\CF_sptoken\CF_toksa - \CF_arrowgobspacesb - \CF_nextaction -} - -\expandafter\def\expandafter\CF_arrowgobspacesb\space{\futurelet\CF_toksa\CF_arrowgobspacesa} - -\def\CF_arrowf#1#2#3#4{% #1=angle #2=longueur #3=ancre départ #4=ancre arrivée - \def\CF_nextaction{\let\CF_compound\empty\CF_schemestartc}% - \def\CF_arrowcurrentangle{#1}\CF_doifempty\CF_arrowcurrentangle{\let\CF_arrowcurrentangle\CF_arrowangle}% - \def\CF_currentarrowlength{#2}\CF_doifempty\CF_currentarrowlength{\let\CF_currentarrowlength\CF_arrowlength}% - \node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep),cyan,fill](end@arrow@i@\number\CF_schemenest){};% - \edef\CF_arrowendname{end@arrow@i@\number\CF_schemenest\CF_doifnotempty{#4}{.#4}}% - \ifboolKV[chemfig]{scheme debug} - {\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_arrowoffset),red,fill](start@arrow){};% - \node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep-\CF_arrowoffset),red,fill](end@arrow){};% - } - {\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_arrowoffset)](start@arrow){};% - \node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep-\CF_arrowoffset)](end@arrow){};% - }% - \def\CF_arrowstartnode{start@arrow}\def\CF_arrowendnode{end@arrow}% - \csname\expandafter\CF_grabarrowname\CF_currentarrowtype[\_nil\CF_threeea\endcsname - \expandafter\CF_grabarrowargs\CF_currentarrowtype[]\_nil[][][][][][][][]\_nil - \def\CF_currentnodename{end@arrow@i@\number\CF_schemenest}% - \edef\CF_nextnodeanchor{\CF_ifempty{#4}{180+\CF_arrowcurrentangle}{#4}}% -} - -% trace un flèche initiée par (@nom--@nom) -% #1=type de flèche #2=nom depart #3=ancre départ #4=nom arrivée #5=ancre arrivée #6=style flèche -\def\CF_directarrow#1#2#3#4#5#6{% - \CF_expsecond{\def\CF_arrowstartname}{\CF_gobarg#2}% - \CF_expsecond{\def\CF_arrowendname}{\CF_gobarg#4}% - \path[sloped,allow upside down](\CF_gobarg#2\ifx\empty#3\empty\else.#3\fi)--(\CF_gobarg#4\ifx\empty#5\empty\else.#5\fi)% - coordinate[pos=0,xshift=\CF_arrowoffset](start@direct@arrow)% - coordinate[pos=1,xshift=-\CF_arrowoffset](end@direct@arrow);% - \def\CF_arrowstartnode{start@direct@arrow}% - \def\CF_arrowendnode{end@direct@arrow}% - \pgfmathanglebetweenpoints - {\pgfpointanchor{\CF_gobarg#2}{\ifx\empty#3\empty center\else#3\fi}}% Ne pas utiliser \CF_ifempty ici !!! - {\pgfpointanchor{\CF_gobarg#4}{\ifx\empty#5\empty center\else#5\fi}}% - \let\CF_arrowcurrentangle\pgfmathresult - \CF_doifnotempty{#6}{\CF_addtomacro\CF_arrowcurrentstyle{#6,}}% - \csname\CF_grabarrowname#1[]\_nil\expandafter\endcsname\CF_grabarrowargs#1[]\_nil[][][][][][][][]\_nil -} - -\def\CF_mergegrabchardir#1[#2][#3]#4\_nil{% - \CF_expafter{\futurelet\CF_toksa\CF_gobtonil}{\CF_firsttonil#1>\_nil}\_nil - \ifx>\CF_toksa - \def\CF_mergeangle{0}\def\CF_mergeextreme{xmax}\def\CF_mergesign{+}% - \else - \ifx<\CF_toksa - \def\CF_mergeangle{180}\def\CF_mergeextreme{xmin}\def\CF_mergesign{-}% - \else - \ifx^\CF_toksa - \def\CF_mergeangle{90}\def\CF_mergeextreme{ymax}\def\CF_mergesign{+}% - \else - \ifx v\CF_toksa - \def\CF_mergeangle{-90}\def\CF_mergeextreme{ymin}\def\CF_mergesign{-}% - \fi\fi\fi\fi - \def\CF_mergelabelup{#2}\def\CF_mergelabeldo{#3}% -} - -\def\CF_merge#1({% - \CF_mergegrabchardir#1[][]\_nil - \CF_mergea(% -} - -\def\CF_mergea#1--(#2){\CF_testopt{\CF_mergeb#1--(#2)}{}} - -\def\CF_mergeb#1--(#2)[#3]{% - \CF_displaycompound{}{}% - \CF_parsemergeopt#3,\CF_quark,\CF_quark,\CF_quark\_nil - \def\CF_mergexmax{-16383.99999pt}\let\CF_mergeymax\CF_mergexmax - \def\CF_mergexmin{16383.99999pt}\let\CF_mergeymin\CF_mergexmin - \CF_mergeparsenodelist#1(\relax)% calcule les maxi des positions - \pgfmathsetmacro\CF_mergeextremeresult{\csname CF_merge\CF_mergeextreme\endcsname\CF_mergesign\CF_mergefromcoeff*\CF_compoundsep}% - \CF_mergec#1(\relax)% trace les lignes entre les noeuds précédents et la ligne de jonction - \CF_expsecond{\def\CF_temp}{\expandafter[\CF_mergestyle,shorten <=0,shorten >=0,-]}% - \if x\expandafter\CF_firsttonil\CF_mergeextreme\_nil - \CF_addtomacro\CF_temp{(\CF_mergeextremeresult pt,\CF_mergeymax)--(\CF_mergeextremeresult pt,\CF_mergeymin)}% - \else - \CF_addtomacro\CF_temp{(\CF_mergexmin,\CF_mergeextremeresult pt)--(\CF_mergexmax,\CF_mergeextremeresult pt)}% - \fi - \expandafter\draw\CF_temp node[pos=\CF_mergesplitcoeff](merge@point){}% trace la ligne de jonction - node[at=(merge@point),shift=(\CF_mergeangle:\CF_compoundsep*\CF_mergetocoeff-\CF_arrowoffset)](end@merge){}% - node[at=(merge@point),shift=(\CF_mergeangle:\CF_compoundsep*\CF_mergetocoeff)](end@merge@i){};% - \let\CF_arrowcurrentangle\CF_mergeangle - \CF_expafter{\draw[}\CF_mergestyle,shorten <=0](merge@point)--(end@merge)% - \expandafter\CF_arrowdisplaylabela\expandafter{\CF_mergelabelup}{.5}+\expandafter\CF_arrowdisplaylabela\expandafter{\CF_mergelabeldo}{.5}-;% - \def\CF_currentnodename{end@merge@i}% - \let\CF_temp\empty - \CF_analysearrowarg{#2}% - \expandafter\CF_merged\CF_temp\_nil -} - -\def\CF_mergec(#1){% - \if\relax\expandafter\noexpand\CF_firsttonil#1\_nil - \else - \CF_ifdot{#1}% - {\edef\merge_currentnodename{\CF_beforedot#1\_nil}% - \edef\merge_currentanchor{\CF_afterdot#1\_nil}% - }% - {\def\merge_currentnodename{#1}% - \let\merge_currentanchor\CF_mergeangle - }% - \if x\expandafter\CF_firsttonil\CF_mergeextreme\_nil - \pgfextracty\CF_dim{\pgfpointanchor\merge_currentnodename\merge_currentanchor}% - \CF_expafter{\draw[}\CF_mergestyle,shorten >=0,-]([shift=(\CF_mergeangle:\CF_arrowoffset)]\merge_currentnodename.\merge_currentanchor)--(\CF_mergeextremeresult pt,\CF_dim);% - \else - \pgfextractx\CF_dim{\pgfpointanchor\merge_currentnodename\merge_currentanchor}% - \CF_expafter{\draw[}\CF_mergestyle,shorten >=0,-]([shift=(\CF_mergeangle:\CF_arrowoffset)]\merge_currentnodename.\merge_currentanchor)--(\CF_dim,\CF_mergeextremeresult pt);% - \fi - \expandafter\CF_mergec - \fi -} - -\def\CF_merged#1.#2[#3]\_nil{% - \def\CF_nextnodename{#1}% - \edef\CF_nextnodeanchor{% - \CF_ifempty{#2} - {180+\CF_mergeangle} - {#2}% - }% - \def\CF_nextnodestyle{#3}% - \let\CF_compound\empty - \CF_schemestartc -} - -\def\CF_parsemergeopt#1,#2,#3,#4\_nil{% - \CF_ifempty{#1} - {\def\CF_mergefromcoeff{0.5}} - {\def\CF_mergefromcoeff{#1}}% - \def\CF_mergetocoeff{0.5}% - \def\CF_mergesplitcoeff{0.5}% - \CF_eexpsecond{\def\CF_mergestyle}{\useKV[chemfig]{arrow head}}% - \CF_iffirsttokmatch\CF_quark{#2\relax} - {} - {\CF_ifempty{#2} - {\def\CF_mergetocoeff{0.5}} - {\def\CF_mergetocoeff{#2}}% - \CF_iffirsttokmatch\CF_quark{#3\relax} - {} - {\CF_ifempty{#3} - {\def\CF_mergesplitcoeff{0.5}} - {\def\CF_mergesplitcoeff{#3}}% - \CF_iffirsttokmatch\CF_quark{#4\relax} - {} - {\CF_parsemergeopta#4\_nil}% - }% - }% -} - -\def\CF_parsemergeopta#1,\CF_quark#2\_nil{% - \CF_ifempty{#1} - {} - {\CF_addtomacro\CF_mergestyle{,#1}}% -} - -\def\CF_mergeparsenodelist(#1){% - \if\relax\expandafter\noexpand\CF_firsttonil#1\_nil - \else - \CF_ifdot{#1}% - {\edef\merge_currentnodename{\CF_beforedot#1\_nil}\edef\merge_currentanchor{\CF_afterdot#1\_nil}}% - {\def\merge_currentnodename{#1}\let\merge_currentanchor\CF_mergeangle}% - \pgfextractx\CF_dim{\pgfpointanchor\merge_currentnodename\merge_currentanchor}% - \ifdim\CF_dim>\CF_mergexmax - \edef\CF_mergexmax{\the\CF_dim}% - \fi - \ifdim\CF_dim<\CF_mergexmin - \edef\CF_mergexmin{\the\CF_dim}% - \fi - \pgfextracty\CF_dim{\pgfpointanchor\merge_currentnodename\merge_currentanchor}% - \ifdim\CF_dim>\CF_mergeymax - \edef\CF_mergeymax{\the\CF_dim}% - \fi - \ifdim\CF_dim<\CF_mergeymin - \edef\CF_mergeymin{\the\CF_dim}% - \fi - \expandafter\CF_mergeparsenodelist - \fi -} - -\def\CF_grabarrowname#1[#2\_nil{\detokenize{CF_arrow(#1)}} -\def\CF_grabarrowargs#1[#2\_nil{[#2} - -\def\CF_makeparametertext#1{% - \toks0{}% - \CF_cntgroup#1\relax - \CF_makeparametertexta1% -} - -\def\CF_makeparametertexta#1{% - \unless\ifnum#1>\CF_cntgroup - \toks0\expandafter{\the\toks0[###1]}% - \expandafter\CF_makeparametertexta\expandafter{\number\numexpr#1+1\expandafter}% - \fi -} - -% #1 est le nombre d'arguments optionnels, #2 est le nom et #3 le code -\def\definearrow#1#2#3{% - \begingroup - \CF_makeparametertext{#1}% - \expandafter\endgroup - \expandafter\def\csname\detokenize{CF_arrow(#2)}\expandafter\endcsname\the\toks0{#3\CF_gobtonil}% -} - -\def\CF_ifdot#1{\CF_ifdota#1.\_nil} -\def\CF_ifdota#1.#2\_nil{\ifx\empty#2\empty\expandafter\CF_execsecond\else\expandafter\CF_execfirst\fi} -\def\CF_beforedot#1.#2\_nil{#1} -\def\CF_afterdot#1.#2\_nil{#2} - -\def\CF_rotatenode*#1#2\_nil{% - \CF_ifdot{#1} - {\CF_beforedot#1\_nil} - {#1}% -} -\def\CF_anchornode*#1#2\_nil#3{% - \CF_ifdot{#1} - {\CF_afterdot#1\_nil} - {\CF_arrowcurrentangle-#390-#1}% -} - -% #1 = label #2 = position #3 = + ou - (au dessus ou au dessous) #4 : nom du noeud de départ -% #5 = label #6 = position #7 = + ou - (au dessus ou au dessous) #8 : nom du noeud de fin -\def\CF_arrowdisplaylabel#1#2#3#4#5#6#7#8{% - \CF_doifnotempty{#1#5} - {\path(#4)--(#8)\CF_arrowdisplaylabela{#1}{#2}{#3}\CF_arrowdisplaylabela{#5}{#6}{#7};}% -} - -\def\CF_arrowdisplaylabela#1#2#3{% - \CF_doifnotempty{#1} - {\if*\expandafter\CF_firsttonil\detokenize{#1}\_nil - \ifboolKV[chemfig]{scheme debug} - {node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep,draw,fill,cyan](shifted@node){}% - node[draw,rotate=\CF_rotatenode#1\_nil,anchor=\CF_anchornode#1\_nil#3,at=(shifted@node)]{\expandafter\CF_gobarg\CF_gobarg#1}% - } - {node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep](shifted@node){}% - node[rotate=\CF_rotatenode#1\_nil,anchor=\CF_anchornode#1\_nil#3,at=(shifted@node)]{\expandafter\CF_gobarg\CF_gobarg#1}% - }% - \else - \ifboolKV[chemfig]{scheme debug} - {node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep,draw,fill,cyan](shifted@node){}% - node[draw,pos=#2,anchor=-#390,sloped,yshift=#3\CF_arrowlabelsep]{#1}% - } - {node[pos=#2,anchor=-#390,sloped,yshift=#3\CF_arrowlabelsep]{#1}% - } - \fi - }% -} - -% pose des noeuds décalés de la dimension #1 à (\CF_arrowstartnode) et (\CF_arrowendnode) -\def\CF_arrowshiftnodes#1{% - \unless\ifdim\CF_ifempty{#1}\CF_zero{#1}=0pt - \edef\CF_temp{% - \noexpand\path(\CF_arrowstartnode)--(\CF_arrowendnode)% - node[pos=0,sloped,yshift=#1](\CF_arrowstartnode1){}node[pos=1,sloped,yshift=#1](\CF_arrowendnode1){};}% - \CF_temp - \edef\CF_arrowstartnode{\CF_arrowstartnode1}\edef\CF_arrowendnode{\CF_arrowendnode1}% - \fi -} - -\definearrow3{->}{% - \CF_arrowshiftnodes{#3}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode)--(\CF_arrowendnode);% - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode -} - -\definearrow3{<-}{% - \CF_arrowshiftnodes{#3}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowendnode)--(\CF_arrowstartnode);% - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode -} - -\definearrow5{-/>}{% - \CF_arrowshiftnodes{#3}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode)--(\CF_arrowendnode)% - coordinate[midway,shift=(\CF_arrowcurrentangle:-1pt)](midway@i)% - coordinate[midway,shift=(\CF_arrowcurrentangle:1pt)](midway@ii)% - coordinate[at=(midway@i),shift=(\CF_ifempty{#4}{225}{#4+180}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line@start)% - coordinate[at=(midway@i),shift=(\CF_ifempty{#4}{45}{#4}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line@end)% - coordinate[at=(midway@ii),shift=(\CF_ifempty{#4}{225}{#4+180}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line@start@i)% - coordinate[at=(midway@ii),shift=(\CF_ifempty{#4}{45}{#4}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line@end@i); - \draw(line@start)--(line@end);% - \draw(line@start@i)--(line@end@i);% - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode -} - -\definearrow3{<->}{% - \CF_arrowshiftnodes{#3}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle,\CF_arrowtip-\CF_arrowtip](\CF_arrowstartnode)--(\CF_arrowendnode);% - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode -} - -\definearrow3{<=>}{% - \CF_arrowshiftnodes{#3}% - \path[allow upside down](\CF_arrowstartnode)--(\CF_arrowendnode)% - node[pos=0,sloped,yshift=\CF_arrowdoublesep](\CF_arrowstartnode @u0){}% - node[pos=0,sloped,yshift=-\CF_arrowdoublesep](\CF_arrowstartnode @d0){}% - node[pos=1,sloped,yshift=\CF_arrowdoublesep](\CF_arrowstartnode @u1){}% - node[pos=1,sloped,yshift=-\CF_arrowdoublesep](\CF_arrowstartnode @d1){};% - \begingroup - \ifboolKV[chemfig]{arrow double harpoon} - {\pgfarrowharpoontrue} - {}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @u0)--(\CF_arrowstartnode @u1);% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @d1)--(\CF_arrowstartnode @d0);% - \endgroup - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode% -} - -\definearrow3{<->>}{% - \CF_arrowshiftnodes{#3}% - \path[allow upside down](\CF_arrowstartnode)--(\CF_arrowendnode)% - node[pos=0,sloped,yshift=1pt](\CF_arrowstartnode @u0){}% - node[pos=\CF_arrowdoubleposstart,sloped,yshift=-1pt](\CF_arrowstartnode @d0){}% - node[pos=1,sloped,yshift=1pt](\CF_arrowstartnode @u1){}% - node[pos=\CF_arrowdoubleposend,sloped,yshift=-1pt](\CF_arrowstartnode @d1){};% - \begingroup - \ifboolKV[chemfig]{arrow double harpoon} - {\pgfarrowharpoontrue} - {}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @u0)--(\CF_arrowstartnode @u1);% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @d1)--(\CF_arrowstartnode @d0);% - \endgroup - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode% -} - -\definearrow3{<<->}{% - \path[allow upside down](\CF_arrowstartnode)--(\CF_arrowendnode)% - node[pos=\CF_arrowdoubleposstart,sloped,yshift=1pt](\CF_arrowstartnode @u0){}% - node[pos=0,sloped,yshift=-1pt](\CF_arrowstartnode @d0){}% - node[pos=\CF_arrowdoubleposend,sloped,yshift=1pt](\CF_arrowstartnode @u1){}% - node[pos=1,sloped,yshift=-1pt](\CF_arrowstartnode @d1){};% - \begingroup - \ifboolKV[chemfig]{arrow double harpoon} - {\pgfarrowharpoontrue} - {}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @u0)--(\CF_arrowstartnode @u1);% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @d1)--(\CF_arrowstartnode @d0);% - \endgroup - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode -} - -\definearrow30{% - \CF_arrowshiftnodes{#3}% - \CF_arrowdisplaylabel{#1}{0.5}+\CF_arrowstartnode{#2}{0.5}-\CF_arrowendnode -} - -\definearrow5{-U>}{% - \CF_arrowshiftnodes{#3}% - \CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode)--(\CF_arrowendnode)node[midway](Uarrow@arctangent){};% - \CF_ifempty{#4} - {\def\CF_Uarrowradius{0.333}} - {\def\CF_Uarrowradius{#4}}% - \CF_ifempty{#5}% - {\def\CF_Uarrowabsangle{60}} - {\pgfmathsetmacro\CF_Uarrowabsangle{abs(#5)}}% ne prendre en compte que la valeur absolue de l'angle - \edef\CF_temp{[\CF_ifempty{#1}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}},-]}% - \expandafter\draw\CF_temp (Uarrow@arctangent)% - arc[radius=\CF_compoundsep*\CF_currentarrowlength*\CF_Uarrowradius,start angle=\CF_arrowcurrentangle-90,delta angle=-\CF_Uarrowabsangle]node(Uarrow@start){}; - \edef\CF_temp{[\CF_ifempty{#2}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}}]}% - \expandafter\draw\CF_temp (Uarrow@arctangent)% - arc[radius=\CF_compoundsep*\CF_currentarrowlength*\CF_Uarrowradius,start angle=\CF_arrowcurrentangle-90,delta angle=\CF_Uarrowabsangle]node(Uarrow@end){}; - \pgfmathsetmacro\CF_temp{\CF_Uarrowradius*cos(\CF_arrowcurrentangle)<0?"-":"+"}% - \ifdim\CF_Uarrowradius pt>0pt - \CF_arrowdisplaylabel{#1}{0}\CF_temp{Uarrow@start}{#2}{1}\CF_temp{Uarrow@end}% - \else - \CF_arrowdisplaylabel{#2}{0}\CF_temp{Uarrow@start}{#1}{1}\CF_temp{Uarrow@end}% - \fi -} - -\def\CF_grabdelim#1#2#3\_nil{\def\CF_leftdelim{#1}\def\CF_rightdelim{#2}} -\def\CF_resetdelim{% - \setKVdefault[CFdelimiters] - {delimiters =(), - height =10pt, - depth =, - open xshift =0pt, - close xshift=, - indice =n}% -} - -\CF_resetdelim - -\def\polymerdelim{\CF_ifnextchar[{\CF_polymerdelima}{\CF_polymerdelima[]}} -\def\CF_polymerdelima[#1]#2#3{% - \CF_resetdelim - \CF_doifnotempty{#1}{\setKV[CFdelimiters]{#1}}% - \expandafter\expandafter\expandafter\CF_grabdelim\useKV[CFdelimiters]{delimiters}()\_nil - \edef\CF_delimheight{\the\dimexpr\useKV[CFdelimiters]{height}}% - \CF_eexpsecond\CF_ifempty{\useKV[CFdelimiters]{depth}} - {\let\CF_delimdepth\CF_delimheight} - {\edef\CF_delimdepth{\the\dimexpr\useKV[CFdelimiters]{depth}}}% - \edef\CF_delimhalfdim{\the\dimexpr(\CF_delimheight+\CF_delimdepth)/2}% - \edef\CF_delimvshift {\the\dimexpr(\CF_delimheight-\CF_delimdepth)/2}% - \edef\CF_leftdelimxshift{\the\dimexpr\useKV[CFdelimiters]{open xshift}}% - \CF_eexpsecond\CF_ifempty{\useKV[CFdelimiters]{close xshift}} - {\edef\CF_rightdelimxshift{\the\dimexpr-\useKV[CFdelimiters]{open xshift}}} - {\edef\CF_rightdelimxshift{\the\dimexpr-\useKV[CFdelimiters]{close xshift}}}% - \chemmove{% - \nulldelimiterspace0pt - \pgfextractx\CF_dim{\pgfpointanchor{#2}{center}}\edef\CF_leftdelimx{\the\CF_dim}% - \pgfextracty\CF_dim{\pgfpointanchor{#2}{center}}\edef\CF_leftdelimy{\the\CF_dim}% - \pgfextractx\CF_dim{\pgfpointanchor{#3}{center}}\edef\CF_rightdelimx{\the\CF_dim}% - \node[at={(\CF_leftdelimx+\CF_leftdelimxshift,\CF_leftdelimy+\CF_delimvshift)}] - {$\left\CF_leftdelim\vrule height\CF_delimhalfdim depth\CF_delimhalfdim width0pt\right.$};% - \node[at={(\CF_rightdelimx+\CF_rightdelimxshift,\CF_leftdelimy+\CF_delimvshift)}] - {$\left.\vrule height\CF_delimhalfdim depth\CF_delimhalfdim width0pt\right\CF_rightdelim - \CF_eexpsecond\CF_doifnotempty{\useKV[CFdelimiters]{indice}} - {\CF_underscore{\rlap{$\scriptstyle\useKV[CFdelimiters]{indice}$}}} - $}; - }% -} - -\catcode`\@11 -\pgfdeclarearrow{% - name = CF,% - defaults = {% - length = 3pt 5 1,% - width' = 0pt .8,% - inset' = 0pt .5,% - line width = 0pt 1 1,% - round% - },% - setup code = {% - % Cap the line width at 1/4th distance from inset to tip - \pgf@x\pgfarrowlength - \advance\pgf@x by-\pgfarrowinset - \pgf@x.25\pgf@x - \ifdim\pgf@x<\pgfarrowlinewidth\pgfarrowlinewidth\pgf@x\fi - % Compute front miter length: - \pgfmathdivide@{\pgf@sys@tonumber\pgfarrowlength}{\pgf@sys@tonumber\pgfarrowwidth}% - \let\pgf@temp@quot\pgfmathresult% - \pgf@x\pgfmathresult pt% - \pgf@x\pgfmathresult\pgf@x% - \pgf@x4\pgf@x% - \advance\pgf@x by1pt% - \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}% - \pgf@xc\pgfmathresult\pgfarrowlinewidth% xc is front miter - \pgf@xc.5\pgf@xc - \pgf@xa\pgf@temp@quot\pgfarrowlinewidth% xa is extra harpoon miter - % Compute back miter length: - \pgf@ya.5\pgfarrowwidth% - \csname pgfmathatan2@\endcsname{\pgfmath@tonumber\pgfarrowlength}{\pgfmath@tonumber\pgf@ya}% - \pgf@yb\pgfmathresult pt% - \csname pgfmathatan2@\endcsname{\pgfmath@tonumber\pgfarrowinset}{\pgfmath@tonumber\pgf@ya}% - \pgf@ya\pgfmathresult pt% - \advance\pgf@yb by-\pgf@ya% - \pgf@yb.5\pgf@yb% half angle in yb - \pgfmathtan@{\pgf@sys@tonumber\pgf@yb}% - \pgfmathreciprocal@{\pgfmathresult}% - \pgf@yc\pgfmathresult\pgfarrowlinewidth% - \pgf@yc.5\pgf@yc% - \advance\pgf@ya by\pgf@yb% - \pgfmathsincos@{\pgf@sys@tonumber\pgf@ya}% - \pgf@ya\pgfmathresulty\pgf@yc% ya is the back miter - \pgf@yb\pgfmathresultx\pgf@yc% yb is the top miter - \ifdim\pgfarrowinset=0pt - \pgf@ya.5\pgfarrowlinewidth% easy: back miter is half linewidth - \fi - % Compute inset miter length: - \pgfmathdivide@{\pgf@sys@tonumber\pgfarrowinset}{\pgf@sys@tonumber\pgfarrowwidth}% - \let\pgf@temp@quot\pgfmathresult% - \pgf@x\pgfmathresult pt% - \pgf@x\pgfmathresult\pgf@x% - \pgf@x4\pgf@x%\pgf@ya - \advance\pgf@x by1pt% - \pgfmathsqrt@{\pgf@sys@tonumber\pgf@x}% - \pgf@yc\pgfmathresult\pgfarrowlinewidth% yc is inset miter - \pgf@yc.5\pgf@yc% - % Inner length (pgfutil@tempdima) is now arrowlength - front miter - back miter - \pgfutil@tempdima\pgfarrowlength% - \advance\pgfutil@tempdima by-\pgf@xc% - \advance\pgfutil@tempdima by-\pgf@ya% - \pgfutil@tempdimb.5\pgfarrowwidth% - \advance\pgfutil@tempdimb by-\pgf@yb% - % harpoon miter correction - \ifpgfarrowroundjoin - \pgfarrowssetbackend{\pgf@ya\advance\pgf@x by-.5\pgfarrowlinewidth}% - \else - \pgfarrowssetbackend{0pt} - \fi - \ifpgfarrowharpoon - \pgfarrowssetlineend{\pgfarrowinset\advance\pgf@x by\pgf@yc\advance\pgf@x by.5\pgfarrowlinewidth}% - \else - \pgfarrowssetlineend{\pgfarrowinset\advance\pgf@x by\pgf@yc\advance\pgf@x by-.25\pgfarrowlinewidth}% - \ifpgfarrowreversed - \ifdim\pgfinnerlinewidth>0pt - \pgfarrowssetlineend{\pgfarrowinset}% - \else - \pgfarrowssetlineend{\pgfutil@tempdima\advance\pgf@x by\pgf@ya\advance\pgf@x by-.25\pgfarrowlinewidth}% - \fi - \fi - \fi - \ifpgfarrowroundjoin - \pgfarrowssettipend{\pgfutil@tempdima\advance\pgf@x by\pgf@ya\advance\pgf@x by.5\pgfarrowlinewidth}% - \else - \pgfarrowssettipend{\pgfarrowlength\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi}% - \fi - % The hull: - \pgfarrowshullpoint{\pgfarrowlength\ifpgfarrowroundjoin\else\ifpgfarrowharpoon\advance\pgf@x by\pgf@xa\fi\fi}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else0pt\fi}% - \pgfarrowsupperhullpoint{0pt}{.5\pgfarrowwidth}% - \pgfarrowshullpoint{\pgfarrowinset}{\ifpgfarrowharpoon-.5\pgfarrowlinewidth\else 0pt\fi}% - % Adjust inset - \pgfarrowssetvisualbackend{\pgfarrowinset}% - \advance\pgfarrowinset by\pgf@yc% - % The following are needed in the code: - \pgfarrowssavethe\pgfutil@tempdima - \pgfarrowssavethe\pgfutil@tempdimb - \pgfarrowssavethe\pgfarrowlinewidth - \pgfarrowssavethe\pgf@ya - \pgfarrowssavethe\pgfarrowinset - },% - drawing code = {% - \pgfsetdash{}{0pt}% - \ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi - \ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{\pgfarrowlinewidth}\fi - \pgfpathmoveto{\pgfqpoint{\pgfutil@tempdima\advance\pgf@x by\pgf@ya}{0pt}}% - \pgfpathlineto{\pgfqpoint{\pgf@ya}{\pgfutil@tempdimb}}% - \pgfpathlineto{\pgfqpoint{\pgfarrowinset}{0pt}}% - \ifpgfarrowharpoon \else - \pgfpathlineto{\pgfqpoint{\pgf@ya}{-\pgfutil@tempdimb}}% - \fi - \pgfpathclose - \ifpgfarrowopen\pgfusepathqstroke\else\ifdim\pgfarrowlinewidth>0pt \pgfusepathqfillstroke\else\pgfusepathqfill\fi\fi - },% - parameters = {% - \the\pgfarrowlinewidth,% - \the\pgfarrowlength,% - \the\pgfarrowwidth,% - \the\pgfarrowinset,% - \ifpgfarrowharpoon h\fi% - \ifpgfarrowopen o\fi% - \ifpgfarrowroundjoin j\fi% - }% -} -\CFrestorecatcode -\endinput - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% H I S T O R I Q U E %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -v0.1 2010/06/23 - - Première version publique sur le CTAN ----------------------------------------------------------------------- -v0.2 2010/08/31 - - Ajout de la documentation en anglais. - - Correction de bugs. - - \printatom est désormais une macro publique. - - Les espaces sont permis dans les molécules. Ils seront - ignorés par défaut puisque les atomes sont composés en - mode math par \printatom - - Une paire de Lewis peut être représentée ":". - - Dans les cycles, une correction de la longueur du trait - déporté des liaisons doubles est fait de telle sorte que si - l'on écrit \chemfig{*5(=====)}, on obtient deux polygones - réguliers concentriques. - - La séquence de contrôle \setnodestyle permet de spécifier - le style des n?uds dessinés par tikz. ----------------------------------------------------------------------- -v0.3 2010/11/21 - - Amélioration de \definesubmol qui accepte les séquences de - contrôle. On peut aussi choisir un alias dont la substitution - est différente selon l'orientation de la liaison qui lui - arrive dessus. - - Le caractère "|" force la fin d'un atome. Si on écrit - "D|ef" alors, chemfig verra deux atomes "D" et "ef". - - Le caractère "#" est reconnu lorsqu'il suit un caractère de - liaison. Il doit être suivi d'un argument entre parenthèses - qui contient l'offset de début et de fin qui s'appliqueront - à cette liaison. - - La macro \chemfig admet un argument optionnel qui sera passé - à l'environnement tikzpicture dans lequel elle est dessinée - - Mise en place de la représentation des mécanismes - réactionnels avec la syntaxe "@{}" devant un atome où - "@{,}" au tout début de l'argument d'une liaison. - Cette syntaxe permet de placer un n?ud (au sens de tikz) qui - deviendra l'extrémité des flèches des mécanismes. - Le tracé des flèches est faite par la macro \chemmove dont - l'argument optionnel devient celui de l'environnement - tikzpicture dans lequel sont faites les flèches. - - Pour le mécanisme d'alignement vertical via le \vphantom, la - commande \chemskipalign permet d'ignorer le groupe d'atomes - dans lequel elle est écrite. - - La commande \chemname permet d'afficher un nom sous une - molécule. la commande \chemnameinit initialise la plus grande - profondeur rencontrée. - - La commande \lewis a été modifiée de telle sorte que les - dessins des décorations soient proportionnels à la taille - de la police. ----------------------------------------------------------------------- -v0.3a 2011/01/08 - - Correction d'un bug dans l'argument optionnel de \definesubmol - lorsque celui-ci comporte des crochets. - - Mise à jour du manuel en anglais. - - Ajout de \vflipnext et \hflipnext pour retourner - horizontalement ou verticalement la prochaine molécule. ----------------------------------------------------------------------- -v0.4 2011/03/07 - - chemfig est désormais écrit en plain-etex et donc - utilisable par d'autres formats que LaTeX. - - Un peu plus de rigueur avec les catcodes des caractères - spéciaux, notamment lorsque la commande \chemfig se trouve - dans l'argument de \chemmove, \chemabove, \chembelow, \chemrel. - TODO : faut-il \scantoker l'argument de \chemfig pour être - définitivement débarrassé de ces histoires de catcode ??? - - Correction d'un bug dans le calcul de l'angle des liaisons ----------------------------------------------------------------------- -v0.4a 2011/04/10 - - Correction d'un bug concernant l'argument optionnel en début - de molécule. ----------------------------------------------------------------------- -v0.4b 2011/04/24 - - l'argument de \chemfig est tokénisé avec \scantokens ce qui - rend caduc tout souci de code de catégorie, à part #. - - la commande \setbondstyle permet de définir le style des - liaisons. - - correction de l'affichage incorrect des doubles liaisons dans - les cycles après les commandes \hflipnext et \vflipnext - - correction d'un bug lorsqu'un alias commence une molécule ----------------------------------------------------------------------- -v1.0 2011/06/15 - - les schémas réactionnels sont désormais disponibles. - - \Chemabove et \Chembelow modifient la boite englobante. - - \Lewis modifie la boite englobante - - les macros \chemleft, \chemright, \chemup et \chemdown - affichent des délimiteurs extensibles à gauche, à droite, - au dessus et au dessous d'un matériel. ----------------------------------------------------------------------- -v1.0a 2011/09/18 - - les macros \Lewis et \lewis admettent un argument optionnel - - la macro \setlewisdist règle la distance entre les 2 - électrons ----------------------------------------------------------------------- -v1.0b 2011/11/29 - - la commande \merge est désormais protégée entre - \schemestart et \schemestop contre des définitions par d'autres - packages. - - \box0 est utilisé au lieu du maladroit \unhbox0 ----------------------------------------------------------------------- -v1.0c 2011/11/30 - - la macro \+ n'est plus explicitement écrite - - vérifie que eTeX est le moteur utilisé ----------------------------------------------------------------------- -v1.0d 2011/12/19 - - les cercles des cycles étaient tracés au mauvais moment. La - longueur de la liaison qui les précédait influait sur le - rayon du cercle : \chemfig{-[,0.5]**6(------)} donnait un bug - à l'affichage. ----------------------------------------------------------------------- -v1.0e 2012/01/13 - - la gestion des espaces dans les groupes d'atomes est - désormais plus rigoureuse. Plusieurs bugs ont été - corrigé ----------------------------------------------------------------------- -v1.0f 2012/02/24 - - correction d'un bug avec \definesubmol, les catcodes n'étaient - pas correctement gérés. ----------------------------------------------------------------------- -v1.0g 2012/11/16 - - correction d'un bug dans \CF_directarrow pour faire prendre en - compte le style des flèche par défaut - - correction d'un bug dans \CF_lewisc : la boite *doit* être - composée en dehors de l'environnement tikzpicture pour - éviter nullfont si jamais \printatom ne passe pas en mode - math. - - correction d'un bug dans \CF_chemfigc : si une longueur par - défaut est modifiée par [,] au début d'une molécule - et si des cycles étaient emboités, cette longueur n'était - pas appliquée aux sous-cycles. - - ré-écriture des macros \chemabove et \chembemow pour - prendre en compte le bug (désormais corrigé) dans luatex. - - nouvelle macro \setstacksep qui définit l'espacement par - défaut dans les macros \chemabove et \chembelow. ----------------------------------------------------------------------- -v1.0h 2013/11/28 - - \chemname admet maintenant une version étoilé qui ne tient - pas compte des profondeurs précédentes. - - \CF_dpmax est géré globalement. - - correction d'un bug dans "-U>" : le style de la flèche - n'était pris en compte pour l'arc. - - correction d'un bug dans \CF_directarrow : l'angle de la - flèche n'était pas calculé ----------------------------------------------------------------------- -v1.1 2015/02/13 - - correction d'un bug dans \CF_seeksubmol : la macro - \CF_molecule est dépouillé de son éventuel espace - en première position. - - correction d'un bug dans \CF_arrowf : le nom du prochain - n?ud courant "end@arrow@i" était erroné dans le cas où une - flèche contenait un sous schéma. Ce nom doit dépendre de - \CF_schemenest. - - la jonction entre deux liaisons consécutives dans l'axe peut - être activé avec \enablebondjoin et désactivé avec - \disablebondjoin (préférable, état par défaut). - - \chemfig suivi d'une "*" demande à ce que les liaisons aient - une longueur invariable : la distance inter-atome devient donc - variable. Cette fonctionnalité est désactivé dans les - cycles afin que les polygones soient réguliers. - \enablefixedbondlength permet cette fonctionnalité pour - toutes les macros \chemfig (même non étoilée) tandis que - \disablefixedbondlength le désactive. ----------------------------------------------------------------------- -v1.1a 2015/02/23 - - correction d'un bug dans \CF_grabbondoffset. Si \chemfig est - dans l'argument d'une macro, les # sont doublés par l'action - de \scantokens de la macro \CF_chemfigb et il faut un - argument délimité avant "(" pour absorber tous les #. ----------------------------------------------------------------------- -v1.2 2015/10/08 - - correction d'un bug dans le tracé des liaisons de Cram. - - création de \setangleincrement. - - chargement de "arrows.meta" et définition de la flèche "CF" - basée sur "Stealth" et définie avec \pgfdeclarearrow. - Les anciennes flèches "CF_full" et "CF_half" sont - abandonnées puisque définies avec \pgfarrowsdeclare. - - flèche "-U>" corrigée : le placement des labels est - maintenant correct dans tous les cas. Ainsi : - -U>[][][][r][a] - place le label près du début de la flèche, quels que - soient les signes du rayon r et de l'angle a. - - \chemrel, \setchemrel et \chemsign sont supprimées. - - compatibilité, avec les limitations d'usage, avec la - librairie "externalize" : le \begin{tikzpicture} voit - désormais le \end{tikzpicture} correspondant dans la macro - \CF_chemfigb. ----------------------------------------------------------------------- -v1.2a 2015/10/21 - - erreur de copier-coller dans le code: une adresse url était - malencontreusement présente en plein milieu d'une ligne de - code ----------------------------------------------------------------------- -v1.2b 2015/11/15 - - bug dans \CF_seeksubmol qui laissait "*" dans le flux de - lecture de TeX. Un message d'erreur est également ajouté - en cas de "!" en fin de traitement. - - correction d'un bug dans \CF_setbondangle où l'angle [<:a>] - n'était pas évalué par \pgfmathsetmacro. ----------------------------------------------------------------------- -v1.2c 2015/11/20 - - Correction d'un bug dans \CF_setbondangle : l'angle renvoyé - pouvait être négatif - - Correction d'un bug dans \CF_directarrow : la macro \CF_ifempty - n'est pas correctement développée dans l'argument de - \pgfpointanchor ----------------------------------------------------------------------- -v1.2d 2015/12/01 - - correction d'un bug dans la flèche "-U" - - la version étoilée de \setcrambond dessine les liaisons de - Cram en pointillés sous forme de trait large et non pas sous - forme de triangle. ----------------------------------------------------------------------- -v1.2e 2017/05/20 - - la macro contenant la définition d'une flèche est - désormais "\CF_arrow()", ainsi la macro \0 n'est plus - définie par \definearrow - - remerciements rajoutés après une suppression indue, pour ne - froisser aucune susceptibilité ----------------------------------------------------------------------- -v1.3 2018/03/08 - - tous les paramètres sont désormais passés via \setchemfig qui - fait appel à "simplekv". Par conséquent, _toutes_ les macros qui - réglaient des paramètres deviennent obsolètes, à savoir : - \setcrambond, \setatomsep, \setbondoffset, \setdoublesep, - \setangleincrement, \enablefixedbondlength, - \disablefixedbondlength, \setnodestyle, \setbondstyle, - \setlewis, \setlewisdist, \setstacksep, \setcompoundstyle, - \setarrowdefault, \setandsign, \setarrowoffset, - \setcompoundsep, \setarrowlabelsep, \enablebondjoin, - \disablebondjoin et \schemedebug. - et ces macros seront *supprimées* dans une future version. - - la version étoilée "\chemfig*" et les deux arguments optionnels - de la macro "\chemfig[][]" sont également optionnels et seront - *supprimé*s dans une future version afin d'accéder à la syntaxe - \chemfig[clés=valeurs]{code} - - 6 nouveaux paramètres : "lewis radius", "arrow double sep", - "arrow double coeff", "arrow double harpoon", "cycle radius - coeff", "arrow head". - - correction d'un bug dans \CF_parsemergeopt qui dans certains - cas, envoyait vers l'affichage des caractères - - petit toilettage du code - - macro \polymerdelim (non documentée) expérimentale et encore - en phase de tests - - suppression d'un registre d'écriture de fichier ----------------------------------------------------------------------- -v1.31 2018/04/05 - - correction d'un espace indésirable dans \CF_ifnextchar ----------------------------------------------------------------------- -v1.32 2018/08/23 - - définition de \printatom, \CF_begintikzpicture et - \CF_endtikzpicture dans le fichier t-chemfig.tex ----------------------------------------------------------------------- -v1.33 2018/10/31 - - les macros définies par \definesubmol peuvent désormais avoir un ou - plusieurs arguments - - macro \polymerdelim documentée ----------------------------------------------------------------------- -v1.34 2019/02/23 - - bug dans la flèche "<->" corrigé ----------------------------------------------------------------------- -v1.4 2019/04/18 - - corrections de nombreux bugs - - caractère privé "_" et non plus "@" -> modifications à prévoir - notamment dans la doc avec les codes spécifiques aux flèches, ça - risque de couiner sur tex.stackexchange.com - - anciennes macros abandonnées et désormais indéfinies : - \setcrambond, \setatomsep, \setbondoffset, \setdoublesep, - \setangleincrement, \enablefixedbondlength, - \disablefixedbondlength, \setnodestyle, \setbondstyle, - \setlewis, \setlewisdist, \setstacksep, \setcompoundstyle, - \setarrowdefault, \setandsign, \setarrowoffset, - \setcompoundsep, \setarrowlabelsep, \enablebondjoin, - \disablebondjoin et \schemedebug - - l'ancienne syntaxe \chemfig[][]{} est abandonnée et n'est plus - acceptée, désormais c'est - \chemfig[=]{} - - l'ancienne syntaxe \lewis[] ou \Lewis[] n'est - plus acceptée au profit de \lewis[=] \ No newline at end of file -- cgit v1.2.3