texlive[51176] Master/texmf-dist: chemfig (21may19)

commits+karl at tug.org commits+karl at tug.org
Tue May 21 23:03:18 CEST 2019


Revision: 51176
          http://tug.org/svn/texlive?view=revision&revision=51176
Author:   karl
Date:     2019-05-21 23:03:18 +0200 (Tue, 21 May 2019)
Log Message:
-----------
chemfig (21may19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/generic/chemfig/README
    trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-en.pdf
    trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-en.tex
    trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-fr.pdf
    trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-fr.tex
    trunk/Master/texmf-dist/tex/generic/chemfig/chemfig.tex

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/generic/chemfig/chemfigold.tex

Modified: trunk/Master/texmf-dist/doc/generic/chemfig/README
===================================================================
--- trunk/Master/texmf-dist/doc/generic/chemfig/README	2019-05-21 21:02:41 UTC (rev 51175)
+++ trunk/Master/texmf-dist/doc/generic/chemfig/README	2019-05-21 21:03:18 UTC (rev 51176)
@@ -2,9 +2,9 @@
 
                 The
           Chemfig package
-               v1.4
+              v1.41
 
-            2019/04/18
+            2019/05/21
 ___________________________________
 
 Maintainer: Christian Tellechea

Modified: trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-en.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-en.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-en.tex	2019-05-21 21:02:41 UTC (rev 51175)
+++ trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-en.tex	2019-05-21 21:03:18 UTC (rev 51176)
@@ -216,6 +216,12 @@
 \setitemize{leftmargin=3em,topsep=0pt,parsep=0pt,itemsep=0pt}
 \part{Introduction}
 \section{New in v1.4}
+\subsection{Primitive \texttt{\textbackslash expanded}}
+\fbox{\vbox{\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax\textbf{Important}: As of version 1.41, \CF requires a \TeX{} engine that provides the \texttt{\string\expanded} primitive. If this is not available, an error message will be issued and version 1.4 will be loaded (last version working without the primitive \texttt{\string\expanded}); it is strongly recommended that you update your \LaTeX{} distribution in order to take advantage of the newer \TeX{} engines that provide for the use of this new primitive.}}\medbreak
+
+\subsection{Position and rotation of delimiters}
+The new key \CFkey{h align} for delimiters allows, when set to \CFval{false}, to no longer automatically align delimiters horizontally. When the delimiters are no longer on the same horizontal, they can be rotated automatically by setting the key \CFkey{auto rotate} to \CFval{true}. You can override this automatic setting and choose the rotation angle with the key \CFkey{rotate}. See page~\pageref{polymerdelim}.
+
 \subsection{Private char}
 In the code of \CF, the character used in the name of private macros is "\verb|_|" (underscore) and no longer "\verb|@|" (arobe): the prefix of private macros of \CF is "\verb|\CF_|". The majority of \CF users should not be affected by this change, but the development or maintenance of specific codes such as those presented in the "Arrow customization" section on page~\pageref{definearrow} which uses private macros should take this catcode change into account; this will require an \emph{update of macros names} for those who have used private macros from \CF. To allow "\verb|_|" in macro names, we must execute the order "\verb|\catcode`\_=11|" and then, to return to a normal state run "\verb|\catcode`\_=8|".
 
@@ -1549,6 +1555,9 @@
 	\CFdelimparam{delimiters} & Defines the delimiters. If these delimiters are brackets, write \verb|delimiters={[]}|.\\
 	\CFdelimparam{height} & Defines the height (above the node) of the delimiters.\\
 	\CFdelimparam{depth}  & Defines the depth (below the node) of the delimiters. If the \chevrons{value} is empty, then the depth is equal to the height.\\
+	\CFdelimparam{h align}&Boolean which, when \CFval{false}, places the 2nd delimiter on the 2nd node, at the risk that the delimiters are not on the same horizontal line.\\
+	\CFdelimparam{auto rotate}&Booléen which, when \CFval{true} and \CFkv{h align}{false}, automatically turns the delimiters to be perpendicular to the line that connects the two nodes.\\
+	\CFdelimparam{rotate}&When \CFkv{h align}{false} and \CFkv{auto rotate}{false}, sets the rotation angle of the two delimiters.\\
 	\CFdelimparam{open xshift}& Defines the horizontal offset of the opening delimiter.\\
 	\CFdelimparam{close xshift}& Defines the horizontal offset of the closing delimiter. If the \chevrons{value} is empty, then this offset becomes opposite to the offset of the opening delimiter.\\
 	\CFdelimparam{indice} & Defines the indices that will be placed at the right bottom of the closing delimiter.\\\hline
@@ -1583,8 +1592,11 @@
 -CH([2]-CO-NH_2)-[@{downright,0.3},2]CH_2-[,1.5]C?H-))-[@{upleft,0.8},2]CH_2
 -CH([6]-CO-NH_2)-[@{upright,0.3},2]CH_2-[,1.5]CH([6]-CO-NH-CH_2-NH-C?O)-}
 \polymerdelim[delimiters ={[]}, height = 5pt, depth = 40pt, indice = n]{upleft}{upright}
-\polymerdelim[delimiters ={[]}, height = 40pt, depth = 5pt, indice = n]{downleft}{downright}|
+\polymerdelim[delimiters ={[]}, height = 40pt, depth = 5pt, indice = n]{downleft}{downright}
 
+\chemfig{-[@{op,.5}:-30]O-[::60](=[::60]O)-[::-60]*6(-=-(-(=[::-60]O)-[::60]O-[::-60]-[::60]-[@{cl,.5}::-60])=-=)}
+\polymerdelim[height=6ex, indice=n, h align=false]{op}{cl}|
+
 \subsection{Draw the symmetrical of a molecule}\label{retournement}
 The two commands \falseverb{\hflipnext} and \falseverb{\vflipnext} allow to draw the symmetrical of the next molecule about a horizontal or vertical axis. If we want to draw more symmetrical molecules, we need to write these commands before each molecule involved.
 

Modified: trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-fr.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-fr.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-fr.tex	2019-05-21 21:02:41 UTC (rev 51175)
+++ trunk/Master/texmf-dist/doc/generic/chemfig/chemfig-fr.tex	2019-05-21 21:03:18 UTC (rev 51176)
@@ -216,6 +216,12 @@
 \setitemize{leftmargin=3em,topsep=0pt,parsep=0pt,itemsep=0pt,label=--}
 \part{Introduction}
 \section{Nouveau dans la v1.4}
+\subsection{Primitive \texttt{\textbackslash expanded}}
+\fbox{\vbox{\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax\textbf{Important} : à partir de la version 1.41, \CF nécessite un moteur \TeX{} fournissant la primitive \texttt{\string\expanded}. Si ce n'est pas le cas, un message d'erreur sera émis et la version 1.4 sera chargée (dernière version fonctionnant sans la primitive \texttt{\string\expanded}) : il est vivement conseillé de mettre à jour sa distribution \LaTeX{} afin de profiter d'un moteur \TeX{} récent permettant l'utilisation de cette nouvelle primitive.}}\medbreak
+
+\subsection{Position et rotation des délimiteurs}
+La nouvelle clé \CFkey{h align} pour les délimiteurs permet, lorsqu'elle est mise à \CFval{false} de ne plus aligner automatiquement les délimiteurs horizontalement. Lorsque les délimiteurs ne sont plus sur une même horizontale, on  peut les faire pivoter automatiquement en rendant la clé \CFkey{auto rotate} égale à \CFval{true}. On peut passer outre ce réglage automatique et choisir l'angle de rotation avec la clé \CFkey{rotate}. Voir page~\pageref{polymerdelim}.
+
 \subsection{Caractère privé}
 Dans le code de \CF, le caractère utilisé dans le nom des macros privées est «\verb|_|» (underscore) et non plus «\verb|@|» (arobe) : le préfixe des macros privées de \CF est «\verb|\CF_|». La majorité des utilisateurs de \CF ne doit pas devrait pas être concernée par ce changement, mais l'élaboration ou la maintenance de codes spécifiques tel que ceux présentés à la section «Créer ses propres flèches» à la page~\pageref{definearrow} qui font appel à des macros privées doit conduire à tenir compte de ce changement de catcode; cela va donc nécessiter une \emph{mise à jour du nom des macros} pour ceux qui ont eu recours aux macros privées de \CF. Pour rendre possible l'utilisation de «\verb|_|» dans les noms des macros, on doit exécuter l'ordre «\verb|\catcode`\_=11|» et pour revenir à un l'état normal «\verb|\catcode`\_=8|».
 
@@ -1542,7 +1548,7 @@
 	\Verb|\polymerdelim[<clés>=<valeurs>]{<nœud1>}<nœud2>}|
 \end{center}
 
-L'effet, après éventuellement \emph{deux} compilations, est de positionner des délimiteurs verticaux aux nœuds spécifiés. Les paramètres sont spécifiés via les \chevrons{clés} et les \chevrons{valeurs} dont voici la liste, les valeurs par défaut et les actions.
+L'effet, après éventuellement \emph{deux} compilations, est de positionner des délimiteurs verticaux aux nœuds spécifiés : par défaut, le 1\ier{} délimiteur est placé sur le premier nœud et le second sur la même horizontale que le premier, mais à l'abscisse du second. Les paramètres sont spécifiés via les \chevrons{clés} et les \chevrons{valeurs} dont voici la liste, les valeurs par défaut et les actions.
 \begin{center}
 \begin{tabular}{rlp{8cm}}\hline
 	\chevrons{clés} & \chevrons{valeurs} par défaut & Action\\\hline
@@ -1549,6 +1555,9 @@
 	\CFdelimparam{delimiters} & Définit les délimiteurs. Si ces délimiteurs sont des crochets, il faut écrire \verb|delimiters={[]}|.\\
 	\CFdelimparam{height} & Définit la hauteur (au-dessus du nœud) des délimiteurs.\\
 	\CFdelimparam{depth}  & Définit la profondeur (au-dessous du nœud) des délimiteurs. Si la \chevrons{valeur} est vide, alors la profondeur est égale à la hauteur.\\
+	\CFdelimparam{h align}&Booléen qui lorsqu'il est \CFval{false}, place le 2\ieme{} délimiteur sur le 2\ieme{} nœud, au risque que les délimiteurs ne soient pas sur une même ligne horizontale.\\
+	\CFdelimparam{auto rotate}&Booléen qui, lorsqu'il est \CFval{true} et \CFkv{h align}{false}, tourne automatiquement les délimiteurs pour qu'ils soient perpendiculaires à la ligne qui relie les deux nœuds.\\
+	\CFdelimparam{rotate}&Lorsque \CFkv{h align}{false} et \CFkv{auto rotate}{false}, spécifie l'angle de rotation des deux délimiteurs.\\
 	\CFdelimparam{open xshift}& Définit le décalage horizontal du délimiteur ouvrant.\\
 	\CFdelimparam{close xshift}& Définit le décalage horizontal du délimiteur fermant. Si la \chevrons{valeur} est vide, alors ce décalage devient opposé au décalage du délimiteur ouvrant.\\
 	\CFdelimparam{indice} & Définit l'indice qui sera placé en bas à droite du délimiteur fermant.\\\hline
@@ -1583,8 +1592,11 @@
 -CH([2]-CO-NH_2)-[@{downright,0.3},2]CH_2-[,1.5]C?H-))-[@{upleft,0.8},2]CH_2
 -CH([6]-CO-NH_2)-[@{upright,0.3},2]CH_2-[,1.5]CH([6]-CO-NH-CH_2-NH-C?O)-}
 \polymerdelim[delimiters ={[]}, height = 5pt, depth = 40pt, indice = n]{upleft}{upright}
-\polymerdelim[delimiters ={[]}, height = 40pt, depth = 5pt, indice = n]{downleft}{downright}|
+\polymerdelim[delimiters ={[]}, height = 40pt, depth = 5pt, indice = n]{downleft}{downright}
 
+\chemfig{-[@{op,.5}:-30]O-[::60](=[::60]O)-[::-60]*6(-=-(-(=[::-60]O)-[::60]O-[::-60]-[::60]-[@{cl,.5}::-60])=-=)}
+\polymerdelim[height=6ex, indice=n, h align=false]{op}{cl}|
+
 \subsection{Dessiner le symétrique d'une molécule}\label{retournement}
 Il existe deux commandes \falseverb{\hflipnext} et \falseverb{\vflipnext} qui permettent de tracer le symétrique de la prochaine molécule par rapport à un axe horizontal ou vertical. Si on souhaite construire le symétrique de plusieurs molécules, il faut écrire les commandes avant chaque molécule concernée.
 

Added: trunk/Master/texmf-dist/doc/generic/chemfig/chemfigold.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/chemfig/chemfigold.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/chemfig/chemfigold.tex	2019-05-21 21:03:18 UTC (rev 51176)
@@ -0,0 +1,2835 @@
+% !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 at 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 \xC9 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\xE9rification 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\xE9gime 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>}{<arg2>} donne "<arg1>{*<arg2>}"
+\def\CF_eexpsecond#1#2{\expandafter\expandafter\expandafter\CF_swaparg\expandafter\expandafter\expandafter{#2}{#1}}% \CF_eexpsecond{<arg1>}{<arg2>} donne "<arg1>{**<arg2>}"
+\def\CF_swapunbrace#1#2{#2#1}
+\def\CF_expafter#1#2{\expandafter\CF_swapunbrace\expandafter{#2}{#1}}% \CF_expafter{<arg1>}{<arg2>} donne "<arg1>*<arg2>"
+\def\CF_eexpafter#1#2{\expandafter\expandafter\expandafter\CF_swapunbrace\expandafter\expandafter\expandafter{#2}{#1}}% \CF_eexpafter{<arg1>}{<arg2>} donne "<arg1>**<arg2>"
+\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\xE9sirable, 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\xEAmes 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\xE9faut  #3=cl\xE9
+	\CF_eexpsecond{\def#1}{\useKV[chemfig]{#3}}%
+	\CF_ifx#1\empty
+		{\def#1{#2}}
+		{}%
+}
+
+%--------------------------- Substitution ----------------------------
+\def\CF_ifstartwith#1#2{% #1=<texte>  #2=<motif>
+	\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 <motif> par <pattern> sauf lorsque le motif est suivi d'un caract\xE8re >#1
+	\def\CF_atendsubstitute{\edef#2{\the\CF_substtoks}}% macro ex\xE9cut\xE9e \xE0 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-\xE9gal \xE0 1...#1
+			{\edef\CF_nexttok{\CF_threeea\CF_firsttonil\expandafter\string\CF_substcode\_nil}% le d\xE9tok\xE9niser
+			\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\xE9cut\xE9e \xE0 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=<texte> #2=<motif> #3=<motif de substi>
+	\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 \xE0 vide
+			\expandafter\def\expandafter\CF_substcode\CF_substauxarg
+			\CF_substgroups
+		}%
+		{\CF_substnogroups
+		}%
+}
+
+%---------------------------- Param\xE8tres -----------------------------
+\def\setchemfig{\setKV[chemfig]}
+\def\resetchemfig{%
+	\setKVdefault[chemfig]{%
+		atom style          ={},% code tikz mis \xE0 la fin de every node/.style
+		chemfig style       ={},% code tikz mis \xE0 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 \xC9 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 \xE9t\xE9 fait \xE0 l'atome pr\xE9c\xE9dent
+		{\global\let\CF_bondoutcontentsaved\CF_bondoutcontent}% sauvegarder l'atome d'o\xF9 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\xE9
+	\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 \xE9ventuels
+		}%
+}
+
+\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\xE9quence de contr\xF4le
+		{\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\xE9but 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\xE9but 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\xE7oit 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 \xE0 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\xE8re suivant
+		\CF_ifx:\CF_toksa
+			{\edef#2{\number\numexpr#2+2}% si c 'est un ":", signe du pointill\xE9, ajoute 2
+			}%
+			{\CF_ifx|\CF_toksa% si c 'est un "|", signe du triangle \xE9vid\xE9, 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\xE8re
+		\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\xE9e ou triangle \xE9vid\xE9
+			\CF_expsecond{\def\CF_remainafterbond}{\CF_gobtwoargs#1}% mange un caract\xE8re de plus
+		\fi
+	\fi
+	\CF_expsecond\CF_iffirsttokmatch\CF_remainafterbond\CFhash
+		{\CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_remainafterbond.}(%si parenth\xE8se juste apr\xE8s
+			{\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\xE9cifi\xE9e
+	\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\xE9s l\xE9gitimes ici car #2 (qui est ce qui suit "@{<nom>}" 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\xE8ve 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\xE9cule
+
+\def\CF_seeksubmolc#1#2\_nil{%#1=macro de la sous mol\xE9cule #2=reste du code commen\xE7ant par \relax
+	\CF_expsecond{\CF_eexpsecond{\def\CF_molecule}}{\expandafter#1\CF_gobarg#2}% supprime le \relax puis ajoute la macro au d\xE9but et la 2-d\xE9veloppe
+}
+
+\def\CF_insertemptygroup#1{% ins\xE8re {} au d\xE9but 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\xE9but du tikzpicture
+			\begingroup% \endgroup rajout\xE9 en sortie de trac\xE9 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\xE9s
+				\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\xE9but du dessin 1=trac\xE9 d'un noeud 2=trac\xE9 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\xE9faut si le champ est vide
+				\def\CF_defaultlength{1}%
+				\let\CF_defaultfromatom\empty% numero de l'atome d'o\xF9 partent les liaisons par d\xE9faut
+				\let\CF_defaulttoatom\empty% num\xE9ro de l'atome o\xF9 arrivent les laisons par d\xE9faut
+				\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\xE9 par \CF_chemfigd
+		#2% fin du tikzpicture
+	\endgroup
+	\let\CF_flipstate\CF_zero
+}
+
+\def\CF_chemfigc#1{% #1 est le code de la mol\xE9cule
+	\ifnum\CF_lastaction=3
+		\ifCF_incycle
+			\def\CF_defaultangle{0}%
+		\else
+			\ifnum\CF_cntcycle=0 % si c'est le d\xE9but d'un cycle
+				\pgfmathsetmacro\CF_defaultangle{\CF_previousangle+180+\CF_cycleanglecorrection}% on met la liaison \xE0 +180\xB0 + correction
+			\else
+				\pgfmathsetmacro\CF_defaultangle{\CF_previousangle-90+180/\CF_cyclenum}% sinon \xE0 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\xE9but 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% \xE0 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\xE8me liaison cons\xE9cutive ?
+					\CF_insertemptygroup\CF_molecule% ins\xE8re 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\xE8s la liaison (sans tenir compte de l'espace devant)-> ins\xE8re un groupe vide
+					\CF_insertemptygroup\CF_molecule
+				\fi
+				}%
+				{\edef\CF_bondoutnode{\CF_bondoutnode}% \xE9value le l'atome de d\xE9part de liaison
+				\CF_ifx(\CF_toksa% une parenth\xE8se 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 \xE9tait 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\xE8s le noeud courant n'est pas vide, ne commence pas par "-=~", ni par une parenth\xE8se
+						\CF_ifx*\CF_toksa% un cycle ?
+							{\ifnum\CF_lastaction=2
+								\CF_insertemptygroup\CF_molecule% ins\xE8re un groupe vide
+							\else
+								\ifCF_incycle
+									\def\CF_lastaction{3}%
+								\fi% on \xE9tait 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\xE8ve la 1er \xE9toile
+									\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\xE9\xE9 4 noeuds au dessus et au dessous des noeuds #1 et #2
+% \xE0 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\xE9but et fin #4 et #5: contenu des atomes de d\xE9but 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 \xE9ventuellement 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 \xE9ventuellement 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\xE9e 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\xE9e 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 \xE9vid\xE9 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 \xE9vid\xE9 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\xE9trograde
+	\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\xE9but mol\xE9cule
+					{\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 \xE0 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 at outnode en n\xB0 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\xE9e 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\xF9 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\xE8ve les "@{<nom>}"
+	\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\xE9cule affich\xE9
+	\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\xE9cule : 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\xE8re action \xE0 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\xE8ve 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\xE8ve le premier "@{<nom>}" de l'argument et l'assigne \xE0 #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 <nom>
+	\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\xE8s 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\xE9j\xE0 d\xE9fini ?
+									{\CF_expsecond\CF_hookparselist{\CF_hookcurrentname}% chercher les caract\xE9ristiques du crochet sauvegard\xE9
+									\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 \xE0 la liste des crochets \xE0 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 \xE0 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 at 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 at 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 \xC9 M A S      R \xC9 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 at stuff){\box0};%
+			\node[at=(chem at stuff.north),anchor=east,rotate=-90]{$\left#1\vrule height\CF_delimdim depth\CF_delimdim width0pt\right.$};%
+			\node[at=(chem at 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\xE8s le style par d\xE9faut
+	\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\xE9e ?
+		\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\xE8che
+	\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\xE8che    #8 : longueur fl\xE8che    #9 : style tikz de la fl\xE8che
+\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 "(<name>--@<name>)" 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\xE9cute \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\xE9part   #4=ancre arriv\xE9e
+	\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 at arrow@i@\number\CF_schemenest){};%
+	\edef\CF_arrowendname{end at 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 at arrow){};%
+		\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep-\CF_arrowoffset),red,fill](end at arrow){};%
+		}
+		{\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_arrowoffset)](start at arrow){};%
+		\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep-\CF_arrowoffset)](end at arrow){};%
+		}%
+	\def\CF_arrowstartnode{start at arrow}\def\CF_arrowendnode{end at arrow}%
+	\csname\expandafter\CF_grabarrowname\CF_currentarrowtype[\_nil\CF_threeea\endcsname
+		\expandafter\CF_grabarrowargs\CF_currentarrowtype[]\_nil[][][][][][][][]\_nil
+	\def\CF_currentnodename{end at arrow@i@\number\CF_schemenest}%
+	\edef\CF_nextnodeanchor{\CF_ifempty{#4}{180+\CF_arrowcurrentangle}{#4}}%
+}
+
+% trace un fl\xE8che initi\xE9e par (@nom-- at nom)
+% #1=type de fl\xE8che   #2=nom depart   #3=ancre d\xE9part    #4=nom arriv\xE9e    #5=ancre arriv\xE9e    #6=style fl\xE8che
+\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 at direct@arrow)%
+		coordinate[pos=1,xshift=-\CF_arrowoffset](end at direct@arrow);%
+	\def\CF_arrowstartnode{start at direct@arrow}%
+	\def\CF_arrowendnode{end at 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\xE9c\xE9dents 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 at point){}% trace la ligne de jonction
+		node[at=(merge at point),shift=(\CF_mergeangle:\CF_compoundsep*\CF_mergetocoeff-\CF_arrowoffset)](end at merge){}%
+		node[at=(merge at point),shift=(\CF_mergeangle:\CF_compoundsep*\CF_mergetocoeff)](end at merge@i){};%
+	\let\CF_arrowcurrentangle\CF_mergeangle
+	\CF_expafter{\draw[}\CF_mergestyle,shorten <=0](merge at point)--(end at merge)%
+		\expandafter\CF_arrowdisplaylabela\expandafter{\CF_mergelabelup}{.5}+\expandafter\CF_arrowdisplaylabela\expandafter{\CF_mergelabeldo}{.5}-;%
+	\def\CF_currentnodename{end at 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\xE9part
+% #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 at node){}%
+				node[draw,rotate=\CF_rotatenode#1\_nil,anchor=\CF_anchornode#1\_nil#3,at=(shifted at node)]{\expandafter\CF_gobarg\CF_gobarg#1}%
+				}
+				{node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep](shifted at node){}%
+				node[rotate=\CF_rotatenode#1\_nil,anchor=\CF_anchornode#1\_nil#3,at=(shifted at node)]{\expandafter\CF_gobarg\CF_gobarg#1}%
+				}%
+		\else
+			\ifboolKV[chemfig]{scheme debug}
+				{node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep,draw,fill,cyan](shifted at 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\xE9cal\xE9s de la dimension #1 \xE0 (\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 at i)%
+		coordinate[midway,shift=(\CF_arrowcurrentangle:1pt)](midway at ii)%
+		coordinate[at=(midway at i),shift=(\CF_ifempty{#4}{225}{#4+180}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line at start)%
+		coordinate[at=(midway at i),shift=(\CF_ifempty{#4}{45}{#4}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line at end)%
+		coordinate[at=(midway at ii),shift=(\CF_ifempty{#4}{225}{#4+180}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line at start@i)%
+		coordinate[at=(midway at ii),shift=(\CF_ifempty{#4}{45}{#4}+\CF_arrowcurrentangle:\CF_ifempty{#5}{5pt}{#5})](line at end@i);
+	\draw(line at start)--(line at end);%
+	\draw(line at start@i)--(line at 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 at 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 at arctangent)%
+		arc[radius=\CF_compoundsep*\CF_currentarrowlength*\CF_Uarrowradius,start angle=\CF_arrowcurrentangle-90,delta angle=-\CF_Uarrowabsangle]node(Uarrow at start){};
+	\edef\CF_temp{[\CF_ifempty{#2}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}}]}%
+	\expandafter\draw\CF_temp (Uarrow at arctangent)%
+		arc[radius=\CF_compoundsep*\CF_currentarrowlength*\CF_Uarrowradius,start angle=\CF_arrowcurrentangle-90,delta angle=\CF_Uarrowabsangle]node(Uarrow at end){};
+	\pgfmathsetmacro\CF_temp{\CF_Uarrowradius*cos(\CF_arrowcurrentangle)<0?"-":"+"}%
+	\ifdim\CF_Uarrowradius pt>0pt
+		\CF_arrowdisplaylabel{#1}{0}\CF_temp{Uarrow at start}{#2}{1}\CF_temp{Uarrow at end}%
+	\else
+		\CF_arrowdisplaylabel{#2}{0}\CF_temp{Uarrow at start}{#1}{1}\CF_temp{Uarrow at 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 at x\pgfarrowlength
+		\advance\pgf at x by-\pgfarrowinset
+		\pgf at x.25\pgf at x
+		\ifdim\pgf at x<\pgfarrowlinewidth\pgfarrowlinewidth\pgf at x\fi
+		% Compute front miter length:
+		\pgfmathdivide@{\pgf at sys@tonumber\pgfarrowlength}{\pgf at sys@tonumber\pgfarrowwidth}%
+		\let\pgf at temp@quot\pgfmathresult%
+		\pgf at x\pgfmathresult pt%
+		\pgf at x\pgfmathresult\pgf at x%
+		\pgf at x4\pgf at x%
+		\advance\pgf at x by1pt%
+		\pgfmathsqrt@{\pgf at sys@tonumber\pgf at x}%
+		\pgf at xc\pgfmathresult\pgfarrowlinewidth% xc is front miter
+		\pgf at xc.5\pgf at xc
+		\pgf at xa\pgf at temp@quot\pgfarrowlinewidth% xa is extra harpoon miter
+		% Compute back miter length:
+		\pgf at ya.5\pgfarrowwidth%
+		\csname pgfmathatan2@\endcsname{\pgfmath at tonumber\pgfarrowlength}{\pgfmath at tonumber\pgf at ya}%
+		\pgf at yb\pgfmathresult pt%
+		\csname pgfmathatan2@\endcsname{\pgfmath at tonumber\pgfarrowinset}{\pgfmath at tonumber\pgf at ya}%
+		\pgf at ya\pgfmathresult pt%
+		\advance\pgf at yb by-\pgf at ya%
+		\pgf at yb.5\pgf at yb% half angle in yb
+		\pgfmathtan@{\pgf at sys@tonumber\pgf at yb}%
+		\pgfmathreciprocal@{\pgfmathresult}%
+		\pgf at yc\pgfmathresult\pgfarrowlinewidth%
+		\pgf at yc.5\pgf at yc%
+		\advance\pgf at ya by\pgf at yb%
+		\pgfmathsincos@{\pgf at sys@tonumber\pgf at ya}%
+		\pgf at ya\pgfmathresulty\pgf at yc% ya is the back miter
+		\pgf at yb\pgfmathresultx\pgf at yc% yb is the top miter
+		\ifdim\pgfarrowinset=0pt
+			\pgf at ya.5\pgfarrowlinewidth% easy: back miter is half linewidth
+		\fi
+		% Compute inset miter length:
+		\pgfmathdivide@{\pgf at sys@tonumber\pgfarrowinset}{\pgf at sys@tonumber\pgfarrowwidth}%
+		\let\pgf at temp@quot\pgfmathresult%
+		\pgf at x\pgfmathresult pt%
+		\pgf at x\pgfmathresult\pgf at x%
+		\pgf at x4\pgf at x%\pgf at ya
+		\advance\pgf at x by1pt%
+		\pgfmathsqrt@{\pgf at sys@tonumber\pgf at x}%
+		\pgf at yc\pgfmathresult\pgfarrowlinewidth% yc is inset miter
+		\pgf at yc.5\pgf at yc% 
+		% Inner length (pgfutil at tempdima) is now arrowlength - front miter - back miter
+		\pgfutil at tempdima\pgfarrowlength%
+		\advance\pgfutil at tempdima by-\pgf at xc%
+		\advance\pgfutil at tempdima by-\pgf at ya%
+		\pgfutil at tempdimb.5\pgfarrowwidth%
+		\advance\pgfutil at tempdimb by-\pgf at yb%
+		% harpoon miter correction
+		\ifpgfarrowroundjoin
+			\pgfarrowssetbackend{\pgf at ya\advance\pgf at x by-.5\pgfarrowlinewidth}%
+		\else
+			\pgfarrowssetbackend{0pt}
+		\fi
+		\ifpgfarrowharpoon
+			\pgfarrowssetlineend{\pgfarrowinset\advance\pgf at x by\pgf at yc\advance\pgf at x by.5\pgfarrowlinewidth}%
+		\else
+			\pgfarrowssetlineend{\pgfarrowinset\advance\pgf at x by\pgf at yc\advance\pgf at x by-.25\pgfarrowlinewidth}%
+			\ifpgfarrowreversed
+				\ifdim\pgfinnerlinewidth>0pt
+					\pgfarrowssetlineend{\pgfarrowinset}%
+				\else
+					\pgfarrowssetlineend{\pgfutil at tempdima\advance\pgf at x by\pgf at ya\advance\pgf at x by-.25\pgfarrowlinewidth}%
+				\fi
+			\fi
+		\fi
+		\ifpgfarrowroundjoin
+			\pgfarrowssettipend{\pgfutil at tempdima\advance\pgf at x by\pgf at ya\advance\pgf at x by.5\pgfarrowlinewidth}%
+		\else
+			\pgfarrowssettipend{\pgfarrowlength\ifpgfarrowharpoon\advance\pgf at x by\pgf at xa\fi}%
+		\fi
+		% The hull:
+		\pgfarrowshullpoint{\pgfarrowlength\ifpgfarrowroundjoin\else\ifpgfarrowharpoon\advance\pgf at x by\pgf at 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 at yc%
+		% The following are needed in the code:
+		\pgfarrowssavethe\pgfutil at tempdima
+		\pgfarrowssavethe\pgfutil at tempdimb
+		\pgfarrowssavethe\pgfarrowlinewidth
+		\pgfarrowssavethe\pgf at ya
+		\pgfarrowssavethe\pgfarrowinset
+	},%
+	drawing code = {%
+		\pgfsetdash{}{0pt}%
+		\ifpgfarrowroundjoin\pgfsetroundjoin\else\pgfsetmiterjoin\fi
+		\ifdim\pgfarrowlinewidth=\pgflinewidth\else\pgfsetlinewidth{\pgfarrowlinewidth}\fi
+		\pgfpathmoveto{\pgfqpoint{\pgfutil at tempdima\advance\pgf at x by\pgf at ya}{0pt}}%
+		\pgfpathlineto{\pgfqpoint{\pgf at ya}{\pgfutil at tempdimb}}%
+		\pgfpathlineto{\pgfqpoint{\pgfarrowinset}{0pt}}%
+		\ifpgfarrowharpoon \else
+			\pgfpathlineto{\pgfqpoint{\pgf at ya}{-\pgfutil at 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\xE8re version publique sur le CTAN
+----------------------------------------------------------------------
+v0.2        2010/08/31
+    - Ajout de la documentation en anglais.
+    - Correction de bugs.
+    - \printatom est d\xE9sormais une macro publique.
+    - Les espaces sont permis dans les mol\xE9cules. Ils seront
+      ignor\xE9s par d\xE9faut puisque les atomes sont compos\xE9s en
+      mode math par \printatom
+    - Une paire de Lewis peut \xEAtre repr\xE9sent\xE9e ":".
+    - Dans les cycles, une correction de la longueur du trait
+      d\xE9port\xE9 des liaisons doubles est fait de telle sorte que si
+      l'on \xE9crit \chemfig{*5(=====)}, on obtient deux polygones
+      r\xE9guliers concentriques.
+    - La s\xE9quence de contr\xF4le \setnodestyle permet de sp\xE9cifier
+      le style des n?uds dessin\xE9s par tikz.
+----------------------------------------------------------------------
+v0.3        2010/11/21
+    - Am\xE9lioration de \definesubmol qui accepte les s\xE9quences de
+      contr\xF4le. On peut aussi choisir un alias dont la substitution
+      est diff\xE9rente selon l'orientation de la liaison qui lui
+      arrive dessus.
+    - Le caract\xE8re "|" force la fin d'un atome. Si on \xE9crit
+      "D|ef" alors, chemfig verra deux atomes "D" et "ef".
+    - Le caract\xE8re "#" est reconnu lorsqu'il suit un caract\xE8re de
+      liaison. Il doit \xEAtre suivi d'un argument entre parenth\xE8ses
+      qui contient l'offset de d\xE9but et de fin qui s'appliqueront
+      \xE0 cette liaison.
+    - La macro \chemfig admet un argument optionnel qui sera pass\xE9
+      \xE0 l'environnement tikzpicture dans lequel elle est dessin\xE9e
+    - Mise en place de la repr\xE9sentation des m\xE9canismes
+      r\xE9actionnels avec la syntaxe "@{<nom>}" devant un atome o\xF9
+      "@{<nom>,<coeff>}" au tout d\xE9but de l'argument d'une liaison.
+      Cette syntaxe permet de placer un n?ud (au sens de tikz) qui
+      deviendra l'extr\xE9mit\xE9 des fl\xE8ches des m\xE9canismes.
+      Le trac\xE9 des fl\xE8ches est faite par la macro \chemmove dont
+      l'argument optionnel devient celui de l'environnement
+      tikzpicture dans lequel sont faites les fl\xE8ches.
+    - Pour le m\xE9canisme d'alignement vertical via le \vphantom, la
+      commande \chemskipalign permet d'ignorer le groupe d'atomes
+      dans lequel elle est \xE9crite.
+    - La commande \chemname permet d'afficher un nom sous une
+      mol\xE9cule. la commande \chemnameinit initialise la plus grande
+      profondeur rencontr\xE9e.
+    - La commande \lewis a \xE9t\xE9 modifi\xE9e de telle sorte que les
+      dessins des d\xE9corations soient proportionnels \xE0 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 \xE0 jour du manuel en anglais.
+    - Ajout de \vflipnext et \hflipnext pour retourner
+      horizontalement ou verticalement la prochaine mol\xE9cule.
+----------------------------------------------------------------------
+v0.4        2011/03/07
+    - chemfig est d\xE9sormais \xE9crit en plain-etex et donc
+      utilisable par d'autres formats que LaTeX.
+    - Un peu plus de rigueur avec les catcodes des caract\xE8res
+      sp\xE9ciaux, notamment lorsque la commande \chemfig se trouve
+      dans l'argument de \chemmove, \chemabove, \chembelow, \chemrel.
+      TODO : faut-il \scantoker l'argument de \chemfig pour \xEAtre
+      d\xE9finitivement d\xE9barrass\xE9 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\xE9but
+      de mol\xE9cule.
+----------------------------------------------------------------------
+v0.4b       2011/04/24
+    - l'argument de \chemfig est tok\xE9nis\xE9 avec \scantokens ce qui
+      rend caduc tout souci de code de cat\xE9gorie, \xE0 part #.
+    - la commande \setbondstyle permet de d\xE9finir le style des
+      liaisons.
+    - correction de l'affichage incorrect des doubles liaisons dans
+      les cycles apr\xE8s les commandes \hflipnext et \vflipnext
+    - correction d'un bug lorsqu'un alias commence une mol\xE9cule
+----------------------------------------------------------------------
+v1.0       2011/06/15
+    - les sch\xE9mas r\xE9actionnels sont d\xE9sormais disponibles.
+    - \Chemabove et \Chembelow modifient la boite englobante.
+    - \Lewis modifie la boite englobante
+    - les macros \chemleft, \chemright, \chemup et \chemdown
+      affichent des d\xE9limiteurs extensibles \xE0 gauche, \xE0 droite,
+      au dessus et au dessous d'un mat\xE9riel.
+----------------------------------------------------------------------
+v1.0a      2011/09/18
+    - les macros \Lewis et \lewis admettent un argument optionnel
+    - la macro \setlewisdist r\xE8gle la distance entre les 2
+      \xE9lectrons
+----------------------------------------------------------------------
+v1.0b      2011/11/29
+    - la commande \merge est d\xE9sormais prot\xE9g\xE9e entre
+      \schemestart et \schemestop contre des d\xE9finitions par d'autres
+      packages.
+    - \box0 est utilis\xE9 au lieu du maladroit \unhbox0
+----------------------------------------------------------------------
+v1.0c      2011/11/30
+    - la macro \+ n'est plus explicitement \xE9crite
+    - v\xE9rifie que eTeX est le moteur utilis\xE9
+----------------------------------------------------------------------
+v1.0d      2011/12/19
+    - les cercles des cycles \xE9taient trac\xE9s au mauvais moment. La
+      longueur de la liaison qui les pr\xE9c\xE9dait influait sur le
+      rayon du cercle : \chemfig{-[,0.5]**6(------)} donnait un bug
+      \xE0 l'affichage.
+----------------------------------------------------------------------
+v1.0e      2012/01/13
+    - la gestion des espaces dans les groupes d'atomes est
+      d\xE9sormais plus rigoureuse. Plusieurs bugs ont \xE9t\xE9
+      corrig\xE9
+----------------------------------------------------------------------
+v1.0f      2012/02/24
+    - correction d'un bug avec \definesubmol, les catcodes n'\xE9taient
+      pas correctement g\xE9r\xE9s.
+----------------------------------------------------------------------
+v1.0g      2012/11/16
+    - correction d'un bug dans \CF_directarrow pour faire prendre en
+      compte le style des fl\xE8che par d\xE9faut
+    - correction d'un bug dans \CF_lewisc : la boite *doit* \xEAtre
+      compos\xE9e en dehors de l'environnement tikzpicture pour
+      \xE9viter nullfont si jamais \printatom ne passe pas en mode
+      math.
+    - correction d'un bug dans \CF_chemfigc : si une longueur par
+      d\xE9faut est modifi\xE9e par [,<l>] au d\xE9but d'une mol\xE9cule
+      et si des cycles \xE9taient emboit\xE9s, cette longueur n'\xE9tait
+      pas appliqu\xE9e aux sous-cycles.
+    - r\xE9-\xE9criture des macros \chemabove et \chembemow pour
+      prendre en compte le bug (d\xE9sormais corrig\xE9) dans luatex.
+    - nouvelle macro \setstacksep qui d\xE9finit l'espacement par
+      d\xE9faut dans les macros \chemabove et \chembelow.
+----------------------------------------------------------------------
+v1.0h      2013/11/28
+    - \chemname admet maintenant une version \xE9toil\xE9 qui ne tient
+      pas compte des profondeurs pr\xE9c\xE9dentes.
+    - \CF_dpmax est g\xE9r\xE9 globalement.
+    - correction d'un bug dans "-U>" : le style de la fl\xE8che
+      n'\xE9tait pris en compte pour l'arc.
+    - correction d'un bug dans \CF_directarrow : l'angle de la
+      fl\xE8che n'\xE9tait pas calcul\xE9
+----------------------------------------------------------------------
+v1.1       2015/02/13
+    - correction d'un bug dans \CF_seeksubmol : la macro
+      \CF_molecule est d\xE9pouill\xE9 de son \xE9ventuel espace
+      en premi\xE8re position.
+    - correction d'un bug dans \CF_arrowf : le nom du prochain
+      n?ud courant "end at arrow@i" \xE9tait erron\xE9 dans le cas o\xF9 une
+      fl\xE8che contenait un sous sch\xE9ma. Ce nom doit d\xE9pendre de
+      \CF_schemenest.
+    - la jonction entre deux liaisons cons\xE9cutives dans l'axe peut
+      \xEAtre activ\xE9 avec \enablebondjoin et d\xE9sactiv\xE9 avec
+      \disablebondjoin (pr\xE9f\xE9rable, \xE9tat par d\xE9faut).
+    - \chemfig suivi d'une "*" demande \xE0 ce que les liaisons aient
+      une longueur invariable : la distance inter-atome devient donc
+      variable. Cette fonctionnalit\xE9 est d\xE9sactiv\xE9 dans les
+      cycles afin que les polygones soient r\xE9guliers.
+      \enablefixedbondlength permet cette fonctionnalit\xE9 pour
+      toutes les macros \chemfig (m\xEAme non \xE9toil\xE9e) tandis que
+      \disablefixedbondlength le d\xE9sactive.
+----------------------------------------------------------------------
+v1.1a      2015/02/23
+    - correction d'un bug dans \CF_grabbondoffset. Si \chemfig est
+      dans l'argument d'une macro, les # sont doubl\xE9s par l'action
+      de \scantokens de la macro \CF_chemfigb et il faut un
+      argument d\xE9limit\xE9 avant "(" pour absorber tous les #.
+----------------------------------------------------------------------
+v1.2       2015/10/08
+    - correction d'un bug dans le trac\xE9 des liaisons de Cram.
+    - cr\xE9ation de \setangleincrement.
+    - chargement de "arrows.meta" et d\xE9finition de la fl\xE8che "CF"
+      bas\xE9e sur "Stealth" et d\xE9finie avec \pgfdeclarearrow.
+      Les anciennes fl\xE8ches "CF_full" et "CF_half" sont
+      abandonn\xE9es puisque d\xE9finies avec \pgfarrowsdeclare.
+    - fl\xE8che "-U>" corrig\xE9e : le placement des labels est
+      maintenant correct dans tous les cas. Ainsi :
+                         -U>[<a>][<b>][<d>][r][a]
+      place le label <a> pr\xE8s du d\xE9but de la fl\xE8che, quels que
+      soient les signes du rayon r et de l'angle a.
+    - \chemrel, \setchemrel et \chemsign sont supprim\xE9es.
+    - compatibilit\xE9, avec les limitations d'usage, avec la
+      librairie "externalize" : le \begin{tikzpicture} voit
+      d\xE9sormais le \end{tikzpicture} correspondant dans la macro
+      \CF_chemfigb.
+----------------------------------------------------------------------
+v1.2a      2015/10/21
+    - erreur de copier-coller dans le code: une adresse url \xE9tait
+      malencontreusement pr\xE9sente 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 \xE9galement ajout\xE9
+      en cas de "!" en fin de traitement.
+    - correction d'un bug dans \CF_setbondangle o\xF9 l'angle [<:a>]
+      n'\xE9tait pas \xE9valu\xE9 par \pgfmathsetmacro.
+----------------------------------------------------------------------
+v1.2c      2015/11/20
+    - Correction d'un bug dans \CF_setbondangle : l'angle renvoy\xE9
+      pouvait \xEAtre n\xE9gatif
+    - Correction d'un bug dans \CF_directarrow : la macro \CF_ifempty
+      n'est pas correctement d\xE9velopp\xE9e dans l'argument de
+      \pgfpointanchor
+----------------------------------------------------------------------
+v1.2d      2015/12/01
+    - correction d'un bug dans la fl\xE8che "-U"
+    - la version \xE9toil\xE9e de \setcrambond dessine les liaisons de
+      Cram en pointill\xE9s sous forme de trait large et non pas sous
+      forme de triangle.
+----------------------------------------------------------------------
+v1.2e      2017/05/20
+    - la macro contenant la d\xE9finition d'une fl\xE8che est
+      d\xE9sormais "\CF_arrow(<nom>)", ainsi la macro \0 n'est plus
+      d\xE9finie par \definearrow
+    - remerciements rajout\xE9s apr\xE8s une suppression indue, pour ne
+      froisser aucune susceptibilit\xE9
+----------------------------------------------------------------------
+v1.3       2018/03/08
+    - tous les param\xE8tres sont d\xE9sormais pass\xE9s via \setchemfig qui
+      fait appel \xE0 "simplekv". Par cons\xE9quent, _toutes_ les macros qui
+      r\xE9glaient des param\xE8tres deviennent obsol\xE8tes, \xE0 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\xE9es* dans une future version.
+    - la version \xE9toil\xE9e "\chemfig*" et les deux arguments optionnels
+      de la macro "\chemfig[][]" sont \xE9galement optionnels et seront
+      *supprim\xE9*s dans une future version afin d'acc\xE9der \xE0 la syntaxe
+      \chemfig[cl\xE9s=valeurs]{code}
+    - 6 nouveaux param\xE8tres : "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\xE8res
+    - petit toilettage du code
+    - macro \polymerdelim (non document\xE9e) exp\xE9rimentale et encore
+      en phase de tests
+    - suppression d'un registre d'\xE9criture de fichier
+----------------------------------------------------------------------
+v1.31       2018/04/05
+    - correction d'un espace ind\xE9sirable dans \CF_ifnextchar
+----------------------------------------------------------------------
+v1.32       2018/08/23
+    - d\xE9finition de \printatom, \CF_begintikzpicture et 
+      \CF_endtikzpicture dans le fichier t-chemfig.tex
+----------------------------------------------------------------------
+v1.33       2018/10/31
+    - les macros d\xE9finies par \definesubmol peuvent d\xE9sormais avoir un ou
+      plusieurs arguments
+    - macro \polymerdelim document\xE9e
+----------------------------------------------------------------------
+v1.34       2019/02/23
+    - bug dans la fl\xE8che "<->" corrig\xE9
+----------------------------------------------------------------------
+v1.4        2019/04/18
+    - corrections de nombreux bugs
+    - caract\xE8re priv\xE9 "_" et non plus "@" -> modifications \xE0 pr\xE9voir
+      notamment dans la doc avec les codes sp\xE9cifiques aux fl\xE8ches, \xE7a
+      risque de couiner sur tex.stackexchange.com
+    - anciennes macros abandonn\xE9es et d\xE9sormais ind\xE9finies :
+          \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\xE9e et n'est plus
+      accept\xE9e, d\xE9sormais c'est 
+      \chemfig[<cl\xE9s>=<valeurs>]{<code mol\xE9cule>}
+    - l'ancienne syntaxe \lewis[<coeff>] ou \Lewis[<coeff>] n'est
+      plus accept\xE9e au profit de \lewis[<cl\xE9s>=<valeurs>]
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/generic/chemfig/chemfigold.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/generic/chemfig/chemfig.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/chemfig/chemfig.tex	2019-05-21 21:02:41 UTC (rev 51175)
+++ trunk/Master/texmf-dist/tex/generic/chemfig/chemfig.tex	2019-05-21 21:03:18 UTC (rev 51176)
@@ -4,9 +4,9 @@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                    %
 \def\CFname                    {chemfig}                             %
-\def\CFver                       {1.4}                               %
+\def\CFver                       {1.41}                              %
 %                                                                    %
-\def\CFdate                   {2019/04/18}                           %
+\def\CFdate                   {2019/05/21}                           %
 %                                                                    %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
@@ -40,16 +40,35 @@
 	Draw molecule with an easy syntax (CT)}%
 \fi
 
-%------------------------- V\xE9rification etex -------------------------
+%-------------------------- R\xE9gime catcodes --------------------------
 \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}%
+	\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
+
+%-------------------- V\xE9rification des pr\xE9requis ---------------------
+\def\CF_error#1{\errmessage{Package \CFname\space Error: #1.}}
+\def\CF_checkprimitive#1#2#3{% V\xE9rifie que #1 est une primitive et sinon, \xE9met le message #2 et ex\xE9cute #3
+	\begingroup
+		\edef\__tempa{\meaning#1}\edef\__tempb{\string#1}\expandafter
+	\endgroup
+	\ifx\__tempa\__tempb\else
+		\CF_error{#2}%
+		\def\CF_temp{#3}%
+		\CFrestorecatcode\expandafter\CF_temp
 	\fi
-\CFtemp
+}
+\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}%
 
 %------------------------ Chargement simplekv ------------------------
 \unless\ifdefined\skvname
@@ -64,17 +83,6 @@
 \fi
 \usetikzlibrary{arrows.meta}
 
-%-------------------------- R\xE9gime 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
@@ -140,10 +148,7 @@
 \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_edefaddtomacro#1#2{\CF_expsecond{\CF_addtomacro#1}{\expanded{#2}}}
 \def\CF_ifnextchar#1#2#3{%
 	\let\CF_ifnextchartok=#1% <- espace ind\xE9sirable, bugfix v1.31
 	\def\CF_ifnextcharcodetrue{#2}%
@@ -162,7 +167,6 @@
 \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
@@ -478,8 +482,7 @@
 		\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}%
+				\global\toks0\expandafter{\expanded{\the\toks0\CFhash\CF_x}}%
 				}%
 			}
 			{}%
@@ -489,7 +492,6 @@
 			}%
 			{\scantokens\expandafter{%
 				\the\toks0{%
-					\romannumeral
 					\csname CF_exec%
 						\ifdim\csname CF_currentangle\endcsname pt>90pt
 							\ifdim\csname CF_currentangle\endcsname pt<270pt
@@ -501,7 +503,7 @@
 							second%
 						\fi
 					\endcsname
-					{0 #2}{0 #3}%
+					{#2}{#3}%
 					}%
 				}%
 			}%
@@ -724,20 +726,6 @@
 
 \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]%
 }
@@ -746,7 +734,7 @@
 	\endgroup
 	\begingroup
 		\setchemfig{#3}%
-		\edef\CF_temp{%
+		\expanded{% d\xE9but du tikzpicture
 			\unexpanded{#1}[%
 				remember picture,%
 				every node/.style={%
@@ -760,7 +748,6 @@
 				\unexpanded\CF_threeea{\useKV[chemfig]{chemfig style}}%
 				]%
 			}%
-		\CF_temp% d\xE9but du tikzpicture
 			\begingroup% \endgroup rajout\xE9 en sortie de trac\xE9 par \CF_chemfigd
 				\let\CF_hooklist\empty
 				\CF_expsecond\setchemfig{#3}%
@@ -1692,11 +1679,8 @@
 
 \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
+		{\expandafter\tikzpicture\expanded{[overlay,remember picture,-CF\CF_ifempty{#1}{}{,\unexpanded{#1}}]}%
+			#2%
 		\endtikzpicture
 		}%
 }
@@ -2267,10 +2251,9 @@
 % pose des noeuds d\xE9cal\xE9s de la dimension #1 \xE0 (\CF_arrowstartnode) et (\CF_arrowendnode)
 \def\CF_arrowshiftnodes#1{%
 	\unless\ifdim\CF_ifempty{#1}\CF_zero{#1}=0pt
-		\edef\CF_temp{%
+		\expanded{%
 			\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
 }
@@ -2371,11 +2354,9 @@
 	\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 at arctangent)%
+	\expandafter\draw\expanded{[\CF_ifempty{#1}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}},-]}(Uarrow at arctangent)%
 		arc[radius=\CF_compoundsep*\CF_currentarrowlength*\CF_Uarrowradius,start angle=\CF_arrowcurrentangle-90,delta angle=-\CF_Uarrowabsangle]node(Uarrow at start){};
-	\edef\CF_temp{[\CF_ifempty{#2}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}}]}%
-	\expandafter\draw\CF_temp (Uarrow at arctangent)%
+	\expandafter\draw\expanded{[\CF_ifempty{#2}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}}]}(Uarrow at arctangent)%
 		arc[radius=\CF_compoundsep*\CF_currentarrowlength*\CF_Uarrowradius,start angle=\CF_arrowcurrentangle-90,delta angle=\CF_Uarrowabsangle]node(Uarrow at end){};
 	\pgfmathsetmacro\CF_temp{\CF_Uarrowradius*cos(\CF_arrowcurrentangle)<0?"-":"+"}%
 	\ifdim\CF_Uarrowradius pt>0pt
@@ -2387,13 +2368,17 @@
 
 \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}%
+	\setKVdefault[CFdelimiters]{
+		delimiters   = (),
+		height       = 10pt,
+		depth        = ,
+		open xshift  = 0pt,
+		close xshift = ,
+		h align      = true,
+		auto rotate  = false,
+		rotate       = 0,
+		indice       = n
+		}%
 }
 
 \CF_resetdelim
@@ -2418,9 +2403,24 @@
 		\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)}]
+		\pgfextracty\CF_dim{\pgfpointanchor{#3}{center}}\edef\CF_rightdelimy{\the\CF_dim}%
+		\def\CF_autorotate{0}%
+		\ifboolKV[CFdelimiters]{h align}
+			{\let\CF_rightdelimy\CF_leftdelimy
+			}
+			{%
+			\ifboolKV[CFdelimiters]{auto rotate}
+				{\pgfmathatantwo{\CF_rightdelimy-\CF_leftdelimy}{\CF_rightdelimx-\CF_leftdelimx}%
+				\let\CF_autorotate\pgfmathresult
+				}
+				{\CF_eexpsecond\CF_ifempty{\useKV[CFdelimiters]{rotate}}
+					{}
+					{\edef\CF_autorotate{\useKV[CFdelimiters]{rotate}}}%
+				}%
+			}%
+		\node[at={(\CF_leftdelimx+\CF_leftdelimxshift,\CF_leftdelimy+\CF_delimvshift)},rotate=\CF_autorotate]
 			{$\left\CF_leftdelim\vrule height\CF_delimhalfdim depth\CF_delimhalfdim width0pt\right.$};%
-		\node[at={(\CF_rightdelimx+\CF_rightdelimxshift,\CF_leftdelimy+\CF_delimvshift)}]
+		\node[at={(\CF_rightdelimx+\CF_rightdelimxshift,\CF_rightdelimy+\CF_delimvshift)},rotate=\CF_autorotate]
 			{$\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}$}}}
@@ -2832,4 +2832,15 @@
       accept\xE9e, d\xE9sormais c'est 
       \chemfig[<cl\xE9s>=<valeurs>]{<code mol\xE9cule>}
     - l'ancienne syntaxe \lewis[<coeff>] ou \Lewis[<coeff>] n'est
-      plus accept\xE9e au profit de \lewis[<cl\xE9s>=<valeurs>]
\ No newline at end of file
+      plus accept\xE9e au profit de \lewis[<cl\xE9s>=<valeurs>]
+----------------------------------------------------------------------
+v1.41       2019/05/21
+    - utilisation de la nouvelle primitive \expanded
+    - nouvelle cl\xE9 "h align" (true par d\xE9faut) pour les d\xE9limiteurs
+      de \polymerdelim. Lorsque \xE0 false, les d\xE9limiteurs ne sont
+      plus align\xE9s horizontalement mais positionn\xE9s aux noeuds demand\xE9s
+    - nouvelle cl\xE9 "auto rotate" qui n'a de sens que si h align=false :
+      les d\xE9limiteurs sont automatiquement inclin\xE9s
+    - nouvelle cl\xE9 "rotate" qui n'a de sens que si halign=false ET
+      auto rotate=false : l'inclinaison des d\xE9limiteurs peut \xEAtre
+      choisie
\ No newline at end of file



More information about the tex-live-commits mailing list