summaryrefslogtreecommitdiff
path: root/macros/generic/chemfig/chemfig.tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-12-29 03:01:31 +0000
committerNorbert Preining <norbert@preining.info>2023-12-29 03:01:31 +0000
commita5ae3453af00d8ec9eb8bf64151fc4c8bcb18021 (patch)
tree49722f55b01f8ce69a0cd1c783383e40bdb53473 /macros/generic/chemfig/chemfig.tex
parent8806b2d6c55426cb0ba19311d2acf7c4f522a291 (diff)
CTAN sync 202312290301
Diffstat (limited to 'macros/generic/chemfig/chemfig.tex')
-rw-r--r--macros/generic/chemfig/chemfig.tex105
1 files changed, 92 insertions, 13 deletions
diff --git a/macros/generic/chemfig/chemfig.tex b/macros/generic/chemfig/chemfig.tex
index f3f78f3968..b9531d51ef 100644
--- a/macros/generic/chemfig/chemfig.tex
+++ b/macros/generic/chemfig/chemfig.tex
@@ -4,9 +4,9 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
\def\CFname {chemfig} %
-\def\CFver {1.6e} %
+\def\CFver {1.66} %
% %
-\def\CFdate {2023/06/30} %
+\def\CFdate {2023/12/28} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -110,6 +110,7 @@
\newif\ifCF_compound_is_chemfig
\newdimen\CF_dim
+\newdimen\CF_turnangle
\newdimen\CF_arrowsize
\newdimen\CF_zero
\CF_zero=0pt
@@ -991,6 +992,9 @@
\let\CF_defaulttoatom\empty% numéro de l'atome où arrivent les laisons par défaut
\let\CF_defaulttikz\empty
\let\CF_previousbondangle\empty
+ \def\CF_previousbondtype{0}%
+ \def\CF_previousnode{}%
+ \def\CF_previous_offset{0pt}%
\let\CF_joinbond\CF_zero
\let\CF_previoustikz\empty
\everyeof{\_nil}\endlinechar-1
@@ -1329,7 +1333,10 @@
\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}}%
+ \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}%
@@ -1343,6 +1350,36 @@
\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
+ \ifboolKV[chemfig]{bond join}% nouveau v1.66
+ {%
+ \scope
+ \expandafter\tikzset\expandafter{\CF_currentbondstyle}%
+ \ifnum\CF_previousbondtype=5
+ \ifnum0\ifdim\CF_startoffset=0pt 1\fi\ifdim\CF_previous_offset=0pt 1\fi=11
+ \CF_ifzerodim\CF_previousatomgroup
+ {%
+ \CF_turnangle=\CF_compute_turnangle{\CF_previousbondangle}{\CF_currentangle}%
+ \pgfmathsetmacro\CF_cram_overlap{\CF_crambasewidth*cos(\CF_turnangle)-\pgflinewidth}%
+ \ifdim\CF_cram_overlap pt>0pt
+ \CF_warning{Cram base too wide to join}%
+ \else
+ \ifdim\CF_turnangle>0pt % si on tourne à gauche
+ \fill(#2@@)--(\CF_previousnode@@2)--([shift=(\CF_currentangle-90:\pgflinewidth/2)]#2@@)--cycle;
+ \else
+ \fill(#2@@)--(\CF_previousnode@@1)--([shift=(\CF_currentangle+90:\pgflinewidth/2)]#2@@)--cycle;
+ \fi
+ \fi
+ }
+ {%
+ }%
+ \fi
+ \fi
+ \expandafter
+ \endscope
+ \expanded{\def\noexpand\CF_simplebondwidth{\the\dimexpr\pgflinewidth}}% récupère l'épaisseur de ligne si une liaison ">" est à suivre
+ }
+ {%
+ }%
\CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe
\or% 2 = liaison double
\ifCF_in_cycle
@@ -1393,13 +1430,40 @@
\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;
+ \or% 4 = liaison Cram pleine de #2 vers #3 : >
+ \CF_createnormnodes{#2@@}{#3@@}{\CF_crambasewidth/2}{\pgflinewidth/2}%
+ \CF_ifzerodim\CF_previousatomgroup% nouveau v1.66
+ {%
+ \ifnum\ifboolKV[chemfig]{bond join}10\ifdim\CF_startoffset=0pt 1\fi\ifdim\CF_previous_offset=0pt 1\fi=111
+ \ifnum\CF_previousbondtype=1
+ \CF_turnangle=\CF_compute_turnangle{\CF_previousbondangle}{\CF_currentangle}%
+ \pgfmathsetmacro\CF_cram_overlap{\CF_crambasewidth*cos(\CF_turnangle)-\CF_simplebondwidth}%
+ \ifdim\CF_cram_overlap pt>0pt
+ \CF_warning{Cram base too wide to join}%
+ \else
+ \CF_expafter{\fill[}\CF_currentbondstyle](#2@@1)--([shift=(\CF_previousbondangle\ifdim\CF_turnangle>0pt -\else+\fi90:\CF_simplebondwidth/2)]\CF_previousnode@@)--(#2@@2)--cycle;%
+ \fi
+ \else
+ \ifnum\CF_previousbondtype=5
+ \CF_turnangle=\CF_compute_turnangle{\CF_previousbondangle}{\CF_currentangle}%
+ \CF_expafter{\fill[}\CF_currentbondstyle](#2@@1)--([shift=(\CF_previousbondangle\ifdim\CF_turnangle>0pt -\else+\fi90:\CF_crambasewidth/2)]\CF_previousnode@@)--(#2@@2)--cycle;%
+ \fi
+ \fi
+ \fi
+ }
+ {%
+ }%
+ \ifboolKV[chemfig]{bond join}
+ {\CF_expafter{\fill[}}% pas de contour si liaisons jointes
+ {\CF_expafter{\filldraw[}}
+ \CF_currentbondstyle](#2@@1)--(#2@@2)--(#3@@2)--(#3@@1)--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;
+ \or% 5 = liaison Cram pleine de #2 vers #3 : <
+ \CF_createnormnodes{#3@@}{#2@@}{\CF_crambasewidth/2}{\pgflinewidth/2}%
+ \ifboolKV[chemfig]{bond join}
+ {\CF_expafter{\fill[}}% pas de contour si liaisons jointes
+ {\CF_expafter{\filldraw[}}
+ \CF_currentbondstyle](#2@@2)--(#2@@1)--(#3@@1)--(#3@@2)--cycle;
\let\CF_joinbond\CF_zero
\or% 6 = liaison Cram pointillée de #2 vers #3
\scope
@@ -1427,10 +1491,20 @@
\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_previous_offset\CF_endoffset
\let\CF_endoffset\empty
\let\CF_previoustikz\CF_currenttikz
\let\CF_previousbondangle\CF_previousangle
- \def\CF_previousbond{#1}%
+ \edef\CF_previousnode{#3}%
+}
+
+\def\CF_compute_turnangle#1#2{%
+ \expandafter\CF_compute_turnangle_a\the\dimexpr #2pt-#1pt\relax\_nil
+}
+\def\CF_compute_turnangle_a#1\_nil{%
+ \dimexpr#1
+ \ifdim#1<-180pt +360pt\else
+ \ifdim#1>180pt -360pt\fi\fi\relax
}
\def\CF_drawaxisbondnojoin#1#2{\CF_drawbonda(#1@@)--(#2@@);}
@@ -1513,7 +1587,7 @@
\CF_drawbonda(#1@@)--(#2@@);
\fi
\else
- \CF_drawbonda(#1@@)--(#2@@);
+ \CF_drawbonda(#1@@)--(#2@@);%
\fi
}%
\fi
@@ -1669,6 +1743,7 @@
\ifnum\CF_lastaction=2 % s'il faut tracer une liaison
\gdef\CF_cycleanglecorrection{0}% alors c'est qu'un cycle ne peut pas commencer la molécule : annulation de la correction d'angle
\CF_drawbond\CF_bondtype{\CF_bondoutnode}{n\number\CF_cnt_group-\number\CF_cnt_atom}\CF_previousatomgroup\CF_currentatomgroup
+ \let\CF_previousbondtype\CF_bondtype
\fi
\def\CF_lastaction{1}% met la dernière action à 1 : affichage d'un noeud
\loop
@@ -3218,7 +3293,7 @@ v0.2 2010/08/31
l'on écrit \chemfig{*5(=====)}, on obtient deux polygones
réguliers concentriques.
- La séquence de contrôle \setnodestyle permet de spécifier
- le style des n?uds dessinés par tikz.
+ le style des noeuds dessinés par tikz.
----------------------------------------------------------------------
v0.3 2010/11/21
- Amélioration de \definesubmol qui accepte les séquences de
@@ -3554,4 +3629,8 @@ v1.6d 2023/02/18
----------------------------------------------------------------------
v1.6e 2023/06/30
- nouvelle clé "baseline" pour régler finement l'alignement
- vertical d'une molécule \ No newline at end of file
+ vertical d'une molécule
+----------------------------------------------------------------------
+v1.66 2023/12/28
+ - les liaisons de Cram pleines sont jointes entre elles ou aux
+ liaisons simples lorsque "bond join" est vrai \ No newline at end of file