From 1517c2659fa710836490bfbd1ab539dff6dc99e5 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 23 Jun 2010 22:03:04 +0000 Subject: new tikz package chemfig (23jun10) git-svn-id: svn://tug.org/texlive/trunk@19127 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/chemfig/README | 37 + .../doc/latex/chemfig/chemfig_doc_fr.pdf | Bin 0 -> 829504 bytes .../doc/latex/chemfig/chemfig_doc_fr.tex | 1210 ++++++++++++++++++++ Master/texmf-dist/tex/latex/chemfig/chemfig.sty | 946 +++++++++++++++ Master/tlpkg/bin/tlpkg-ctan-check | 2 +- Master/tlpkg/tlpsrc/chemfig.tlpsrc | 0 Master/tlpkg/tlpsrc/collection-pictures.tlpsrc | 1 + 7 files changed, 2195 insertions(+), 1 deletion(-) create mode 100644 Master/texmf-dist/doc/latex/chemfig/README create mode 100644 Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.pdf create mode 100644 Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.tex create mode 100644 Master/texmf-dist/tex/latex/chemfig/chemfig.sty create mode 100644 Master/tlpkg/tlpsrc/chemfig.tlpsrc (limited to 'Master') diff --git a/Master/texmf-dist/doc/latex/chemfig/README b/Master/texmf-dist/doc/latex/chemfig/README new file mode 100644 index 00000000000..d552dfc0086 --- /dev/null +++ b/Master/texmf-dist/doc/latex/chemfig/README @@ -0,0 +1,37 @@ +___________________________________ + + The + ChemFig package + v0.1 + + 2010/06/23 +___________________________________ + +Maintainer: Christian Tellechea +E-mail : unbonpetit@gmail.com + Comments, bug reports and suggestions are welcome. +Licence : Released under the LaTeX Project Public License v1.3c or + later, see http://www.latex-project.org/lppl.txt + +---------------------------------------------------------------------- + +This package provides the \chemfig{} command which draws the 2D +representation of a chemical molecule. The describes the +drawing using an easy, flexible and intuitive syntax. + +The drawing is made with the tikz package. Therefore, Chemfig works +in dvi or pdf mode. + +PS : I apologize but for now, only the French version of the manual is +available. The english translation should be released within weeks. + +---------------------------------------------------------------------- + +Cette extension fournit la commande \chemfig{} qui dessine la +représentation en 2D d'une molécule chimique. Le décrit le +dessin selon une syntaxe simple, souple et intuitive. + +Le dessin est fait avec l'extension tikz. ChemFig fonctionne donc en +mode dvi ou pdf. + + Christian Tellechea \ No newline at end of file diff --git a/Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.pdf b/Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.pdf new file mode 100644 index 00000000000..4835bf1f710 Binary files /dev/null and b/Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.pdf differ diff --git a/Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.tex b/Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.tex new file mode 100644 index 00000000000..9cfe136169e --- /dev/null +++ b/Master/texmf-dist/doc/latex/chemfig/chemfig_doc_fr.tex @@ -0,0 +1,1210 @@ +% _________________________________________________________________ +% | | +% | | +% | Documentation de ChemFig | +% | | +% | 23 juin 2010 | +% | | +% |_________________________________________________________________| +% +% Ceci est chemfig_doc_fr.tex, le code LaTeX de la documentation en +% français de chemfig. +% +% Maintainer: Christian Tellechea +% E-mail : unbonpetit@gmail.com +% Comments, bug reports and suggestions are welcome. +% Licence : Released under the LaTeX Project Public License v1.3c or +% later, see http://www.latex-project.org/lppl.txt +% Copyright : Christian Tellechea 2010 +% +% L'extension "chemfig" est constituée de ces 4 fichiers : +% chemfig.sty +% README +% chemfig_doc_fr.tex, chemfig_doc_fr.pdf (documentation en français) +% +% ------------------------------------------------------------------- +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% ------------------------------------------------------------------- +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Christian Tellechea +% ------------------------------------------------------------------- +\documentclass[10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[a4paper,margin=2.5cm]{geometry} +\usepackage[bottom]{footmisc} +\usepackage{lmodern} +\usepackage{amsmath} +\usepackage{array} +\usepackage{xspace} +\usepackage{fancybox} +\usepackage{textcomp} +\usepackage{enumitem} +\usepackage{chemfig} +\usetikzlibrary{decorations.pathmorphing} +\usepackage{emerald} +\usepackage[protrusion=true,expansion,final,verbose=true,babel=true]{microtype} +\usepackage{fancyhdr} + \fancyhead[L]{\small\bfseries\CF} + \fancyhead[C]{} + \fancyhead[R]{\scriptsize\slshape \leftmark} + \fancyfoot[l]{\tiny Compilé par Christian \textsc{Tellechea}, le \today.} + \fancyfoot[c]{} + \fancyfoot[r]{\thepage} + +\makeatletter + +\newcommand\disable@lig[1]{% + \catcode`#1\active + \begingroup + \lccode`\~`#1\relax + \lowercase{\endgroup\def~{\leavevmode\kern\z@\string#1}}% +} + +\newif\if@exstar + +\newcommand\exemple{\@ifstar{\@exstartrue\exemple@}{\@exstarfalse\exemple@}} + +\newcommand\exemple@[2][65]{% + \par\nobreak\vskip5pt + \def\part@coeff{#1}% + \def\code@name{#2}% + \relax\leavevmode\null + \bgroup + \obeylines\frenchspacing + \let\do\@makeother\dospecials + \@vobeyspaces + \disable@lig,\disable@lig-% + \exemple@@ +} + +\newcommand\exemple@@[1]{% + \def\@tempa##1#1{% + \xdef\left@content{##1}\egroup + \begingroup + \endlinechar\m@ne\everyeof{\relax}\catcode`\^^M=10 + \@makeother:\@makeother~\@makeother!\@makeother?\@makeother;% + \expandafter\grab@toks\scantokens{##1}% + \endgroup + \exemple@@@ + }% + \@tempa +} + +\newcommand\exemple@@@{% + \begingroup + \if@exstar + \edef\part@left{\the\dimexpr\linewidth-2\fboxsep-2\fboxrule}% + \let\part@right\part@left + \else + \edef\part@left{\the\dimexpr0.\part@coeff\linewidth-\fboxsep-\fboxrule}% + \edef\part@right{\the\dimexpr\linewidth-0.\part@coeff\linewidth-\fboxsep-\fboxrule}% + \fi + \edef\saved@boxsep{\the\fboxsep}% + \fboxsep1pt\relax + \boxput*(0,1)% + {\colorbox{black}{{% + \leavevmode\kern1.5pt\relax + \color{white}\ECFAugie\footnotesize + \vphantom{Cp}\code@name + }\kern1.5pt\relax}}% + {\fboxsep\saved@boxsep + \fbox{% + \if@exstar + \parbox[c]\part@left{% + \vskip5pt\relax\ttfamily\footnotesize\left@content + \vskip3pt\hrule\vskip3pt + \everypar{{\color{lightgray}\rlap{\vrule height0.1pt width\part@right depth0.1pt}}}% + \par + \hfill\right@content\hfill\null}% + \else + \parbox[c]\part@left{\vskip5pt\relax\ttfamily\footnotesize\left@content}% + \parbox[c]\part@right{% + \vskip5pt\relax + \everypar{{\color{lightgray}\rlap{\vrule height0.1pt width\part@right depth0.1pt}}}% + \footnotesize + \right@content}% + \fi + }% + }% + \vskip7.5pt\relax + \endgroup +} + +\long\def\grab@toks#1\relax{\gdef\right@content{#1}} + +\newcommand\falseverb[1]{{\ttfamily\detokenize{#1}}} + +\long\def\centerverb#1{% + \def\centerverb@i##1#1{##1\hfill\null\par\egroup} + \bgroup + \ttfamily\@noligs + \parskip3.5pt\par\hfill + \let\do\@makeother\dospecials + \@vobeyspaces + \centerverb@i} +\makeatother + +\usepackage[frenchb]{babel} +\frenchbsetup{StandardLists=true} + +\newcommand\CF{{\ECFAugie ChemFig}\xspace} +\newcommand\TIKZ{ti\textit kz\xspace} +\newcommand\molht[1]{\begingroup\parskip3.5pt\par\hfill\chemfig{#1}\hfill\null\par\endgroup} +\newcommand\boxednode[2]{\fbox{$\mathrm{#1}\vphantom{M_1}$}_{#2}} +\newcommand\boxedfalseverb[1]{{\fboxsep0pt\fbox{\vphantom|\falseverb{#1}}}} + +\usepackage[plainpages=false,pdfpagelabels,bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=magenta,pdfauthor={Christian TELLECHEA},pdftitle={ChemFig},pdfsubject={Dessiner des molécules 2D avec LaTeX},pdfkeywords={ChemFig},pdfcreator={LaTeX}]{hyperref} + +\csname @addtoreset\endcsname{section}{part} +\usepackage{titlesec} +\titleformat{\part}[display] + {\normalfont\Large\filcenter\sffamily\bfseries}% + {\LARGE\MakeUppercase{\partname}}% + {1pc}% + {\titlerule\vspace{1pc}\Huge} + +\begin{document} +\begin{titlepage} + \begin{tikzpicture}[remember picture,overlay] + \filldraw[blue](current page.south west) rectangle ([yshift=2.5cm]current page.center); + \filldraw[black](current page.north west) rectangle ([yshift=2.5cm]current page.east); + \end{tikzpicture} + \begin{center} + \color{white}\ECFAugie\fontsize{50pt}{50pt}\selectfont\CF\ v0.1\par\medskip + \footnotesize\csname CF@fr@date\endcsname\par + \normalsize Christian Tellechea\par\vskip1.5cm + \huge Une extension \LaTeX{} pour dessiner des molécules + \end{center} + \vskip4cm + \hfill + \chemfig{-[::-30](-[5])(-[7])-[::+60]-[::-60]O-[::+60](=[::-45]O)-[::+90]HN>:[::-60](-[::+60]**6(------))-[::-30](<:[2]OH)-[::-60](=[6]O)-[::+60]O>:[::-60]*7(---?(<[::-120]OH)-(<|[1]CH_3)(<:[::-90]CH_3)-(-[1](<[::+80]HO)-[0](=[::+60]O)-[7](<|[::+130]CH_3)(-[::+75](<|[2]OH)-[::-60]-[::-60](<[::+30]O-[::-90])-[::-60](<[::+90])(<:[::+30]O-[7](-[6]CH_3)=[0]O)-[::-60])-[6]-[5,1.3]?(<:[7]O-[5](=[::-60]O)-[6]**6(------)))=(-[2]CH_3)-)}% + \hfill\null\par\bigskip + {\hfill\ECFAugie\small Le taxotère\hfill\null}% +\end{titlepage} +\parindent0pt\pagestyle{fancy} +\tableofcontents +\parskip\medskipamount +\newpage + +\setitemize{leftmargin=3em,topsep=0pt,parsep=0pt,itemsep=0pt,label=--} +\part{Introduction} +\section{Avant propos} +Cette extension a pu voir le jour grâce à l'aide de Christophe \textsc{Casseau} qui en a eu l'idée après s'être confronté à la complexité de la syntaxe de l'extension \href{http://www.ctan.org/tex-archive/help/Catalogue/entries/ppchtex.html}{\texttt{\textbf{ppchtex}}}. + +Il m'a aidé tout au long de l'écriture du code à trouver des fonctionnalités intéressantes. Il m'a souvent encouragé à coder des fonctionnalités plus avancées alors que j'étais parfois (presque toujours ?) réticent et donc, si \CF a les fonctionnalités qu'il a, c'est en grande partie grâce à lui. Je lui adresse également mes remerciements pour les tests qu'il a effectués lors des versions beta de cette extension et pour sa contribution à l'écriture de ce manuel.\medskip + +\hfill\begin{minipage}{0.8\linewidth}% +\itshape\small +L'expérience montre qu'il est toujours difficile d'associer le dessin des molécules à la qualité typographique d'un logiciel comme \LaTeX, de ce fait l'utilisateur exigeant et désireux d'avoir un format vectoriel pour ses molécules n'a que peu de choix. Après avoir abandonné en raison de sa complexité le package \emph{ppchtex} développé pour con\TeX t et disponible sous \LaTeX, je me suis tourné vers le monde des logiciels extérieurs à \LaTeX. La difficulté est dans ce cas de trouver un compromis entre qualité et gratuité. Après de nombreux essais infructueux le seule alternative était qu'un nouveau package pour les molécules voit le jour et je remercie vivement Christian \textsc{Tellechea} pour la réalisation de \CF. Il a su être attentif à toutes mes exigences, \CF devait être simple d'utilisation mais posséder des fonctionnalités étendues autant dire que ce n'était pas gagné. Il a pourtant su composer un code \TeX{} d'une grande souplesse avec lequel je prends beaucoup de plaisir à écrire mes molécules. J'espère qu'il en sera de même pour vous lecteur à la recherche d'un package efficace dans ce domaine de la chimie.\smallskip + +\hfill Christophe \textsc{Casseau}% +\end{minipage}\hfill\null + +\section{Présentation} +Pour utiliser ce package, il faut commencer par placer dans le préambule le code suivant : +\centerverb/\usepackage{chemfig}/ +\smallskip + +La commande principale permettant de dessiner les molécules est \verb|\chemfig{}|. L'argument \verb|| est la suite de caractères décrivant le dessin de la molécule selon les règles qui seront exposées dans ce manuel. + +Tout a été fait pour qu'il soit possible de dessiner le plus grand nombre de configurations de molécules chimiques, tout en privilégiant une syntaxe simple, souple et intuitive. Malgré tout, le \verb-- qui décrit le dessin en 2D de la molécule voit sa complexité augmenter proportionnellement à celle de la molécule à dessiner. + +La commande \verb|\chemfig| dessine une molécule en se servant de commandes de l'extension \TIKZ, placées à l'intérieur de l'environnement \verb|tikzpicture|. Le choix de \TIKZ implique que: +\begin{itemize} +\item l'utilisateur a le choix pour le moteur de compilation : pdf\LaTeX{} peut indifféremment être utilisé en mode dvi (tex $\longrightarrow$ dvi $\longrightarrow$ ps $\longrightarrow$ pdf) ou en mode pdf (tex $\longrightarrow$ pdf). En effet, \TIKZ, via la sous-couche pgf, donne des résultats graphiques identiques dans les deux modes; +\item la boîte englobante est automatiquement calculée par \TIKZ et l'utilisateur n'a pas à se préoccuper d'éventuels chevauchements avec le texte. En revanche il faut faire attention à la régularité des interlignes lorsque la molécule est dessinée dans un paragraphe. À titre d'exemple, on a tracé la boîte englobante pour cette molécule : {\fboxsep0pt \fbox{\chemfig{H_3C-C(-[:-30]OH)=[:30]O}}}. \CF placera toujours le premier atome de la molécule sur la ligne de base du code qui précède. +\end{itemize} +\newpage + +\part{\CF pour l'impatient} +Cette partie est un condensé non exhaustif des fonctionnalités de \CF. L'objectif est d'introduire les notions de base permettant au lecteur de dessiner ses premières molécules le plus vite possible. Cette partie ne donne pas de connaissance approfondie. Une utilisation plus avancée et une approche nettement plus formelle des commandes de \CF sera abordée dans les parties suivantes. + +\section{Syntaxe} +La commande \verb|\chemfig| s'utilise de la manière suivante : +\centerverb/\chemfig{[,,,,]}/ + +\begin{itemize} +\item \verb-- est l'angle de la liaison entre deux atomes; +\item \verb-- est le coefficient multiplicateur de la longueur de liaison par défaut; +\item \verb-- et \verb-- sont les numéros de l'atome de départ et de l'atome d'arrivée de la liaison; +\item \verb-- est l'option supplémentaire de couleurs ou de formes pour une liaison. +\end{itemize} +\medskip +Chaque liaison admet des arguments optionnels qui se mettent entre crochets. Ces arguments permettent de régler tout ce dont on a besoin pour la liaison. Chaque argument possède une valeur par défaut. On peut écrire très simplement : +\exemple{La molécule d'eau}|\chemfig{H-O-H}| + +Pour cet exemple comme pour tous les autres, la ligne grise représente la ligne de base. + +\section{Les différents types de liaisons} +Pour \CF, les liaisons entre 2 atomes sont de 9 types, correspondant aux caractères \boxedfalseverb-, \boxedfalseverb=, \boxedfalseverb~, \boxedfalseverb>, \boxedfalseverb<, \boxedfalseverb{>:}, \boxedfalseverb{<:}, \boxedfalseverb{>|} et \boxedfalseverb{<|} :\label{types.liaisons} +\begin{center} +\begin{tabular}{>{\centering\arraybackslash}m{1.7cm}>{\centering\arraybackslash}m{3cm}>{\centering\arraybackslash}m{2cm}m{4cm}} +\hline +\No{} liaison&Code &Résultat &Type de liaison\\\hline +1 &\verb+\chemfig{A-B}+ &\chemfig{A-B} &Simple\\ +2 &\verb+\chemfig{A=B}+ &\chemfig{A=B} &Double\\ +3 &\verb+\chemfig{A~B}+ &\chemfig{A~B} &Triple\\ +4 &\verb+\chemfig{A>B}+ &\chemfig{A>B} &Cram pleine droite\\ +5 &\verb+\chemfig{A:B}+&\chemfig{A>:B}&Cram pointillée droite\\ +7 &\verb+\chemfig{A<:B}+&\chemfig{A<:B}&Cram pointillée gauche\\ +8 &\verb+\chemfig{A>|B}+&\chemfig{A>|B}&Cram évidée droite\\ +9 &\verb+\chemfig{A<|B}+&\chemfig{A<|B}&Cram évidée gauche\\\hline +\end{tabular} +\end{center} +\label{setdoublesep}La commande \verb-\setdoublesep{}- permet de régler l'espacement entre les traits des liaisons doubles ou triples. Cet espacement vaut 2pt par défaut. + +\section{Les différents types de formules} +\subsection{Formule développée} +\exemple{L'éthane}|\chemfig{C(-[2]H)(-[4]H)(-[6]H)-C(-[2]H)(-[6]H)-H}| + +Chaque liaison admet des arguments optionnels. Le premier des arguments optionnels définit l'\verb-- de la liaison. Les angles vont croissant dans le sens trigonométrique. Si l'angle n'est pas indiqué, alors sa valeur par défaut vaut 0\degres. + +Remarque : les parenthèses permettent d'autoriser plusieurs liaisons à partir d'un même atome, voir "Molécules ramifiées", page~\pageref{molecules.ramifiees}. + +Il y a plusieurs façons de spécifier l'angle d'une liaison. +\begin{description} +\item[Angles prédéfinis] Lorsque l'argument optionnel contient un entier celui-ci représente l'angle que fait la liaison avec l'horizontale, en multiples de 45\degres. + +\exemple{Angles prédéfinis}|\chemfig{(-[1]1)(-[2]2)(-[3]3)(-[4]4)(-[5]5)(-[6]6)(-[7]7)-0}| + +\item[Angle absolu] Si on veut spécifier un angle en degrés avec l'horizontale, alors l'argument optionnel doit prendre cette forme : \verb-[:]-. L'\verb-- peut être positif, négatif, décimal. Il est ramené dans l'intervalle $[0\;;360]$. +\item[Angle relatif] Il est souvent intéressant de spécifier pour une liaison l'angle qu'elle fera relativement à la précédente. On doit alors employer cette syntaxe pour l'argument optionnel : \verb-[::]-. L'\verb-- peut être positif, négatif, décimal. +\end{description} + +\subsection{Formule semi-développée} +\exemple{L'hex-1-ène}|\chemfig{H_3C-{{(CH_2)}_3}-CH=CH_2}| + +Il peut-être utile dans certains cas de pouvoir modifier la longueur d'une liaison. Dans l'exemple précédent, il nécessaire d'allonger les deux premières liaisons, beaucoup trop courtes par rapport à la double liaison. Pour cela il faut utiliser l'argument \verb|| des arguments optionnels : + +\exemple{L'hex-1-ène}|\chemfig{H_3C-[,1.5]{{(CH_2)}_3}-[,1.5]CH=CH_2}| + +Remarques : +\begin{itemize} + \item dans la notation \verb|[,1.5]|, la virgule sert à indiquer que la valeur placée entre crochet correspond au deuxième argument (\verb|coeff|). Pour donner une valeur au quatrième argument on écrira \verb|[,,,2]|; + \item les caractères entre accolades ne sont pas interprétés par \CF, ce qui permet par exemple d'écrire des groupements d'atomes entre parenthèses sans que celles ci ne soient considérées comme une molécule ramifiée (voir page~\pageref{molecules.ramifiees}). +\end{itemize} + +\subsection{Représentation de CRAM} +Une autre façon d'indiquer l'angle de la liaison entre deux atomes. +\exemple{Le méthane}|\chemfig{C(-[5]H)(-[2]H)(<[:-70]H)(<:[:-20]H)}| + +\subsection{Formule topologique} +Une saisie simplifiée à son maximum, seule les liaisons covalentes sont indiquées ainsi que leurs éventuels paramètres. +\exemple{Le but-2-ène}|\chemfig{-[:30]=[:-30,,,,red]-[:30]}| + +La liaison double est tracée de part et d'autre de la ligne de liaison simple. Pour garder une cohérence graphique des formules topologiques de certains composés, il est intéressant de déporter cette liaison double soit au dessus de cette ligne, soit au dessous. Il suffit alors de faire suivre le signe "\verb-=-" de "\verb-^-" ou "\verb-_-" : +\exemple{Comparaison doubles liaisons/doubles liaisons déportées}/\chemfig{-[:-30]=[:30]-[:-30]} \chemfig{-[:-30]=^[:30]-[:-30]}\par +\chemfig{=[:-30]-[:30]=[:-30]} \chemfig{=_[:-30]-[:30]=^[:-30]}/ + +\subsection{Formule de Lewis} +La syntaxe est la suivante : +\centerverb/\lewis{<état électronique>,}/ +\smallskip + +Les états électroniques pouvant être un doublet non liant, une lacune électronique ou un électron célibataire. Par défaut l'état électronique est un doublet non liant. L'électron est représenté par le caractère \boxedfalseverb. et la lacune par \boxedfalseverb|. + +\exemple{Le chlorométhane et l'eau}|\chemfig{C(-[2]H)(-[4]H)(-[6]H)-\lewis{260,Cl}}\hspace{1cm} +\chemfig{[:40]H-\lewis{13,O}-[::-80]H}| + +Remarque : les positions prennent des valeurs entières allant de 0 à 7. +\exemple{Positions}/\lewis{0.2.4.6.,C}\hspace{1cm} +\lewis{0|2.46.,C}\hspace{1cm} +\lewis{1357,Ar}/ + +\section{Molécules ramifiées}\label{molecules.ramifiees} +Pour indiquer une ramification, il suffit de faire suivre l'atome portant la ramification d'un \verb-- entre parenthèses. Ce \verb-- est le code de la sous molécule qui viendra s'attacher sur l'atome. Il peut bien sûr y avoir plusieurs ramifications sur un même atome. Celles-ci peuvent aussi être imbriquées. + +\exemple{Alcanes}|\chemfig{H_3C-CH(-[2]CH_3)-CH_3} +\hspace{.5cm}\chemfig{-(-[2])(-[6])-}| + +Dans ce type de représentation il est parfois nécessaire de relier deux atomes distants. Pour cela on dispose du caractère \verb|?| qui va servir de crochet entre deux atomes. La fonction +\centerverb/?[,,]/ +accepte trois arguments, le nom du crochet, le type de liaison et du code tikz. L'exemple suivant indique comment poser deux crochets différents. + +\exemple*{Cocaïne}|\chemfig{H_2C(-C?[a]H-[:-30]CH_2-[:30]C?[b]H-O-CO-C_6H_5) +-[2]CH_2-[,1.7]CH(-[3]N?[a]-[3]H_3C)(-[,1.35]C?[b]H-CO-OCH_3)}| + +\section{Cycles} +\CF peut tracer des polygones réguliers facilement. La syntaxe est la suivante : +\centerverb/\chemfig{*n()}/ +\smallskip + +\exemple{Quelques cycles}| +\chemfig{*3(---)}\hspace{.5cm} +\chemfig{*5(-=-=-)}\hspace{.5cm} +\chemfig{*6(-=-=-=)}| + +Les ramifications s'utilisent de la même façon + +\exemple{Cycles et ramifications}|\chemfig{*4(-(--[1]*4(----))---)}| + +Remarque : un cycle ne pas commencer ou finir par l'atome ou le groupe d'atomes sur lequel on veut refermer le cycle. L'entité chimique sur laquelle on veut boucler doit impérativement se trouver en dehors du cycle. + +\exemple{Le bon codage}|\chemfig{A*4(-B-C-D-)}| + +\exemple{Les mauvais codages}|\chemfig{*4(A-B-C-D-)}\hspace{1cm} + \chemfig{*4(-B-C-D-A)}| + +\section{Ions} +La commande \verb|\chemfig| vous place directement dans l'environnement mathématique\footnote{Il existe un problème de placement des groupes d'atomes contenant des exposants ou des indices. Voir page~\pageref{alignement.vertical}.} de \TeX, il est donc très simple d'écrire un ion. Il faut toutefois placer le signe $-$ entre accolades pour éviter à \CF qu'il le confonde avec le symbole d'une liaison covalente. + +\exemple{L'ion acétate}|\chemfig{-(-[1]O^{-})=[7]O}| + +Pour les puristes il est possible d'entourer la charge de l'ion en utilisant les commandes \verb|\ominus| et \verb|\oplus|. + +Pour répondre à toutes les exigences, il existe deux autres commandes \verb|\chemabove| et \verb|\chembelow| qui permettent de placer les charges au dessus et en dessous de l'atome considéré. + +\exemple{Quelques ions}|\chemfig{-(-[1]O^{\ominus})=[7]O} +\hspace{1cm} +\chemfig{\lewis{35,O}=\lewis{26,Cl}-\chemabove +{\lewis{026,O}}{\ominus}} +\vskip5pt +\chemfig{-\chemabove{N}{\scriptstyle\oplus}(=[1]O)-[7]O^{\ominus}}| + +Pour ceux qui font du zèle, les commandes \verb|\chemabove| et \verb|\chembelow| acceptent un argument optionnel qui règle la distance entre la charge et l'atome. +\exemple{Position de la charge}|\chemfig{\lewis{35,O}=C-\chemabove +[3pt]{\lewis{246,O}}{\hspace{.5cm}\ominus}}| + +\section{Équations chimiques} +Voici un exemple de réaction chimique : +\exemple*{Réaction chimique}/\chemfig{**6(------)} \hspace{.5cm} + \hspace{.5cm} \chemfig{H_3C-Cl} +\hspace{.5cm} $\xrightarrow{catalyseur}$ \hspace{.5cm} +\chemfig{**6(---(-)---)} \hspace{.5cm} + \hspace{.5cm} \chemfig{H-Cl}/ + +\CF introduit également deux nouvelles commandes \verb-\chemsign- et \verb-\chemrel- qui permettent de simplifier légèrement la syntaxe précédente. + +\exemple*{Avec les commandes \CF}|\setchemrel{0pt}{1.2em}{6em} +\chemfig{**6(------)}\chemsign[0.5cm]+\chemfig{H_3C-Cl} +\chemrel[\itshape\tiny Catalyseur]{->} +\chemfig{**6(---(-)---)}\chemsign[0.5cm]+\chemfig{H-Cl}| +\newpage + +\part{Fonctionnement de \CF} +Cette partie est consacrée à la description des fonctionnalités les plus courantes de \CF. Le cadre de cette description dépasse largement celui de \og\CF pour l'impatient\fg{} mais l'utilisateur trouvera ici les explications suffisantes pour dessiner la plupart des molécules. La présentation des fonctionnalités est faite sous un angle théorique, et le but de cette partie n'est pas de dessiner de vraies molécules chimiques mais de donner à l'utilisateur une description formelle des fonctionnalités de \CF. La partie "Utilisation avancée", page~\pageref{utilisation.avancee}, sera plus pratique et dévoilera des fonctionnalités plus avancées pour les utilisations les plus pointues. On y mettra aussi en avant des méthodes pour construire de vraies molécules chimiques, page \pageref{exemples.commentes}. Enfin, la dernière partie présentera des molécules chimiques et le code utilisé pour les dessiner. + +\section{Groupes d'atomes} +Intrinsèquement, le dessin d'une molécule chimique consiste à relier par des traits de différents types des groupes d'atomes. Ainsi, dans la molécule \chemfig{O=O}, il y a 2 groupes d'atomes, chacun constitué d'un seul atome "O". + +{\fboxsep1pt +Mais dans cette molécule +\molht{H_3C-C(-[:-30]OH)=[:30]O} +on compte 4 groupes d'atomes : "$\mathrm{H_3C}$", "C", "O" et "OH". Pour des raisons que nous verrons plus tard, \CF examine chaque groupe d'atomes et le découpe en atomes. Chaque atome s'étend jusqu'à rencontrer une lettre majuscule ou un de ces caractères spéciaux : {\ttfamily \boxedfalseverb{-} \boxedfalseverb{=} \boxedfalseverb{~} \boxedfalseverb{(} \boxedfalseverb{!} \boxedfalseverb{*} \boxedfalseverb{<} \boxedfalseverb{>}}. Pour \CF, tous les caractères entre accolades sont ignorés pour le découpage en atomes. + +Par conséquent, le premier groupe d'atomes "$\mathrm{H_3C}$" est découpé en 2 atomes : $\boxednode{H_3}{}$ et $\boxednode C{}$. Chimiquement, il arrive que ce ne soient pas de vrais atomes puisque $\mathrm{H_3}$ par exemple, est constitué de 3 atomes d'hydrogène. Par abus de langage, on parlera d'atomes par la suite. Par conséquent, \CF voit la molécule précédente ainsi : +\molht{\boxednode{H_3}{}\boxednode{C}{}-[,1.75]\boxednode{C}{}(-[:-30,1.5]\boxednode{O}{}\boxednode{H}{})=[:30,1.5]\boxednode{O}{}}} + +\section{Différents types de liaisons} +Comme on l'a vu (voir page~\pageref{types.liaisons}), les liaisons peuvent être de 9 types, chacune correspondant aux caractères \boxedfalseverb-, \boxedfalseverb=, \boxedfalseverb~, \boxedfalseverb>, \boxedfalseverb<, \boxedfalseverb{>:}, \boxedfalseverb{<:}, \boxedfalseverb{>|} et \boxedfalseverb{<|}. + +\label{longueur.liaison}Lorsqu'une liaison est faite entre 2 atomes, il faut comprendre que ces atomes sont contenus dans des boîtes invisibles rectangulaires. Les centres des deux rectangles sont séparés par une distance réglable $\Delta$, appelée "distance interatome". De plus, les liaisons ne relient pas exactement les frontières des rectangles : une distance $\delta$, réglable elle aussi, sépare le bord des rectangles du début et de la fin de la liaison. Pour aider à la compréhension, les boîtes rectangulaires sont rendues visibles dans ce schéma : +\begin{center} +\begin{tikzpicture}[every node/.style={anchor=base,inner sep=1.5pt,outer sep=0pt,minimum size=0pt},baseline] + \node[draw] at(0,0)(aa){\huge A}; + \node[draw]at(4,0)(bb){\huge B}; + \path[shorten <=5pt,shorten >=5pt,draw](aa)--(bb)coordinate[pos=0](al) coordinate[pos=1](bl); + \node[draw,circle,fill,blue,minimum size=1.5pt,inner sep=0pt]at(al){}; + \node[draw,circle,fill,blue,minimum size=1.5pt,inner sep=0pt]at([xshift=5pt]al){}; + \node[draw,circle,fill,blue,minimum size=1.5pt,inner sep=0pt]at(bl){}; + \node[draw,circle,fill,blue,minimum size=1.5pt,inner sep=0pt]at([xshift=-5pt]bl){}; + \draw[blue,dash pattern=on 1pt off 1pt](bl)--([yshift=0.7cm]bl); + \draw[blue,dash pattern=on 1pt off 1pt]([xshift=-5pt]bl)--([xshift=-5pt,yshift=0.7cm]bl); + \draw[<->]([yshift=0.6cm]bl.center)--([xshift=-5pt,yshift=0.6cm]bl.center) node [midway,above,draw=none]{$\delta$}; + \draw[blue,dash pattern=on 1pt off 1pt](al)--([yshift=0.7cm]al); + \draw[blue,dash pattern=on 1pt off 1pt]([xshift=5pt]al)--([xshift=5pt,yshift=0.7cm]al); + \draw[<->]([yshift=0.6cm]al.center)--([xshift=5pt,yshift=0.6cm]al.center) node [midway,above,draw=none]{$\delta$}; + \node[draw,circle,fill,red,minimum size=2pt,inner sep=0pt]at(aa){}; + \node[draw,circle,fill,red,minimum size=2pt,inner sep=0pt]at(bb){}; + \draw[<->]([yshift=1cm]aa.center)--([yshift=1cm]bb.center) node [midway,above,draw=none] {$\Delta$} ; + \draw[red,dash pattern=on 2pt off2pt](aa.center)--([yshift=1.1cm]aa.center); + \draw[red,dash pattern=on 2pt off2pt](bb.center)--([yshift=1.1cm]bb.center); +\end{tikzpicture} +\end{center} + +\label{setatomsep}La macro \verb-\setatomsep{}- règle cette distance interatome $\Delta$. Si la \verb-- est vide, elle prend sa valeur par défaut : 3em. Cette commande, comme toutes les commandes de réglage, agit sur toutes les molécules qui vont suivre. + +\exemple{Distance interatome}|\setatomsep{2em}\chemfig{A-B}\par +\setatomsep{50pt}\chemfig{A-B}| + +\label{setbondoffset}La commande \verb-\setbondoffset{}- permet de régler l'espacement $\delta$ entre le trait représentant la liaison et l'atome : +\exemple{Retrait des liaisons}|\setbondoffset{0pt}\chemfig{A-B}\par + \setbondoffset{5pt}\chemfig{A-B}| + +Si deux liaisons se suivent, alors \CF insère un groupe vide \verb-{}-, et autour de ce groupe vide, l'espacement $\delta$ est nul : +\exemple{Groupes vides}/\chemfig{A-B=-=C}\par +\chemfig{A>B><>|}{}{}/ +\smallskip + +Si l'un des argument est vide, il prend sa valeur par défaut. Les 3 arguments sont : +\begin{itemize} + \item \verb-- est la largeur de la base des triangles et vaut 1.5ex par défaut; + \item \verb-- est l'épaisseur des pointillés et vaut 1pt par défaut; + \item \verb-- est l'espacement entre les pointillés et vaut 2pt par défaut. +\end{itemize} + +Voici un exemple où les 3 dimensions sont modifiées : + +\exemple{Liaison de Cram modifiée}-\setcrambond{10pt}{0.4pt}{1pt} + \chemfig{A>B>:C>|D}- + +\section{Angle d'une liaison} +Chaque liaison admet un argument optionnel qui se met entre crochet. Le contenu de cet argument optionnel permet de régler tout ce dont on a besoin pour la liaison. Cet argument optionnel est constitué de 5 champs séparés par des virgules qui sont autant d'arguments optionnels pour la liaison. Le premier de ces arguments définit l'angle optionnel de la liaison. Les angles vont croissant dans le sens trigonométrique et sont définis par rapport à l'horizontale. Si l'argument optionnel est vide, alors l'angle par défaut vaut 0\degres. Nous verrons plus loin comment modifier cet angle par défaut. + +Il y a plusieurs façons de spécifier l'angle d'une liaison. +\subsection{Angle prédéfini} +Lorsque l'argument optionnel contient un entier celui-ci représente l'angle que fait la liaison avec l'horizontale, en multiples de 45\degres. Ainsi, \verb-[0]- spécifie un angle de 0\degres, \verb-[1]- de 45\degres, ainsi de suite jusqu'à \verb-[7]- qui spécifie un angle de 315\degres. L'entier peut trouver en dehors de l'intervalle $[0\;;\;7]$ auquel cas l'angle est ramené dans l'intervalle $[0\;;\;360]$. + +\exemple{Angles prédéfinis}|\chemfig{A-B-[1]C-[3]-D-[7]E-[6]F}| + +Ces angles restent valable si les atomes sont vides et il en sera de même par la suite pour toutes les fonctionnalités que nous verrons : +\exemple{Angles prédéfinis, groupes vides}|\chemfig{--[1]-[3]--[7]-[6]}| + +\subsection{Angle absolu} +Si on veut spécifier un angle en degrés avec l'horizontale, alors l'argument optionnel doit prendre cette forme : \verb-[:]-. S'il le faut, l'\verb-- est ramené dans l'intervalle $[0\;;\;360]$ : +\exemple{Angles absolus}/\chemfig{A-[:30]B=[:-75]C-[:10]D-[:90]>|[:60]-[:-20]E-[:0]~[:-75]F}/ + +\subsection{Angle relatif}\label{angle.relatif} +Il est souvent intéressant de spécifier pour une liaison l'angle qu'elle fera relativement à la précédente. On doit alors employer cette syntaxe pour l'argument optionnel : \verb-[::]-. Le signe de l'\verb-- peut être omis s'il s'agit d'un \verb-+-. + +Voici une molécule où les angles des liaisons augmentent de 20\degres{} à chacune après la première dont l'angle est absolu de $-5\degres$ : +\exemple{Suite d'angles relatifs}|\chemfig{A-[:-5]-[::+20]-[::20]B-[::+20]-[::20]C-[::20]}| + +On peut "casser" un enchaînement d'angles relatifs en mettant un angle absolu ou prédéfini lorsqu'on le souhaite. Ici, c'est à l'atome "B" dont la liaison suivante un angle absolu de 315\degres. +\exemple{Suite d'angles realtif puis angle absolu}|\chemfig{A-[:-5]-[::20]-[::20]B-[7]-[::20]C-[::20]}| + +\section{Longueur d'une liaison} +En fait, il faudrait plutôt parler d'espace interatome que de longueur d'une liaison. En effet, seul l'espace interatome est réglable avec \verb-\DCatomsep- comme on l'a vu page~\pageref{longueur.liaison}. Une fois ce paramètre fixé, la longueur d'une liaison dépend du contenu des atomes et, dans une moindre mesure, de l'angle que fait la liaison avec l'horizontale. Il est bien évident que deux atomes peu "encombrants" auront leurs bords plus lointains que s'il avaient été encombrants. On s'en rend très bien compte sur cet exemple où les atomes "I" sont plus étroits que les atomes "M" ce qui entraîne que la liaison entre les "I" est plus longue que celle entre les "M" : +\exemple{Influence de la largeur de l'atome}|\chemfig{I-I}\par +\chemfig{M-M}| + +Cet aspect de l'encombrement des atomes se fait particulièrement sentir lorsqu'ils comportent les exposants ou des indices. Dans cet exemple, la liaison est bien plus courte, au point de se confondre avec un signe mathématique $-$ : +\exemple{Liaison trop courte}|\chemfig{A^{++}_{2}-B^{-}_3}| + +Il est important de remarquer que l'exposant \verb+-+ est \emph{mis entre accolades}. En effet si ce n'était pas le cas, \CF stopperait l'atome sur ce caractère qui est un caractère de liaison. L'atome serait donc "\verb-B^-", ce qui conduirait à des résultats inattendus. + +On voit sur l'exemple ci-dessus qu'il est donc nécessaire de pouvoir augmenter (ou parfois réduire) la distance interatome par l'intermédiaire de leur liaison. Pour cela, l'argument optionnel des liaisons est en réalité constitué de plusieurs champs séparés par des virgules. Comme on l'a vu, le premier champ spécifie l'angle. +Le deuxième champ, s'il est non vide, est un coefficient qui multipliera la distance interatome $\Delta$ par défaut. Ainsi, écrire \verb+-[,2]+ demandera à ce que cette liaison ait l'angle par défaut (1\ier{} champ vide) et que les atomes qu'elle relie soit espacés d'une distance double de celle par défaut. +\exemple{Longueur de liaison modifiée}/\chemfig{A^{++}_{2}-[,2]B^{-}_3}\par +\chemfig{A-B-[,2]C=[,0.5]D}\par +\chemfig{-=[,1.5]-[,0.75]=[:-20,2]}/ + +\section{Atome de départ et d'arrivée} +Un groupe d'atomes peut contenir plusieurs atomes. Mettons que l'on veuille relier le groupe "ABCD" au groupe "EFG" avec une liaison. \CF calcule quel atome du premier groupe et quel atome de second groupe il faut relier en fonction de l'angle que fait la liaison avec l'horizontale. Si l'angle est compris entre $-90\degres$ et 90\degres{} (modulo 360\degres) ces valeurs étant \emph{non comprises}, alors, la liaison se fait entre le dernier atome du premier groupe et de premier atome du second groupe. Dans tous les autres cas, la liaison se fait par défaut entre le premier atome du premier groupe et le dernier atome du second groupe. + +Voici des exemples où les angles sont dans l'intervalle $]-90\;;90[$, et où la liaison se fait donc entre D et E : +\exemple{Atomes liés par défaut}|\chemfig{ABCD-[:75]EFG}\quad + \chemfig{ABCD-[:-85]EFG}\quad + \chemfig{ABCD-[1]EFG}| + +Dans les exemples suivants, les angles appartiennent à $[90\;;270]$ et donc la liaison se fait entre A et G : +\exemple[60]{Atomes liés par défaut}|\chemfig{ABCD-[:100]EFG}\quad + \chemfig{ABCD-[:-110]EFG}\quad + \chemfig{ABCD-[5]EFG}| + +Dans certains cas, on peut désirer qu'une liaison parte d'autres atomes que ceux calculés par \CF On peut forcer un atome de départ ou un atome d'arrivée avec l'argument optionnel de la liaison. Il faut écrire : +\centerverb/[,,,]/ +\smallskip + +où \verb-- et \verb-- sont les numéros des atomes de départ et d'arrivée souhaités. Il faut que ces atomes existent, sinon, un message d'erreur sera émis. +\exemple{Atomes liés forcés}|\chemfig{ABCD-[:75,,2,3]EFG}\qquad + \chemfig{ABCD-[:75,,,2]EFG}\qquad + \chemfig{ABCD-[:75,,3,2]EFG}| + +\section{Personnalisation des liaisons} +Il existe un 5\ieme{} et dernier argument optionnel pour les liaisons qui se trouve à droite de la 4\ieme{} virgule : +\centerverb/[,,,,]/ +\smallskip + +Ce \verb-- est passé directement à \TIKZ lorsque la liaison est tracée. On peut y mettre des attributs de couleur comme "\verb-red-", de pointillés comme "\verb-dash pattern=on 2pt off 2pt-", d'épaisseur comme "\verb-line width=2pt-" ou même de décoration si on a chargé une librairie de décoration de \TIKZ. On peut aussi rendre une liaison invisible en écrivant "\verb-draw=none-". Si on veut spécifier plusieurs attributs, on utilise la syntaxe de \TIKZ en les séparant par une virgule : +\exemple{Passage de code tikz}|\chemfig{A-[,,,,red]B}\par + \chemfig{A-[,,,,dash pattern=on 2pt off 2pt]B}\par + \chemfig{A-[,,,,line width=2pt]B}\par + \chemfig{A-[,,,,red,line width=2pt]B}| + +On peut ainsi avoir accès aux nombreuses librairies de décoration de \TIKZ. On peut par exemple utiliser la librairie "\verb-pathmorphing-" en écrivant \verb-\usetikzlibrary{decorations.pathmorphing}- dans le préambule pour tracer des liaisons ondulées : +\exemple{Liaison ondulée}|\chemfig{A-[,3,,,decorate,decoration=snake]B}| + +Les liaisons de Cram sont insensibles aux attributs d'épaisseur et de pointillés. + +\section{Valeurs par défaut} +Au début de chaque molécule, les valeurs par défaut des arguments optionnels des liaisons sont initialisées. Elles valent : +\begin{itemize} + \item 0\degres{} pour l'angle des liaisons; + \item 1 pour le coefficient multiplication des longueurs; + \item \verb-- pour les numéros de départ et d'arrivée des atomes, ce qui laisse à \CF le soin de calculer ceux-ci en fonction de l'angle de la liaison; + \item \verb-- pour le paramètre passé à \TIKZ. +\end{itemize} + +On peut changer ces valeurs par défaut pour toute la molécule en débutant le code de la molécule par +\centerverb/[,,,,]/ +\smallskip + +Ainsi, si le code de la molécule commence par \verb-[:20,1.5]-, alors toutes les liaisons auront un angle de 20\degres{} par défaut et les distances interatomes une longueur qui vaut 1,5 fois la distance interatomes par défaut. On peut à tout moment ignorer ces valeurs par défaut en spécifiant un argument optionnel, comme pour la liaison qui suivent l'atome "C" de cet exemple : +\exemple{Ecrasement des valeurs par défaut}|\chemfig{[:20,1.5]A-B-C-[:-80,0.7]D-E-F}| + +Si on écrit un improbable \verb-[1,1.5,2,2,red,thick]-, sauf indication contraire, toutes les liaisons auront un angle de 45\degres{} avec l'horizontale, les distances interatomes vaudront 1,5 fois la distance par défaut, les liaisons partiront et arriveront sur le deuxième atome de chaque groupe et seront rouges et épaisses : +\exemple{Valeurs par défaut}|\chemfig{[1,1.5,2,2,red,thick]ABC-DEF=GHI}| + +\section{Ramifications} +\subsection{Principe} +Jusqu'à présent, toutes les molécules étaient linéaires, ce qui est rare. On peut attacher une sous molécule à un atome faisant suivre cet atome d'un \verb-- entre parenthèses. Ce \verb-- est le code d'une sous molécule qui viendra d'attacher sur l'atome. + +Dans cet exemple, la sous molécule "\verb/-[1]W-X/" vient s'attacher sur l'atome "B" : +\exemple{Ramification}|\chemfig{A-B(-[1]W-X)-C}| + +On peut avoir plusieurs sous molécules qui viennent s'attacher sur un même atome. Il suffit de le faire suivre de plusieurs parenthèses contenant le code de chaque sous molécule : +\exemple{Ramifications multiples}|\chemfig{A-B(-[1]W-X)(-[6]Y-[7]Z)-C}| + +Le code de chaque sous molécule peut définir ses propres valeurs par défaut qui seront valables dans toute l'étendue de la sous molécule. Ici, on attache sur "B" une sous molécule "\verb/[:30]-D-E/" dont l'angle par défaut vaut 30\degres{} absolus. On attache également sur "B" une sous molécule "\verb/[::-60,1.5]-X-Y/" dont l'angle par défaut vaut 60\degres{} de moins que celui de la liaison précédente (qui était celle qui allait de "A" à "B") et dont la distance interatome est 1,5 fois celle par défaut : +\exemple{Valeur par défaut dans les ramifications}|\chemfig{A-B([:60]-D-E)([::-30,1.5]-X-Y)-C}| + +Maintenant, que se passe t-il si au début de la molécule principale, on écrit "\verb/[:-45]/" : +\exemple{Influence de l'angle par défaut}|\chemfig{[:-45]A-B([:60]-D-E)([::-30,1.5]-X-Y)-C}| + +On constate que l'angle entre la liaison \verb/B-C/ et la liaison \verb/B-X/ reste de 30\degres{} puisqu'il s'agissait d'un angle relatif pour la sous molécule "\verb/-X-Y/". Par contre, la branche "\verb/-D-E/" reste inclinée à 60\degres{} avec l'horizontale et n'a pas suivi le mouvement de rotation imprimé par l'angle de $-45\degres$ du début, ce qui est normal puisque "\verb/-D-E/" a un angle absolu. Pour faire pivoter la totalité d'une molécule il est donc important que tous les angles soient relatifs. + +\subsection{Imbrication} +Les sous molécules peuvent être imbriquées, et les règles vues au paragraphe précédent restent valables : +\exemple{Ramifications imbriquées}|\chemfig{A-B([1]-X([2]-Z)-Y)(-[7]D)-C}| + +\subsection{Méthode} +Mettons maintenant que nous voulions dessiner la molécule d'anhydride d'acide : +\chemfig{R-C(=[::+60]O)-[::-60]O-[::-60]C(=[::+60]O)-[::-60]R} + +La meilleure méthode pour y arriver est de choisir le plus long chemin. Ici nous pouvons par exemple dessiner le chemin \verb/R-C-O-C-R/ en tenant compte des angles et en n'utilisant que les angles relatifs : +\exemple{Structure de l'anhydride d'acide}|\chemfig{R-C-[::-60]O-[::-60]C-[::-60]R}| + +Partant de cette structure, il suffit de rajouter deux sous molécules "\verb/=O/" sur les atomes de carbone : +\exemple{Anhydride d'acide}|\chemfig{R-C(=[::+60]O)-[::-60]O-[::-60]C(=[::+60]O)-[::-60]R}| + +N'ayant utilisé que des angles relatifs, on peut faire pivoter cette molécule, en spécifiant un angle par défaut de 75\degres{} par exemple : +\exemple[70]{Rotation de la molécule}|\chemfig{[:75]R-C(=[::+60]O)-[::-60]O-[::-60]C(=[::+60]O)-[::-60]R}| + +\section{Lier des atomes éloignés} +Nous avons vu comment relier des atomes \emph{qui se suivent dans le code}. Il est parfois indispensable de relier entre-eux des atomes ne se suivant pas dans le code. Appelons "liaisons distantes" ces liaisons particulières. + +Prenons cette molécule : +\exemple{Structure ramifiée}|\chemfig{A-B(-[1]W-X)(-[7]Y-Z)-C}| + +Et mettons que l'on veuille relier les atomes \verb/X/ et \verb/C/. Dans ce cas, \CF permet de poser un "crochet" \emph{immédiatement} après l'atome qui nous intéresse. Le caractère utilisé pour poser ce crochet est "\verb-?-", pour sa ressemblance avec un crochet. Ainsi, si l'on écrit \verb/X?/, alors, l'atome \verb/X/ portera ce crochet. Par la suite dans le code, tous les atomes suivis d'un \verb-?- seront reliés à \verb/X/ : +\exemple{Liaison éloignée}|\chemfig{A-B(-[1]W-X?)(-[7]Y-Z)-C?}| + +On aurait pu relier d'autres atomes à X en les faisant suivre de \verb-?-. Ici, ce sont les atomes \verb-C- et \verb-Z- : +\exemple{Plusieurs liaisons éloignées}|\chemfig{A-B(-[1]W-X?)(-[7]Y-Z?)-C?}| + +Maintenant, imaginons que nous devions laisser ces liaisons distantes \verb/X-C/ et \verb/X-Z/, tout en ajoutant une autre : \verb/A-W/. Il faut donc poser deux crochets \emph{différents}, l'un sur \verb/A/ et l'autre sur \verb/X/. En fait, le caractère \verb/?/ a un argument optionnel : +\centerverb/?[,,]/ +\smallskip + +où chaque champ prend sa valeur par défaut s'il est vide : +\begin{itemize} + \item le \verb-- est le nom du crochet : tous les caractères alphanumériques (a..z, A..Z, 0..9) sont admis\footnote{Ce n'est pas totalement exact. En réalité, tous les caractères pouvant être mis entre \texttt{\string\csname...\string\endcsname} sont autorisés.}. Ce nom vaut "\verb-a-" par défaut. Seul ce champ est pris en compte lors de la première occurrence de ce crochet portant ce nom. + \item \verb-- spécifie avec quelle liaison l'atome portant cette occurrence du crochet doit être reliée a l'atome portant la première occurrence. Deux cas de figure sont possibles; soit ce champ est un entier représentant le type de liaison voulu : 1=liaison simple, 2=liaison double, etc. Voir le tableau page~\pageref{types.liaisons} pour les codes des liaisons. + + Soit la \verb-- est constituée des caractères codant la liaison, à condition que ces caractères soient \emph{entre accolades}; + \item \verb-- sera passé directement à \TIKZ comme on l'a vu avec les liaisons classiques. +\end{itemize} + +Voici notre molécule avec les liaisons distantes requises, puis avec les liaisons \verb/A-W/ et \verb/X-C/ personnalisées : +\exemple{Plusieurs liaisons éloignées}|\chemfig{A?[a]-B(-[1]W?[a]-X?[b])(-[7]Y-Z?[b])-C?[b]}\par\medskip + \chemfig{A?[a]-B(-[1]W?[a,2,red]-X?[b])(-[7]Y- + Z?[b,1,{line width=2pt}])-C?[b,{>},blue]}| + +On peut écrire plusieurs crochets différents après un atome. Mettons que dans ce pentagone incomplet, on veuille relier \verb/A-E/, \verb/A-C/ et \verb/E-C/ : +\exemple{Un cycle incomplet}|\chemfig{A-[:-72]B-C-[:72]D-[:144]E}| + +Alors, il faut procéder de cette façon : +\exemple{Plusieurs liaisons éloignées}|\chemfig{A?[a]-[:-72]B-C?[a]?[b]-[:72]D-[:144]E?[a]?[b]}| + +\section{Cycles} +L'exemple précédent montre comment tracer un polygone régulier, mais la méthode est fastidieuse puisque les angles dépendent du nombre de côté du polygone. + +\subsection{Syntaxe} +\CF peut tracer des polygones réguliers facilement. L'idée est d'attacher un cycle à un \verb// extérieur à ce cycle avec cette syntaxe : +\centerverb/*()/ +\smallskip + +\verb// est le nombre de côtés du polygone et le \verb// représente les liaisons et les groupes d'atomes qui constituent ses sommets et arêtes. Ce code \emph{doit} commencer par une liaison puisque l'atome se trouve à l'extérieur du cycle. + +Voici un 5-cycle, attaché a l'atome "\verb/A/" : +\exemple{5-cycle}|\chemfig{A*5(-B=C-D-E=)}| + +On peut également dessiner un cycle avec un, plusieurs, ou tous les groupes d'atomes vides, comme c'est le cas pour les dessins hors des cycles : +\exemple{5-cycle avec groupes vides}|\chemfig{*5(-=--=)}| + +Un cycle peut être incomplet : +\exemple{5-cycle incomplet}|\chemfig{*5(-B=C-D)}| +Si un cycle a un code qui contient trop de liaisons et de groupes d'atomes pour le nombre de sommets spécifiés, toutes les liaisons et les groupes au delà du maximum admissible sont ignorés : +\exemple{5-cycle tronqué}|\chemfig{A*5(-B=C-D-E=F-G=H-I)}| + +Il est possible de dessiner un cercle ou un arc de cercle à l'intérieur d'un cycle. Pour cela, on utilise cette syntaxe : +\centerverb/**[,,]()/ +\smallskip + +où chaque champ de l'argument optionnel prend sa valeur par défaut s'il est vide : +\begin{itemize} + \item \verb// et \verb// sont les angles absolus de départ et de fin de l'arc de cercle. Ceux-ci valent 0\degres{} et 360\degres{} de telle sorte qu'un cercle complet est tracé par défaut; + \item \verb// est le code qui sera passé à \TIKZ pour le dessin de l'arc de cercle. +\end{itemize} + +\exemple{Cycles et arcs de cercle}|\chemfig{**6(------)}\quad + \chemfig{**[30,330]5(-----)}\quad + \chemfig{**[0,270,dash pattern=on 2pt off 2pt]4(----)}| + +\subsection{Position angulaire} +\subsubsection{Au départ} +Comme on le voit dans les exemples ci-dessous, la règle est que l'atome d'attache "\verb/A/" se trouve toujours au sud ouest du cycle. de plus, le cycle est toujours construit dans le sens trigonométrique et la dernière liaison tombe verticalement sur l'atome de rattachement : +\exemple{Position angulaire des cycles}|\chemfig{A*4(-B-C-D-)}\qquad\chemfig{A*6(------)}| + +Si cette position angulaire ne convient pas, il est possible de spécifier via l'argument optionnel du début de la molécule un autre angle par défaut. Voici un 6-cycle qui a été pivoté de $+30\degres$, de $-30\degres$ puis de $+60\degres$ : +\exemple[55]{Rotation des cycles}|\chemfig{[:30]A*6(------)}\qquad + \chemfig{[:-30]A*6(------)}\qquad + \chemfig{[:60]A*6(------)}| + +\subsubsection{Après une liaison} +Lorsqu'un cycle ne commence pas une molécule et qu'une (ou plusieurs) liaisons ont été auparavant tracées, la position angulaire par défaut change : le cycle est tracé de telle sorte que la liaison qui arrive sur l'atome de rattachement soit la bissectrice du premier et du dernier côté du cycle. + +Voici un cas simple : +\exemple{Liaison arrivant sur un cycle}|\chemfig{A-B*5(-C-D-E-F-)}| + +La règle reste valable, quelque soit l'angle de la liaison précédente : +\exemple{Liaisons arrivant sur un cycle}|\chemfig{A-[:25]B*4(----)}\vskip5pt + \chemfig{A=[:-30]*6(=-=-=-)}| + +\subsection{Ramifications partant d'un cycle} +Pour faire partir une ramification d'un des sommets du cycle, on emploie la syntaxe déjà vue : +\centerverb/()/ +\smallskip + +où le \verb// est celui de la sous molécule et l'\verb-- occupe le sommet. Une chose particulière aux cycles est que l'angle par défaut de la sous molécule n'est pas 0\degres{} mais est calculé de telle sorte qu'il soit la bissectrice des côtés partant du sommet : +\exemple{Ramification partant d'un cycle}|\chemfig{X*6(-=-(-A-B=C)=-=-)}| + +On peut faire partir une sous molécule du premier sommet du cycle, ainsi que de tous les autres sommets : +\exemple{Cycle et ramifications}|\chemfig{*5((-A=B-C)-(-D-E)-(=)-(-F)-(-G=)-)}| + +Si on souhaite que la liaison partant d'un sommet ne soit pas la bissectrice de ses côtés, on peut jouer sur le paramètre optionnel global ou le paramètre optionnel de la liaison : +\exemple[50]{Ramifications et angles spécifiés}|\chemfig{*5(---([:90]-A-B)--)}\qquad + \chemfig{*5(---(-[:90]A-B)--)}\qquad + \chemfig{*5(---([::+0]-A-B)--)}| + +Il est intéressant de constater au troisième exemple que si on spécifie un angle relatif de 0\degres, la liaison se fait dans le prolongement de la liaison qui précédait dans le cycle. C'est la règle de la page \pageref{angle.relatif} qui spécifiait que l'angle de référence était celui de la dernière liaison tracée. + +On peut désormais lier des cycles entre eux par des liaisons : +\exemple{Cycles liés}|\chemfig{*6(--(-*5(----(-*4(----))-))----)}| + +\subsection{Cycles emboîtés} +Pour "coller" 2 cycles entre eux, la syntaxe est légèrement différente : on identifie le sommet d'où va commencer l'autre cycle. Il suffit de faire suivre ce sommet par la syntaxe habituelle d'un cycle. Voici par exemple un 5-cycle qui part du deuxième sommet d'un 6-cycle : +\exemple{Cycles imbriqués}|\chemfig{A*6(-B*5(----)=-=-=)}| + +On remarque que le cycle qui vient se greffer sur le cycle principal a une position angulaire telle que deux de leurs côté coïncident. De plus, le 5-cycle n'a que 4 liaisons "\verb/----/". En effet, la 5\ieme{} serait inutile puisqu'il s'agit du deuxième côté du 6-cycle qui est déjà tracé. + +Il est bien entendu possible de coller plusieurs cycles entre eux : +\exemple{Plusieurs cycles imbriqués}|\chemfig{*5(--*6(-*4(-*5(----)--)----)---)}| + +Il y a un cas où on doit employer une ruse. On voit sur cet exemple que le quatrième côté du deuxième 5-cycle vient boucler sur le centre de l'atome "\verb-E-". +\exemple{Dessin non parfait}|\chemfig{A-B*5(-C-D*5(-X-Y-Z-)-E-F-)}| + +Ceci est normal puisque le deuxième 5-cycle (qui part de l'atome "\verb-D-") est dessiné \emph{avant} que \CF n'ait pris connaissance de l'atome "\verb-E-". Dans ce cas, il faut se servir de deux crochets pour tracer la liaison \verb/Z-E/ : +\exemple{Liaison distante et cycle}|\chemfig{A-B*5(-C-D*5(-X-Y-Z?)-E?-F-)}| + +On aurait aussi pu utiliser un \verb-\phantom{E}- au dernier sommet du 5-cycle : +\exemple{Utilisation de \string\phantom}/\chemfig{A-B*5(-C-D*5(-X-Y-Z-\phantom{E})-E-F-)}/ + +\subsection{Cycles et groupes d'atomes} +Il faut prendre des précautions avec les cycles lorsque un ou plusieurs sommets sont constitués de plusieurs atomes : +\exemple{Cycle et groupes d'atomes}|\chemfig{AB*5(-CDE-F-GH-I-)}| + +Pour que le cycle ait une forme régulière, il faut passer outre le mécanisme de \CF qui calcule automatiquement les atomes de départ et d'arrivée des liaisons. Ici, il faut relier \verb/C-F/ et \verb/F-G/ en le spécifiant avec l'argument optionnel de ces liaisons : +\exemple{Atomes de départ et d'arrivée imposés}|\chemfig{AB*5(-CDE-[,,1]F-[,,,1]GH-I-)}| +\newpage + +\part{Utilisation avancée}\label{utilisation.avancee} +\section{Liaisons doubles déportées} +Toutes les liaisons doubles sont composées de 2 traits et ces traits sont tracés de part et d'autre de la ligne théorique que prendrait la liaison simple. Il est possible de déporter cette liaison double de telle sorte qu'un des deux traits soit dans le prolongement de cette ligne théorique. L'autre trait étant alors au dessus ou au dessous de la liaison. En fait, il est plus rigoureux de dire "à gauche" ou "à droite" de la ligne théorique lorsqu'on parcourt la liaison dans le sens du tracé. + +Pour déporter la liaison vers la gauche, il suffit d'écrire "\verb-=^-" et pour la déporter vers la droite "\verb-=_-" : +\exemple{Liaisons doubles déportées}/\chemfig{A-=-B}\par +\chemfig{A-=^-B}\par +\chemfig{A-=_-B}/ + +Dans les cycles, les liaisons doubles sont automatiquement déportées vers la gauche. On peut cependant les déporter vers la droite en le spécifiant avec "\verb-=_-" : +\exemple{Liaisons doubles déportées et cycles}/\chemfig{*6(-=-=-=)}\qquad +\chemfig{*6(-=_-=_-=_)}/ + +Les liaisons déportées sont particulièrement utiles dans le tracé de formules topologiques de molécules comprenant chaines carbonées avec des liaisons doubles. Elles permettent d'avoir une ligne brisée continue, alors que cette ligne brisée serait discontinue avec les liaisons doubles normales : +\exemple{Liaisons déportées et formules topologiques}/\chemfig{-[:30]=[:-30]-[:30]=[:-30]-[:30]}\par +\chemfig{-[:30]=^[:-30]-[:30]=^[:-30]-[:30]}\par +\chemfig{-[:30]=_[:-30]-[:30]=_[:-30]-[:30]}/ + +\section{Sauvegarde d'une sous molécule}\label{definesubmol} +\CF est capable de sauvegarder un \verb-- sous forme d'un alias pour le réutiliser sous forme compacte dans le code d'une molécule. Ceci est particulièrement utile lorsque le \verb-- apparaît plusieurs fois. + +Pour cela, on dispose de la commande +\centerverb|\definesubmol{}{}| +\smallskip + +qui sauvegarde le \verb// de façon à l'appeler dans le code de la molécule par le raccourci "\verb/!{}/" : tous les caractères alphanumériques\footnote{En fait, tous les caractères pouvant se trouver entre \texttt{\string\csname} et \texttt{\string\endcsname} sont permis.} sont acceptés pour le \verb//. Le \verb// peut lui même contenir d'autres alias. + +On peut également écraser une définition faite au préalable par\label{redefinesubmol} +\centerverb|\redefinesubmol{}{}| +\smallskip + +Voici un code qui dessine la molécule de pentane. On a pris soin auparavant de définir un alias "\verb/xy/" pour le code \verb/CH_2/ : +\exemple{Pentane}|\definesubmol{xy}{CH_2} + \chemfig{H_3C-!{xy}-!{xy}-!{xy}-CH_3}| + +Ici, la manœuvre n'est pas très intéressante puisque "\verb/!{xy}/" est aussi long à taper que le code qu'il remplace. + +Mais dans certains cas, cette fonctionnalité fait gagner beaucoup de place dans le code de la molécule et en améliore la lisibilité. Dans l'exemple suivant, on dessine la molécule développée de butane. Pour cela, on va définir un alias "\verb/CH2/" pour la sous molécule $\mathrm{CH_2}$. Comme on n'emploie que des angles relatifs, il est possible de faire pivoter la molécule entière de l'angle que l'on veut via l'angle du paramètre optionnel global qui spécifie l'angle par défaut des liaisons de la molécule principale. On met ici 15\degres : +\exemple{Butane}|\definesubmol{CH2}{C(-[::+90]H)(-[::-90]H)} + \chemfig{[:15]H-!{CH2}-!{CH2}-!{CH2}-!{CH2}-H}| + +\section{Décorations} +\subsection{Formule de Lewis}\label{lewis} +La macro \verb+\lewis+ permet de placer des paires d'électrons, des électrons ou une lacune. On utilise cette syntaxe : +\centerverb|\lewis{...,}| +\smallskip + +où les \verb--\ldots\verb-- représentent les positions (en multiples de 45\degres) désirées autour de l'\verb--. Ces entiers doivent être compris entre 0 et 7. + +Cette commande peut également être utilisée en dehors de l'argument de \verb-\chemfig- : +\exemple{La macro \string\lewis}|\lewis{0246,A}\par\medskip + \lewis{1357,B}\par\medskip + \chemfig{H-\lewis{26,O}-S(=[2]\lewis{13,O}) + (=[6]\lewis{57,O})-\lewis{26,O}-H}| + +Si au lieu d'une paire, on veut dessiner un électron, il suffit de faire suivre l'entier spécifiant la position d'un "\verb-.-" Pour dessiner une lacune, on le fait suivre d'un "\verb-|-" : +\exemple{Carbone et ion oxonium}*\lewis{0.2.4.6.,C}\par\medskip + \chemfig{H-\lewis{5|7,O^+}(-[2]H)-H}* + +Toutes les décorations dessinées par l'intermédiaire de \verb-\lewis- ne sont pas comptabilisées dans la boîte englobante de l'atome. Les décorations sont faites en surimpression. On en voit une conséquence dans les deux exemples ci-dessus où les cadre ne semblent ne plus être correctement ajustés au dessin de la molécule qui dépasse légèrement vers le bas. Ceci sera parfois observable dans ce chapitre "Décorations" où l'on présente des commandes qui ne modifient pas la boîte englobante. + +On peut le constater de façon plus évidente en traçant une \verb-\fbox- autour des atomes décorés : +\exemple{Boîte englobante et macro \string\lewis}*\fboxsep0pt + \fbox{\lewis{0.2.4.6.,A}}\par\medskip + \fbox{\lewis{13,B}}* + +\label{setlewis}On peut régler plusieurs paramètres à l'aide la macro +\centerverb|\setlewis{}{}{}| +\smallskip + +Si un argument est vide, il prend sa valeur par défaut. +\begin{itemize} + \item \verb-- est la distance entre la boîte englobant l'atome et la décoration. Elle vaut 1.5pt par défaut; + \item \verb-- est la longueur du trait représentant la paire d'électrons. Elle vaut 8pt par défaut; + \item \verb-- est le code qui sera passé directement à \TIKZ. Ce code est vide par défaut. +\end{itemize} + +\exemple{Les paramètres de la macro \string\lewis}*\setlewis{4pt}{1.5em}{red} + \chemfig{A-\lewis{26,B}-C}\par\bigskip + \setlewis{}{}{line width=0.4pt} + \chemfig{A-\lewis{2|,B}-C}* + +\subsection{Empilement de caractères} +Les macros\label{chemabove} +\centerverb|\chemabove[]{}{}| +et +\centerverb|\chembelow[]{}{}| +\smallskip + +placent le \verb-- respectivement au dessus et au dessous du \verb-- à une distance verticale \verb--, et cela sans changer la boîte englobante du \verb--. La dimension \verb-- vaut 1.5pt par défaut. + +Ces commandes sont indépendantes de lamacro \verb-\chemfig- et peuvent aussi bien être appelées à l'intérieur ou à l'extérieur de son argument. + +On peut les utiliser notamment dans les cycles en prenant soin de mettre des accolades autour des lettres A, B, C et D pour éviter que \CF ne stoppe la lecture de l'atome sur ces lettres : +\exemple{Superposition dans les cycles}|\chemfig{*5(-\chembelow{A}{B}--\chemabove{C}{D}--)}| + +Elles sont parfois utiles pour placer des pseudo exposants qui ne changent pas la boîte englobante de l'atome, de façon à ce que les liaisons n'en soient pas trop éloignées : +\exemple{ion oxonium}*\chemfig{H-\chemabove{\lewis{5|7,O}}{\quad\scriptstyle+}(-[2]H)-H}* + +\subsection{Réactions chimiques} +Pour écrire des réactions chimiques, \CF fournit une commande pour les signes et une commande pour les flèches. + +\label{chemsign}La commande \verb-\chemsign[]- écrit le \verb--, celui-ci étant entouré de part et d'autre d'un espacement horizontal insécable \verb-- qui vaut 0.5em par défaut. + +\label{chemrel}La commande \verb-\chemrel[][]{}- trace une flèche où les argument optionnels \verb-- et \verb-- seront placés respectivement au dessus et au dessous de la flèche, sans que sa boîte englobante soit modifiée. Le \verb-- est directement passé à \TIKZ sauf dans le cas où il comporte "\verb/<>/" qui permet de tracer deux flèches l'une au dessus de l'autre. +\exemple{Types de flèches}*A\chemrel{->}B\par +A\chemrel{<-}B\par +A\chemrel{<->}B\par +A\chemrel{<>}B\par +A\chemrel{->,red,thick}B* + +\label{setchemrel}La commande \verb-\setchemrel{}{}{}- permet de régler les dimensions dans le tracé de la flèche : +\begin{itemize} + \item \verb-- est l'espacement vertical entre la flèche et les textes optionnels écrits au dessus et/ou au dessous. Si cet argument est vide, il prend la valeur 2pt par défaut; + \item \verb-- est l'espacement horizontal insécable inséré avant et après la flèche. Si cet argument est vide, il prend sa valeur par défaut de 0,7em; + \item \verb-- ets la longueur de la flèche. Si l'argument est vide, il prend sa valeur par défaut de 4em. +\end{itemize} + +\exemple{Textes au dessus des flèches}*\setchemrel{1pt}{}{6em} +A\chemrel[\footnotesize au dessus][\tiny au dessous]{<->}B* + +Voici un exemple de réaction chimique : +\exemple*{Réaction chimique}|\setchemrel{0pt}{1.2em}{6em} +\chemfig{**6(------)}\chemsign+\chemfig{H_3C-Cl} +\chemrel[\itshape\footnotesize Catalyseur]{->} +\chemfig{**6(---(-)---)}\chemsign+\chemfig{H-Cl}| + +Et en voici une autre : +\exemple*{Synthèse du phényléthyne}/\chemfig{*6(-=*6(-(-Br)-(-Br))-=-=)} +\chemrel[\chemfig{NaNH_2}][\chemfig{NH_3}]{->} +\chemfig{*6(-=(-~)-=-=)}/ + +\section{Utilisation de {\ttfamily\textbackslash chemfig} dans l'environnement \ttfamily tikzpicture} +Il est possible d'appeler la commande \verb-\chemfig- à l'intérieur d'un environnement \verb-tikzpicture- : +\exemple{\textbackslash chemfig dans tikzpicture}|\begin{tikzpicture}[help lines/.style={thin,draw=black!50}] + \draw[help lines] (0,0) grid (4,4); + \draw(0,0) -- (2,1); + \draw(2,2) circle (0.5); + \node at (1,3) {\chemfig{A=B-[:30]C}}; + \node[draw,red,anchor=base] at(3,2){\chemfig{X>[2,,,,blue]Y}}; + \end{tikzpicture}| + +\section{Alignement vertical}\label{alignement.vertical} +Dans certains cas de molécules semi développées dont les liaisons sont horizontales, le placement des groupes d'atomes est incorrect. + +Un examen attentif de l'exemple suivant révèle que les groupes d'atomes ne sont pas correctement alignés sur la ligne de base : +\exemple*{Placement horizontal}/\Huge\setatomsep{2em} +\chemfig{A^1-B-C-D}\qquad +\chemfig{E_1-F-G-H}/ + +Il est étonnant que le deuxième atome soit correctement aligné alors que les deux derniers subissent un décalage vertical qui semblent être la conséquence de la hauteur différente de la boîte englobant le premier atome "\verb-A^1-" et "\verb-E_1-". + +Pour comprendre ce phénomène, il faut examiner comment \CF place les groupes d'atomes les uns par rapport aux autres. Pour cela, limitons nous aux liaisons horizontales ce qui permet d'employer un vocabulaire particulier, mais l'algorithme est le même pour les autres inclinaisons. En fait, une liaison horizontale part du milieu du côté droit de la boîte englobant l'atome d'où part cette liaison. L'atome d'arrivée est positionné de telle sorte que le milieu du côté gauche de sa boîte englobante soit à l'extrémité de la liaison. Il en découle que le placement vertical de l'atome d'arrivée dépend de l'encombrement vertical de l'atome de départ. Pour limiter ce phénomène, \CF ajoute devant chaque atome d'arrivée le \verb-\vphantom- de l'atome de départ, mais sans l'inclure dans le contenu de cet atome d'arrivée : ce \verb-\vphantom- n'est donc pas destiné à se répercuter sur les atomes suivants. + +On peut donc mieux expliquer l'alignement défectueux constaté. Les atomes "\verb-B-" et "\verb-F-" sont correctement alignés car ils tiennent compte de la hauteur des atomes qui les précèdent grâce à leur \verb-\vphantom-. Pour les atomes "\verb-C-" et "\verb-F-", la hauteur des atomes précédents est prise en compte, mais celle des atomes "\verb-A^1-" et "\verb-E_1-" est oubliée ! Il en résulte que, dépendant de l'altitude de ces liaisons, ces atomes sont un peu trop haut ou trop bas. + +On peut mettre en évidence ce phénomène en rendant visible les boîtes englobantes des atomes où l'on voit clairement que les atomes "\verb-B-" et "\verb-F-" ont des boîtes englobantes dont la hauteur qui tient compte des hauteurs des atomes précédents : +\bgroup +\makeatletter +\def\CF@display@chem#1{\fbox{\ensuremath{\mathrm{#1}}}} +\makeatother +\exemple*{Placement horizontal et boîtes englobantes}/\Huge\setatomsep{2em} +\fboxsep=0pt +\chemfig{A^1-B-C-D}\qquad +\chemfig{E_1-F-G-H}/ +\egroup + +Aucune solution automatique n'étant satisfaisante, on peut contourner manuellement ce problème en plaçant \emph{à l'intérieur} du troisième atome un \verb-\vphantom- ayant la même hauteur que le premier pour que cette hauteur se répercute sur les suivants : +\exemple*{Coutournement du placement vertical}/\Huge\setatomsep{2em} +\chemfig{A^1-B-{\vphantom{A^1}C}-D}\qquad +\chemfig{E_1-F-{\vphantom{E_1}G}-H}/ + +\section{Exemples commentés}\label{exemples.commentes} +Dans ce chapitre, plusieurs molécules seront dessinées en mettant en œuvre les méthodes précédemment exposées. Le but recherché ici est de montrer dans quel ordre logique peut se construire une molécule de façon à ce que l'utilisateur peu familier avec \CF acquière une méthode pour construire des molécules complexes. Pour l'y aider, les étapes de la construction seront montrées. + +De plus, on mettra en évidence que plusieurs possibilités s'offrent à l'utilisateur pour un même résultat graphique, certaines intuitives et d'autres beaucoup moins, l'essentiel étant de montrer que \CF permet une certaine souplesse dans le codage des molécules. À chacun ensuite de se construire et s'approprier les méthodes avec lesquelles il est le plus à l'aise. + +\subsection{L'éthanal} +On va ici dessiner la molécule d'éthanal : \chemfig{H-C(-[2]H)(-[6]H)-C(-[7]H)=[1]O} + +La meilleure méthode pour les molécules non cycliques est de choisir la plus longue chaîne. Ici on peut prendre "\verb|H-C-C=O|" par exemple. Il faut incliner la liaison \verb|C=O| de 45\degres{} en utilisant l'angle prédéfini "\verb-[1]-". On obtient la "structure" de la molécule sur laquelle il suffira de rajouter les ramifications : +\exemple{Structure de l'éthanal}|\chemfig{H-C-C=[1]O}| + +Il reste à placer 3 atomes d'hydrogène avec les bonnes inclinaisons à l'aide des angles prédéfinis. Le premier à 90\degres{} avec la ramification "\verb/(-[1]H)/", le second à 270\degres{} avec "\verb/(-[6]H)/" et celui de droite à 315\degres{} avec "\verb/(-[7]H)/" : +\exemple{Ethanal}|\chemfig{H-C(-[2]H)(-[6]H)-C(-[7]H)=[1]O}| + +\subsection{L'acide 2-amino-4-oxohexanoïque} +Voici la molécule à dessiner : \chemfig{-[::+30]-[::-60](=[:-90]O)-[::+60]-[::-60](-[:-90]NH_2)-[::+60](=[:90]O)-[::-60]OH} + +Il existe ---~comme c'est le souvent cas pour la plupart des molécules~--- plusieurs méthodes, et pour chacune, plusieurs façons différentes d'arriver au résultat. Ici, nous allons examiner 4 méthodes différentes. + +\subsubsection{Angles absolus} +On va tout d'abord tracer la chaîne médiane avec des angles absolus. On règle l'angle par défaut à $+30\degres$ avec l'argument optionnel, ainsi seules les liaisons "descendantes" auront besoin que l'on spécifie leur angle absolu de $-30\degres$ : +\exemple{Structure (angles absolus)}|\chemfig{[:30]--[:-30]--[:-30]--[:-30]OH}| + +Il reste à ajouter les ramifications "\verb/(=[6]O)/", "\verb/(-[6]NH_2)/" et "\verb/(=[2]O)/" sur les bons sommets : +\exemple{Molécule (angles absolus)}|\chemfig{[:30]--[:-30](=[6]O)--[:-30](-[6]NH_2)-(=[2]O)-[:-30]OH}| + +\subsubsection{Angles relatifs} +Une approche plus générale aurait été de n'utiliser que des angles relatifs. Il aurait fallu procéder de cette façon : +\exemple{Structure (angles relatifs)}|\chemfig{[:30]--[::-60]--[::-60]--[::-60]OH}| + +puis +\exemple{Molécule (angles relatifs)}|\chemfig{[:30]--[::-60](=[::-60]O)--[::-60](-[::-60]NH_2) +-(=[::60]O)-[::-60]OH}| + +\subsubsection{Cycle} +Les angles entre les liaisons étant de 120\degres{}, on peut penser à utiliser un 6-cycle, quoique cette méthode soit moins naturelle. Il faut ici profiter du fait qu'un cycle peut être incomplet. Il est également nécessaire de faire pivoter le cycle de 120\degres{} pour que le premier sommet soit au sud-est du cycle : +\exemple{Structure}|\chemfig{[:120]NH_2*6(---=O)}| + +Il faut maintenant faire partir les ramifications des sommets adéquats : +\exemple{Molécule (cycle)}|\chemfig{[:120]NH_2*6(-(-(=[::60]O)-[::-60]OH)--(--[::60])=O)}| + +\subsubsection{Cycles imbriqués} +En approfondissant la méthode avec les cycles, on peut aussi penser à imbriquer des 6-cycles incomplets. On pourrait partir de cette structure : +\exemple{Structure}|\chemfig{*6(--*6(--=O))}| + +Et ensuite ajouter les liaisons qui partent des sommets des ces cycles. Il n'y a pas à se préoccuper des angles puisque les liaisons qui partent des cycles sont les bissectrices des côtés du cycle, ce que justement, on cherche ici : +\exemple{Molécule (cycles imbriqués)}|\chemfig{*6((-)-(=O)-*6(-(-NH_2)-(-OH)=O))}| + +Un examen attentif révèle cependant que la seconde double liaison vers l'atome d'oxygène se trouve \emph{à l'intérieur} du 6-cycle incomplet\footnote{C'était aussi le cas pour la méthode précédente avec un seul cycle.}. Malgré sa concision, ce code ne conduit donc pas à un dessin parfait. On peut bien sûr corriger ce défaut en allongeant un peu le code : +\exemple{Molécule (cycles imbriqués corrigés)}|\chemfig{*6((-)-(=O)-*6(-(-NH_2)-(-OH)(=[::60]O)))}| + +\subsection{Glucose} +Le but ici est de représenter selon différentes conventions la molécule de glucose. + +\subsubsection{Formule topologique} +Le code ressemble ici à celui de l'acide 2-amino-4-oxohexanoïque. On obtient quasiment la même structure avec des angles absolus sauf qu'ici, l'angle par défaut est de $-30\degres$ : +\exemple[60]{Structure}|\chemfig{[:-30]HO--[:30]--[:30]--[:30]-H}| + +Et l'ajout des ramifications ne pose pas de problème particulier. On utilise des angles absolus : +\exemple[60]{Fructose, formule topologique}|\chemfig{[:-30]HO--[:30](<[2]OH)-(<:[6]OH) +-[:30](<:[2]OH)-(<:[6]OH)-[:30](=[2]O)-H}| + +\subsubsection{Projection de Fisher} +Le but est d'obtenir la molécule ci dessous : +\begin{center} + \definesubmol{x}{(-[4]H)(-[0]OH)} + \definesubmol{y}{(-[0]H)(-[4]OH)} + \chemfig{[2]OH-[3]-!x-!x-!y-!x-=[1]O} +\end{center} +L'idée est de commencer à dessiner la plus longue chaîne verticale en indiquant un angle "\verb-[2]-" par défaut. Voici la structure où l'on met volontairement des lettres minuscules au bout de chaque liaison verticale : +\exemple{Structure}|\chemfig{[2]OH-[3]-a-b-c-d-=[1]O}| + +Ensuite, on définit deux alias pour les liaisons horizontales et les atomes qui les termineront. Prenons "\verb-x-" que nous mettrons à la place des minuscules a, c et d et "\verb-y-" qui prendra la place de la lettre c. Comme les alias ne comportent qu'un seul caractère, on peut se passer d'accolade et écrire "\verb-!x-" au lieu de "\verb-!{x}-" : +\exemple{Glucose (projection de Fisher)}|\definesubmol{x}{(-[4]H)(-[0]OH)} +\definesubmol{y}{(-[0]H)(-[4]OH)} +\chemfig{[2]OH-[3]-!x-!x-!y-!x-=[1]O}| + +\subsubsection{Représentation \og chaise\fg} +On va représenter cette molécule d'$\alpha$-D-glucose : +\chemfig{?(-[:190]OH)-[:-50](-[:170]OH)-[:10](-[:-55,0.7]OH)-[:-10](-[6,0.7]OH)-[:130]O-[:190]?(-[:150,0.7]-[2,0.7]OH)} + +Pour cela, on va tout d'abord tracer 5 côtés de la chaise et relier le premier sommet au dernier avec un crochet "\verb-?-". On adopte les angles absolus suivants, donnés dans l'ordre de parcourt trigonométrique : $-50\degres$, $10\degres$, $-10\degres$, $130\degres$, $190\degres$. +\exemple{Structure}| +\chemfig{?-[:-50]-[:10]-[:-10]-[:130]O-[:190]?}| + +Maintenant, il suffit de rajouter les ramifications entre parenthèses. Les angles sont choisis au mieux pour rendre une impression de perspective, et certaines liaisons sont raccourcis d'un coefficient de 0,7 : +\exemple{Représentation chaise}|\chemfig{?(-[:190]OH)-[:-50](-[:170]OH)-[:10](-[:-55,0.7]OH) +-[:-10](-[6,0.7]OH)-[:130]O-[:190]?(-[:150,0.7]-[2,0.7]OH)}| + +\subsubsection{Projection de Haworth} +Le but est de représenter cette molécule de D-glucopyranose : +{\setcrambond{2pt}{}{} +\chemfig{HO-[2,0.5,2]?<[7,0.7](-[2,0.5]OH)-[,,,,line width=2pt](-[6,0.5]OH)>[1,0.7](-[6,0.5]OH)-[3,0.7]O-[4]?(-[2,0.3]-[3,0.5]OH)}} + +Tout d'abord, on va choisir la plus longue chaîne qui part du groupe "HO" de gauche et continue sur 5 côtés du cycle. Le cycle sera fermé avec un crochet. Pour la liaison verticale qui part du premier groupe "HO", il faut spécifier qu'elle doit partir du second atome avec l'argument optionnel. De plus, elle sera raccourcie avec un coefficient de 0,5. Son argument optionnel sera donc "\verb/[2,0.5,2]/". + +Ensuite, pour donner une impression de perspective au cycle, les liaisons inclinées seront réduites d'un coefficient de 0,7. Pour les traits gras inclinés, on va se servir des liaisons de Cram en ayant redéfini la largeur de la base des triangles à 2pt. Pour la liaison horizontale en trait gras, il faudra la tracer avec une épaisseur de 2pt et son argument optionnel sera donc "\verb/[0,,,,line width=2pt]/". Voici la structure de la molécule : +\exemple{Structure}|\setcrambond{2pt}{}{} +\chemfig{HO-[2,0.5,2]?<[7,0.7]-[,,,, +line width=2pt]>[1,0.7]-[3,0.7]O-[4]?}| + +Il ne reste plus qu'à rajouter les ramifications, mises au bon endroit, en spécifiant des angles absolus correctement choisis et des longueurs parfois réduites pour mieux donner l'illusion de la perspective : +\exemple{Projection de Haworth}|\setcrambond{2pt}{}{} +\chemfig{HO-[2,0.5,2]?<[7,0.7](-[2,0.5]OH)-[,,,, +line width=2pt](-[6,0.5]OH)>[1,0.7](-[6,0.5]OH)-[3,0.7] +O-[4]?(-[2,0.3]-[3,0.5]OH)}| + +\subsection{Adrénaline} +On cherche à dessiner la molécule d'adrénaline : +\chemfig{*6((-HO)-=-(-(<[::60]OH)-[::-60]-[::-60,,,2]HN-[::+60]CH_3)=-(-HO)=)} + +Nous allons utiliser deux méthodes différentes. + +\subsubsection{Utilisation d'un cycle} +Tout d'abord, on part du 6-cycle et nous dessinons le début des ramifications qui en partent : +\exemple[60]{Structure de l'adrénaline}|\chemfig{*6((-HO)-=-(-)=-(-HO)=)}| + +Il faut maintenant compléter la ramification de droite en utilisant, par exemple, des angles relatifs : +\exemple[60]{Adrénaline, étape 2}|\chemfig{*6((-HO)-=-(--[::-60]-[::-60] +HN-[::+60]CH_3)=-(-HO)=)}| + +Puis, il faut rajouter la liaison de Cram vers \verb-OH- et spécifier que la liaison qui arrive sur "\verb-NH-" le fait sur le second atome "N". Nous utilisons le 4\ieme{} argument optionnel de la liaison : +\exemple[60]{Adrénaline}|\chemfig{*6((-HO)-=-(-(<[::60]OH)-[::-60]-[::-60,,,2] +HN-[::+60]CH_3)=-(-HO)=)}| + +\subsubsection{Utilisation de 2 cycles} +Cette méthode est moins naturelle, mais le but est ici d'expliquer comment rendre une liaison invisible. + +On pourrait améliorer ce code en considérant que le dessin de la molécule d'adrénaline est constitué de deux 6-cycles accolés l'un à l'autre : +\exemple[60]{Adrénaline, structure 2 cycles}|\chemfig{*6((-HO)-=*6(--HN---)-=-(-HO)=)}| + +Il faut donc rendre invisible les deux premières liaisons du cycle de droite. Pour cela, on se sert de l'argument qui est passé à \TIKZ en spécifiant "\verb-draw=none-". Ces liaisons ont donc ce code : "\verb/-[,,,,,draw=none]/". Pour que le code reste lisible, on définit un alias nommé "\verb-&-" pour ces liaisons : +\exemple[60]{Adrénaline, étape 2}|\definesubmol{&}{-[,,,,draw=none]} +\chemfig{*6((-HO)-=*6(!&!&HN---)-=-(-HO)=)}| + +Le reste devient facile, il suffit d'ajouter les ramification aux bons sommets : +\exemple[60]{Adrénaline, étape 3}|\definesubmol{&}{-[,,,,draw=none]} +\chemfig{*6((-HO)-=*6(!&!&HN(-CH_3)--(\footnotesize l>\footnotesize p{9cm}}\\\hline +\hfill\normalsize Commandes\hfill\null &\hfill\normalsize Description\hfill\null\\\hline +\verb-\chemfig-&dessine la molécule dont le dessin est décrit par le \verb--\\ +\verb-\definesubmol{}{}- & créé un alias \verb-!- que l'on peut placer dans le code des molécules à dessiner qui remplace le \verb--. Voir page~\pageref{definesubmol}\\ +\verb-\redefinesubmol{}{}- & remplace l'alias déjà existant \verb-!- par le nouveau \verb--. Voir page~\pageref{redefinesubmol}\\[2ex]\hline +&\\ +\verb-\setcrambond{}{}{}- & règle les dimensions des triangles représentrant les liaisons de Cram : \verb-- est la largeur de la base, \verb-- est l'espacement entre les pointillés et \verb-- est la largeur des pointillés. Voir page~\pageref{setcrambond}\\ +\verb-\setatomsep{}>- & règle la distance interatome. Voir page~\pageref{setatomsep}\\ +\verb-\setbondoffset{}- & règle l'espacement entre les atomes liés et la liaison. Voir page~\pageref{setbondoffset}\\ +\verb-\setdoublesep{}- & règle l'espacement entre les deux traits d'une double liaison. Voir page~\pageref{setdoublesep}\\[2ex]\hline +&\\ +\verb-\lewis{,}- & affiche l'\verb-- et positionne les décorations de Lewis selon ce qui est spécifié dans le \verb--. Les décorations dessinées ne modifient pas la boîte englobante de l'\verb--. Voir page~\pageref{lewis}\\ +\verb-\setlewis{}{}{}- & règle les décoration de Lewis; \verb-- est la distance entre l'atome et la décoration, \verb-- est la longueur du trait représentant la paire d'électrons et \verb-- est le code qui sera passé directement à \TIKZ. Voir page~\pageref{setlewis}\\[2ex]\hline +&\\ +\verb-\chemsign[]- & affiche le \verb-- en plaçant avant et après un espace insécable de longueur \verb--. Voir page~\pageref{chemsign}\\ +\verb-\chemrel[][]{}- & affiche une flèche décrite par son \verb-- en positionnant les textes optionnels \verb-- et \verb-- respectivement au dessus et au dessous de la flèche. Voir page~\pageref{chemrel}\\ +\verb-\setchemrel{}{}{}- & règle les dimensions des flèches dessinées avec la commande \verb-\chemrel- : \verb-- est l'espacement vertical entre la flèche et les textes optionnels, \verb-- est l'espacement horizontal insécable inséré avant et après la flèche et \verb-- est la longueur de la flèche. Voir page~\pageref{setchemrel}\\[2ex]\hline +&\\ +\verb-\chemabove[]{}{txt2}- & écrit le \verb-- et positionne le \verb-- au dessus en laissant \verb-- d'espacement vertical. Cette commande ne change pas la boîte englobante de \verb--. Voir page~\pageref{chemabove}\\ +\verb-\chembelow[]{}{txt2}- & écrit le \verb-{txt1}- et positionne le \verb-- au dessous en laissant \verb-- d'espacement vertical. Cette commande ne change pas la boîte englobante de \verb--. Voir page~\pageref{chemabove}\\\hline +\end{tabular} +\end{center} +\newpage + +\part{Galerie} +Ce manuel s'achève avec des dessins de molécules plus ou moins complexes. + +L'utilisateur curieux pourra s'intéresser au \verb-- de chaque molécule, bien que celui-ci devienne parfois rebutant lorsqu'elles deviennent complexes. En effet, au delà d'un certain niveau de complexité, bien qu'il soit est assez facile d'écrire un \verb-- pour dessiner une molécule, il est assez ardu de relire ce \verb-- pour l'analyser à postériori. On atteint rapidement les limites de la lisibilité immédiate du code d'un dessin complexe. + +Quoi qu'il en soit, j'espère que cette extension aidera tous les utilisateurs de \LaTeX{} qui souhaitent dessiner des molécules chimiques. Compte tenu de la jeunesse de cette extension, j'espère que vous serez indulgent quant aux bugs rencontrés et m'enverrez un \href{mailto:unbonpetit@gmail.com}{\texttt{\textbf{email}}} pour me signaler tout dysfonctionnement ou toute proposition d'amélioration.\nobreak + +\hfill Christian \textsc{Tellechea} +\bigskip + +TODO list : +\begin{itemize} + \item écrire la traduction de ce manuel en anglais; + \item permettre à l'utilisteur de spécifier, s'il le veut pour une liaison, la distance $\delta$ (voir page~\pageref{longueur.liaison}) entre les extrémités de cette liaison et les boîtes englobantes des atomes qu'elle relie. Une idée de syntaxe serait d'utiliser le caractère "\verb-#-" :\par\smallskip + \hfill\verb--{\color{red}\verb-#(dim1,dim2)-}\verb-[]-\hfill\null\par\smallskip + où la \verb-- et la \verb-- seraient les dimensions $\delta$ du début et de la fin de la liaison; + \item ajouter la représentation de Newman aux fonctionnalités de \CF. +\end{itemize} +\begin{center} +\parskip0pt +$\star$\par +$\star\quad\star$ +\end{center} +\bigskip + +\exemple*{2-methylpentane}/\chemfig{[7]H_3C-CH(-[6]CH_3)-[1]CH_2-CH_2-[1]CH_3}/ + +\exemple*{3-éthyl-2-méthylhexane}/\chemfig{H_3C-[7]CH(-[6]CH_3)-[1]CH(-[7]C_3H_7)-[2]CH_2-[3]H_3C}/ + +\exemple*{Stéarine, formule semi développée}/\definesubmol{@}{([0,2]-O-[0,1]C(=[2,1]O)-C_{17}H_{33})} +\chemfig{[2,2]CH_2!@-CH_{\phantom 2}!@-CH_2!@}/ + +\exemple*{Stéarine, formule topologique}/\definesubmol{x}{-[:+30,.6]-[:-30,.6]} +\definesubmol{y}{-O-(=[2,.6]O)-!x!x!x!x!x!x!x!x} +\chemfig{[2](!y)-[,1.5](!y)-[,1.5](!y)}/ + +\exemple*{2-méthylpropanoate de méthyl}/\chemfig{H_3C-CH_2(-[2]CH_3)-C(=[1]O)-[7]O-CH_3}/ + + +\exemple*{La vanilline}/\chemfig{HC*6(-C(-OH)=C(-O-[::-60]CH_3)-CH=C(-[,,,2]HC=[::-60]O)-HC=[,,2])} \quad ou \quad +\chemfig{*6(-(-OH)=(-OCH_3)-=(-=[::-60]O)-=)}/ + +\exemple*{La caféine}/\chemfig{*6((=O)-N(-CH_3)-*5(-N=-N(-CH_3)-=)--(=O)-N(-H_3C)-)}/ + +\exemple*{L'aspirine}/\chemfig{*6(-=-(-O-[::-60](=[::-60]O)-[::+60])=(-(=[::+60])-[::-60]OH)-=)}/ + +\exemple*{Anhydride phtalique}/\chemfig{*6(=*5(-(=O)-O-(=O)-)-=-=-)}/ + +\exemple*{Camphre}/\chemfig{*6((-[:170])(-[:-110])-(-[:90]?)--(=O)-(-)-?-)} +\quad ou \quad +\setcrambond{3pt}{}{} +\chemfig{<[:10](>[:85,1.8]?(-[:160,0.6])-[:20,0.6]) +>[:-10]-[:60](=[:30,0.6]O)-[:170]?(-[:30,0.6])-[:190]-[:240]}/ + +\exemple*{Triphenylméthane}/\chemfig{*6(-=-*6(-(-*6(=-=-=-))-*6(=-=-=-))=-=)} +\quad ou \quad +\definesubmol{@}{*6(=-=-=-)} +\chemfig{(-[:-30]!@)(-[:90]!@)(-[:210]!@)}/ + +\exemple*{Amygdaline}/\setcrambond{2pt}{}{} +\definesubmol{c1}{-[:200]-[:120]O-[:190]} +\definesubmol{c2}{-[:170](-[:200,0.7]HO)<[:300](-[:170,0.6]HO) +-[:10,,,,line width=2pt](-[:-40,0.6]OH)>[:-10]} +\definesubmol{csub}{-[:155,0.65]-[:90,0.65]} +\chemfig{O(!{c1}(!{csub}O(!{c1}(!{csub}OH)!{c2}))!{c2})-[:-30](-[:-90]CN)-[:30]*6(=-=-=-)}/ + +\exemple*{Adénosine triphosphate}/\setcrambond{3pt}{}{} +\definesubmol{a}{-P(=[::-90]O)(-[::90]HO)-} +\chemfig{[:-54]*5((--[::60]O([::-60]!aO([::-60]!aO([::60]!aHO))))<(-OH) +-[,,,,line width=2pt](-OH)>(-N*5(-=N-*6(-(-NH_2)=N-=N-)=_-))-O-)}/ + +\exemple*{Viagra}/\chemfig{N*6((-H_3C)---N(-S(=[::+120]O)(=[::+0]O)-[::-60]*6(-=-(-O-[::-60]-[::+60]CH_3) +=(-*6(=N-*5(-(--[::-60]-[::+60]CH_3)=N-N(-CH_3)-=)--(=O)-N(-H)-))-=))---)}/ + +\exemple*{Ester de cholestérol}/\chemfig{[:30]R-(=[::+60]O)-[::-60]O-*6(--*6(=--*6(-*5(---(-(-[::+60]Me) +-[::-60]-[::-60]-[::+60]-[::-60](-[::-60]Me)-[::+60]Me)-)-(-[::+0]Me)---)--)-(-[::+0]Me)---)}/ + +\exemple*{Porphyrine}/\chemfig{?=[::+72]*5(-N=(-=[::-72]*5(-[,,,2]HN-[,,2](=-[::-36]*5(=N-(=-[::-72]*5(-NH-[,,1]?=-=)) +-=-))-=-))-=-)}/ + +\exemple*{Manganese 5,10,15,20-tétra(N-ethyl-3-carbazolyl) porphyrine}/\definesubmol{A}{*6(=-*5(-*6(-=-=-)--N(--[::-60])-)=-=-)} +\chemfig{([::+180]-!A)=[::+72]*5(-N=(-(-[::+54]!A)=[::-72]*5(-N(-[::-33,1.5,,,draw=none]Mn) +-(=(-[::+72]!A)-[::-36]*5(=N-(=(-[::+54]!A)-[::-72]*5(-N-(-)=-=))-=-))-=-))-=-)}/ + +\exemple*{Pénicilline}/\chemfig{[:-90]HN(-[::-45](-[::-45]R)=[::+45]O)>[::+45]*4(-(=O)-N*5(-(<:(=[::-60]O) +-[::+60]OH)-(<[::+0])(<:[::-108])-S>)--)}/ + +\exemple*{LSD}/\chemfig{[:150]?*6(=*6(--*6(-N(-CH_3)--(<(=[::+60]O)-[::-60]N(-[::+60]-[::-60]) +-[::-60]-[::+60])-=)([::-120]}]--(} +\chemfig{*6(-=*5(-\chembelow{N}{H}-(-R_2)=(-R_1)-)-=-=)}/ + +\exemple*{Taxotère}/\chemfig{-[::-30](-[5])(-[7])-[::+60]-[::-60]O-[::+60](=[::-45]O)-[::+90]HN>:[::-60](-[::+60]**6(------)) +-[::-30](<:[2]OH)-[::-60](=[6]O)-[::+60]O>:[::-60]*7(---?(<[::-120]OH)-(<|[1]CH_3)(<:[::-90]CH_3) +-(-[1](<[::+80]HO)-[0](=[::+60]O)-[7](<|[::+130]CH_3)(-[::+75](<|[2]OH)-[::-60]-[::-60](<[::+30]O-[::-90]) +-[::-60](<[::+90])(<:[::+30]O-[7](-[6]CH_3)=[0]O)-[::-60])-[6]-[5,1.3]?(<:[7]O-[5](=[::-60]O) +-[6]**6(------)))=(-[2]CH_3)-)}/ +\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/tex/latex/chemfig/chemfig.sty b/Master/texmf-dist/tex/latex/chemfig/chemfig.sty new file mode 100644 index 00000000000..b594c97f38a --- /dev/null +++ b/Master/texmf-dist/tex/latex/chemfig/chemfig.sty @@ -0,0 +1,946 @@ +% _________________________________________________________________ +% | | +% | | +% | chemfig v0.1 | +% | | +% | June 23, 2010 | +% | | +% |_________________________________________________________________| +% +% This is chemfig.sty, the code of the "chemfig" package. +% +% Maintainer: Christian Tellechea +% E-mail : unbonpetit@gmail.com +% Comments, bug reports and suggestions are welcome. +% Licence : Released under the LaTeX Project Public License v1.3c or +% later, see http://www.latex-project.org/lppl.txt +% Copyright : Christian Tellechea 2010 +% +% The "chemfig" package consists of the 4 following files: +% chemfig.sty (this file) +% README +% chemfig_doc_fr.tex, chemfig_doc_fr.pdf (manual in french) +% +% ------------------------------------------------------------------- +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% ------------------------------------------------------------------- +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Christian Tellechea +% ------------------------------------------------------------------- +\newcommand*\CF@ver {0.1} +\newcommand*\CF@date {2010/06/23} +\newcommand*\CF@fr@date {23 juin 2010} +\newcommand*\CF@en@date {June 23, 2010} +\newcommand*\CF@package@name{chemfig} + +\ProvidesPackage\CF@package@name[\CF@date\space v\CF@ver\space Draw molecule with an easy syntax] +\NeedsTeXFormat{LaTeX2e} +\RequirePackage{tikz} + +\newcount\CF@cnt@atomingroup +\newcount\CF@cnt@groupnumber +\newcount\CF@cnt@atomnumber +\newcount\CF@cnt@cycle + +\newif\ifCF@incycle +\newif\ifCF@cyclearc + +\newdimen\CF@dimax +\newdimen\CF@dimbx +\newdimen\CF@dimay +\newdimen\CF@dimby + +\newbox\CF@lewis@box +\newbox\CF@box@boxa +\newbox\CF@box@boxb + +\newcommand*\CF@display@chem[1]{\ensuremath{\mathrm{#1}}} + +\def\CF@empty@node{{}} + +\newcommand*\CF@global@let{\global\let} + +\expandafter\let\expandafter\CF@char@triplebond\string~ + +\def\CF@cycle@inraduiscoeff{0.75}% coeff multiplicateur du rayon des arcs dans les cycles + +\newcommand*\setcrambond[3]{% + \def\CF@cram@basewidth{#1}% + \ifx\@empty#2\@empty\def\CF@cram@dashlength{1pt}\else\def\CF@cram@dashlength{#2}\fi + \ifx\@empty#3\@empty\def\CF@cram@dashsep{2pt}\else\def\CF@cram@dashsep{#3}\fi} +\setcrambond{}{}{} + +\newcommand*\setatomsep[1]{\def\CF@atom@sep{#1}}% espacement des atomes liés +\setatomsep{} + +\newcommand*\setbondoffset[1]{\def\CF@bond@offset{#1}}% offset des liaisons +\setbondoffset{2pt} + +\newcommand*\setdoublesep[1]{\def\CF@double@sep{#1}} +\setdoublesep{2pt} + +\newcommand*\CF@read@manual{Please, read the manual.} + +\newcommand*\definesubmol[2]{% #1 est le nom, #2 est le code + \ifcsname CF@@#1\endcsname + \PackageWarning\CF@package@name{The submol "#1" already defined\MessageBreak I redefined it instead.}% + \fi + \expandafter\def\csname CF@@#1\endcsname{#2}% +} + +\newcommand*\redefinesubmol[2]{% + \unless\ifcsname CF@@#1\endcsname + \PackageWarning\CF@package@name{The submol "#1" cannot be redefined\MessageBreak I defined it instead.}% + \fi + \expandafter\def\csname CF@@#1\endcsname{#2}% +} + +\newcommand*\CF@if@integer[1]{% + \begingroup + \afterassignment\CF@after@integer + \CF@cnt@cycle0#1\relax +} + +\def\CF@after@integer#1\relax{% + \endgroup + \ifx\@empty#1\@empty\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi +} + +\def\CF@swap@fi#1\fi{\fi#1} + +\def\CF@gobble@tonil#1\@nil{} + +\newcommand*\CF@swap@arg[2]{#2{#1}} + +\newcommand*\CF@expand@second[2]{\expandafter\CF@swap@arg\expandafter{#2}{#1}} + +\newcommand*\CF@swap@two[2]{#2#1} + +\newcommand*\CF@expand@afterfirst[2]{\expandafter\CF@swap@two\expandafter{#2}{#1}} + +\newcommand*\CF@edef@second[2]{% + \begingroup\edef\CF@tmp@str{#2}\expandafter\endgroup + \expandafter\CF@swap@two\expandafter{\CF@tmp@str}{#1}% +} + +\newcommand*\CF@add@tocs[2]{\expandafter\def\expandafter#1\expandafter{#1#2}} + +\newcommand*\CF@expadd@tocs[2]{\expandafter\CF@add@tocs\expandafter#1\expandafter{#2}} + +\newcommand*\CF@edefadd@tocs[2]{% + \begingroup\edef\CF@tmp@str{#2}\expandafter\endgroup + \expandafter\CF@add@tocs\expandafter#1\expandafter{\CF@tmp@str}% +} + +\newcommand*\CF@if@firsttokmatch[2]{% est ce que #1 et #2 commencent par les mêmes tokens ? + \futurelet\CF@toks@a\CF@gobble@tonil#1\relax\@nil + \futurelet\CF@toks@b\CF@gobble@tonil#2\relax\@nil + \csname @\ifx\CF@toks@a\CF@toks@b first\else second\fi oftwo\endcsname +} + +\newcommand*\CF@if@firsttokin[2]{% teste si le token qui commence #1 appartient aux tokens mis dans #2 + \ifx\@empty#2\@empty% + \expandafter\@secondoftwo + \else + \CF@if@firsttokmatch{#1}{#2}% + {\expandafter\@firstoftwo}% + {\CF@swap@fi\CF@expand@second{\CF@if@firsttokin{#1}}{\@gobble#2}}% + \fi +} + +\newcommand*\CF@if@instr[2]{% + \def\CF@if@instr@i##1#2##2\@nil{\ifx\@empty##2\@empty\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}% + \CF@if@instr@i#1\@@nil#2\@nil +} + +\newcommand*\CF@seek@node[3]{% cherche un noeud au début de #1 l'assigne dans la sc #2 et met le reste dans #3 + \let#2\@empty + \def#3{#1}% + \CF@seek@node@i{#1}#2#3% +} + +\newcommand*\CF@seek@node@i[3]{% + \ifx\@empty#1\@empty + \let#3\@empty + \else + \CF@if@firsttokmatch{#1}\bgroup + {\CF@expadd@tocs#2{\expandafter{\@car#1\@nil}}% + \CF@swap@fi\CF@expand@second\CF@seek@node@i{\@gobble#1}#2#3% + }% + {\CF@expand@second\CF@if@firsttokin{\@car#1\@nil}{-=\CF@char@triplebond<>(!*}% + {\def#3{#1}}% + {\CF@expadd@tocs#2{\@car#1\@nil}% + \CF@swap@fi\CF@expand@second\CF@seek@node@i{\@gobble#1}#2#3% + }% + }% + \fi +} + +% on sait que #1 commence par -,=,~,<,>. On analyse cette liaison +% #2 reçoit le type de liaisons (1 pour -, 2 pour =, 3 pour ~) +\newcommand*\CF@bond@findnum[2]{% + \futurelet\CF@toks@a\CF@gobble@tonil#1\@nil + \edef#2{% + \ifx-\CF@toks@a1% + \else + \ifx=\CF@toks@a2% + \else + \ifx\CF@char@triplebond\CF@toks@a3% + \else + \ifx>\CF@toks@a4% + \else + \ifx<\CF@toks@a5% + \else0% si 0 --> il y a une erreur non dûe à l'utilisateur + \fi + \fi + \fi + \fi + \fi}% + \ifnum#2>\thr@@% si c'est une liaison de Cram + \expandafter\futurelet\expandafter\CF@toks@a\expandafter\CF@gobble@tonil\@gobble#1\@nil% chope le caractère suivant + \ifx:\CF@toks@a + \edef#2{\number\numexpr#2+2}% si c 'est un :, signe du pointillé, ajoute 2 + \else + \ifx|\CF@toks@a + \edef#2{\number\numexpr#2+4}% si c 'est un "|", signe du triangle évide, ajouter 4 + \fi + \fi + \fi +} + +\newcommand*\CF@analyse@bond[2]{% + \CF@bond@findnum{#1}#2% + \expandafter\def\expandafter\CF@remain@afterbond\expandafter{\@gobble#1}%mange le premier signe de la liaison + \let\CF@doublebond@type\z@ + \ifnum#2=\tw@% si c'est une double liaison, regarde s'il y a un + ou - derrière + \expandafter\futurelet\expandafter\CF@toks@a\expandafter\CF@gobble@tonil\@gobble#1\@nil + \ifx^\CF@toks@a + \let\CF@doublebond@type\@ne + \expandafter\def\expandafter\CF@remain@afterbond\expandafter{\@gobbletwo#1}% mange le "^" + \else + \ifx_\CF@toks@a + \let\CF@doublebond@type\tw@ + \expandafter\def\expandafter\CF@remain@afterbond\expandafter{\@gobbletwo#1}% mange le "_" + \fi + \fi + \else + \ifnum#2>5 % si c'est une laision de Cram pointillée ou triangle évidé + \expandafter\def\expandafter\CF@remain@afterbond\expandafter{\@gobbletwo#1}% mange un caractère de plus + \fi + \fi + \expandafter\CF@if@firsttokmatch\expandafter{\CF@remain@afterbond}[% + {\expandafter\CF@seekbond@optarg\CF@remain@afterbond\@nil\CF@remain@afterbond}% + {\expandafter\CF@seekbond@optarg\expandafter[\expandafter]\CF@remain@afterbond\@nil\CF@remain@afterbond}% + \ifCF@incycle + \pgfmathparse{360/\CF@cycle@num+\CF@initcycle@angle}% + \edef\CF@current@stringangle{::+\pgfmathresult}% + \def\CF@initcycle@angle{0}% + \let\CF@current@length\CF@default@length% et on ignore la longueur de liaison spécifiée + \fi + \CF@expand@second\CF@set@bondangle{\CF@current@stringangle}\CF@current@angle +} + +\newcommand*\CF@set@bondangle[2]{% le code de la direction est contenu dans #1, en sortie, #2 contient l'angle + \ifx\@empty#1\@empty% + \let#2\CF@default@angle + \else + \if:\expandafter\noexpand\@car#1\@nil + \if:\expandafter\expandafter\expandafter\noexpand\expandafter\@car\@gobble#1\@nil + \pgfmathparse{\CF@previous@angle+\expandafter\@gobble\@gobble#1}% + \let#2\pgfmathresult + \else + \CF@expand@second{\def#2}{\@gobble#1} + \fi% puis normalise l'angle entre 0 et 360 + \pgfmathparse{#2-360*floor(#2/360)}% + \ifdim\pgfmathresult pt<\z@\pgfmathparse{\pgfmathresult+360}\fi + \let#2\pgfmathresult + \else + \pgfmathparse{#1-floor(#1/8)*8}% + \ifdim\pgfmathresult pt<\z@\pgfmathparse{\pgfmathresult+8}\fi + \edef#2{\ifcase\expandafter\CF@int@part\pgfmathresult\@nil0\or45\or90\or135\or180\or225\or270\or315\else-1\fi}% angle =-1 --> erreur + \fi + \fi +} + +\def\CF@int@part#1.#2\@nil{#1 } + +\newcommand*\CF@test@assign[3]{\ifx\@empty#2\@empty\let#1#3\else\def#1{#2}\fi} + +% #1 est une liste de 4 éléments a,b,c,d chacun assignés aux sc #2,#3,#4,#5 +\newcommand*\CF@parse@list[6]{% + \def\CF@parse@list@i##1,##2,##3,##4,##5\@nil{% + \CF@test@assign#2{##1}\CF@default@stringangle + \CF@test@assign#3{##2}\CF@default@length + \CF@test@assign#4{##3}\CF@default@fromatom + \CF@test@assign#5{##4}\CF@default@toatom + \CF@test@assign#6{##5}\CF@default@tikz}% + \CF@parse@list@i#1,,,,\@nil +} + +\def\CF@seekbond@optarg[#1]{% + \CF@parse@list{#1}\CF@current@stringangle\CF@current@length\CF@current@fromatom\CF@current@toatom\CF@current@tikz + \CF@seekbond@optarg@i\relax +} + +\def\CF@seekbond@optarg@i#1\@nil#2{% + \CF@expand@second{\def#2}{\@gobble#1}% le \@gobble bouffe le \relax et laisse intact le reste +} + +\newcommand*\CF@seek@submol{% + \CF@expand@second\CF@if@firsttokmatch\CF@remain@molecule!% + {\expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\CF@remain@molecule + \expandafter\expandafter\expandafter + {\csname CF@@\expandafter\expandafter\expandafter\@car\expandafter\@gobble\CF@remain@molecule\@nil + \expandafter\expandafter\expandafter\endcsname\csname @gobble\expandafter\expandafter\expandafter\endcsname + \csname @gobble\expandafter\endcsname\CF@remain@molecule}% + \CF@seek@submol + }% + \relax +} + +\newcommand*\CF@insert@emptygroup[1]{% insère {} au début de la sc #1 + \expandafter\def\expandafter#1\expandafter{\expandafter{\expandafter}#1}% +} + +\newcommand*\CF@make@other[1]{% + \ifx\@empty#1\@empty + \else + \expandafter\@makeother\@car#1\@nil + \CF@swap@fi + \CF@expand@second\CF@make@other{\@gobble#1}% + \fi +} + +\newcommand*\chemfig{% + \begin{tikzpicture}[every node/.style={anchor=base,inner sep=0pt,outer sep=0pt,minimum size=0pt},baseline] + \begingroup + \CF@global@let\CF@hook@list\@empty + \ifx\CF@atom@sep\@empty\def\CF@atom@sep{3em}\fi + \ifx\CF@cram@basewidth\@empty\def\CF@cram@basewidth{1.5ex}\fi + \CF@incyclefalse + \global\CF@cnt@groupnumber\z@ + \let\CF@last@action\z@% 0=début du dessin 1=tracé d'un noeud 2=tracé d'une liaison + \gdef\CF@cycle@anglecorrection{180/\CF@cycle@num}% + \everyeof{\@nil}\endlinechar\m@ne + \CF@make@other{[]:(),-=~!?<>;*|}% + \CF@chemfig@i +} + +\newcommand*\CF@chemfig@i[1]{% + \CF@chemfig@ii{#1}% + \end{tikzpicture}% +} + +\newcommand*\CF@chemfig@ii[1]{% #1 est le code de la molécule + \ifnum\CF@last@action=\thr@@ + \ifCF@incycle + \def\CF@default@angle{0}% + \else + \ifnum\CF@cnt@cycle=\z@% si c'est le début d'un cycle + \pgfmathparse{\CF@previous@angle+180+\CF@cycle@anglecorrection}% on met la liaison à +180° + correction + \else + \pgfmathparse{\CF@previous@angle-90+180/\CF@cycle@num}% sinon à la bissectrice du sommet du cycle + \fi + \let\CF@default@angle\pgfmathresult + \fi + \else + \def\CF@default@angle{0}% + \fi% angle par défaut + \let\CF@current@angle\CF@default@angle + \def\CF@default@stringangle{:0}% + \def\CF@default@length{1}% longueur de la liaison par défaut + \let\CF@default@fromatom\@empty% numero de l'atome d'où partent les liaisons par défaut + \let\CF@default@toatom\@empty% numéro de l'atome où arrivent les laisons par défaut + \let\CF@default@tikz\@empty + \if[\expandafter\noexpand\@car#1\@nil + \CF@seekbond@optarg#1\@nil\CF@remain@molecule + \expandafter\CF@set@bondangle\expandafter{\CF@current@stringangle}\CF@current@angle + \let\CF@default@angle\CF@current@angle + \let\CF@previous@angle\CF@current@angle + \unless\ifx\@empty\CF@current@stringangle\let\CF@default@angle\CF@current@angle\fi + \unless\ifx\@empty\CF@current@length\let\CF@default@length\CF@current@length\fi + \unless\ifx\@empty\CF@current@fromatom\let\CF@default@fromatom\CF@current@fromatom\fi + \unless\ifx\@empty\CF@current@toatom\let\CF@default@toatom\CF@current@toatom\fi + \unless\ifx\@empty\CF@current@tikz\let\CF@default@tikz\CF@current@tikz\fi + \else + \def\CF@remain@molecule{#1}% on prend tout puisque pas d'argument optionnel au début + \fi% après l'argument entre crochet au début, on passe à la suite + \ifCF@incycle% si on commence un cycle + \let\CF@current@angle\CF@previous@angle + \else + \let\CF@current@angle\CF@default@angle + \fi + \edef\CF@default@stringangle{:\CF@default@angle}% + \let\CF@current@length\CF@default@length + \let\CF@current@fromatom\CF@default@fromatom + \let\CF@current@toatom\CF@default@toatom + \let\CF@current@tikz\CF@default@tikz + \ifnum\CF@last@action=\z@ + \let\CF@previous@angle\CF@default@angle + \node(CF@node){}; + \CF@expand@second\CF@if@firsttokin{\CF@remain@molecule}{-=(*\CF@char@triplebond?<>}% + {\CF@insert@emptygroup\CF@remain@molecule}% + \relax + \fi + \CF@chemfig@iii +} + +\newcommand*\CF@chemfig@iii{% + \let\CF@next@scan\CF@chemfig@iii% à prioi, on reboucle + \ifx\CF@remain@molecule\@empty + \let\CF@next@scan\endgroup + \else + \CF@seek@submol + \CF@expand@second\CF@seek@node{\CF@remain@molecule}\CF@current@atomgroup\CF@remain@molecule + \ifx\@empty\CF@current@atomgroup% pas de noeud pour commencer ? + \def\CF@bond@outnode{n\CF@last@groupnumber-% + \ifx\CF@current@fromatom\@empty + \ifdim\CF@current@angle pt<90pt \number\CF@cnt@atomingroup + \else\ifdim\CF@current@angle pt>270pt \number\CF@cnt@atomingroup\else1\fi + \fi + \else\CF@current@fromatom + \fi}% + \CF@expand@second\CF@if@firsttokin\CF@remain@molecule{-=<>\CF@char@triplebond}% la suite est une liaison + {\ifnum\CF@last@action=\tw@% c'est la deuxième liaison consécutive ? + \CF@insert@emptygroup\CF@remain@molecule% insère un groupe vide + \edef\CF@bond@outnode{\CF@bond@outnode}% + \else + \ifCF@incycle\advance\CF@cnt@cycle\@ne\fi + \CF@expand@second\CF@analyse@bond{\CF@remain@molecule}\CF@bond@type + \edef\CF@bond@outnode{\CF@bond@outnode}% + \let\CF@remain@molecule\CF@remain@afterbond + \csname @% il y a plus de liaisons que de sommet dans le cycle ? + \ifCF@incycle + \ifnum\CF@cnt@cycle=\CF@cycle@num first\else second\fi + \else second\fi + oftwo% + \endcsname + {\let\CF@next@scan\endgroup + \CF@draw@bond\CF@bond@type{\CF@bond@outnode}{\CF@hook@cycle}\CF@previous@atomgroup\CF@hook@atomgroup}% + {\node[at=(\CF@bond@outnode),shift=(\CF@current@angle:\CF@current@length*\CF@atom@sep)](CF@node){}; + \let\CF@previous@angle\CF@current@angle + \let\CF@last@action\tw@}% + \fi + \ifx\CF@remain@molecule\@empty% plus rien après la liaison -> insère un groupe vide + \CF@insert@emptygroup\CF@remain@molecule + \fi + }% + {\edef\CF@bond@outnode{\CF@bond@outnode}% évalue le l'atome de départ de liaison + \CF@expand@second\CF@if@firsttokmatch\CF@remain@molecule(% une parenthèse pour commencer ? + {\ifnum\CF@last@action=\tw@% il y avait une liaison juste avant ? + \CF@insert@emptygroup\CF@remain@molecule + \else + \CF@expand@second\CF@grab@submol\CF@remain@molecule + \begingroup + \ifCF@incycle\let\CF@last@action\thr@@\fi% on était dans un cycle + \CF@incyclefalse + \aftergroup\CF@chemfig@iii + \def\CF@next@scan{\CF@expand@second\CF@chemfig@ii\CF@sub@mol}% + \fi + }% + {\ifx\CF@remain@molecule\@empty + \let\CF@next@scan\endgroup + \else% ce qui reste après le noeud courant n'est pas vide, ne commence pas par "-=~", ni par une parenthèse + \CF@expand@second\CF@if@firsttokmatch\CF@remain@molecule*% un cycle ? + {\ifnum\CF@last@action=\tw@ + \CF@insert@emptygroup\CF@remain@molecule% insère un groupe vide + \else + \ifCF@incycle\let\CF@last@action\thr@@\fi% on était dans un cycle + \ifnum\CF@last@action=\thr@@\let\CF@lastcycle@num\CF@cycle@num\fi + \CF@expand@second{\CF@expand@second\CF@if@firsttokmatch}{\expandafter\@gobble\CF@remain@molecule}*% un 2è "*" ? + {\CF@expand@second{\CF@expand@second{\def\CF@remain@molecule}}{\expandafter\@gobble\CF@remain@molecule}% enlève la 1er étoile + \CF@expand@second{\CF@expand@second\CF@if@firsttokmatch}{\expandafter\@gobble\CF@remain@molecule}[% un crochet ensuite ? + {\expandafter\CF@cycle@parsepreamblewithoptarg\CF@remain@molecule\@nil% \begingroup inclus + }% + {\def\CF@cyclearc@startangle{0}\def\CF@cyclearc@endangle{360}% + \let\CF@cyclearc@directtikz\@empty + \expandafter\CF@cycle@parsepreamble\CF@remain@molecule\@nil% \begingroup inclus + }% + \CF@cyclearctrue + }% + {\expandafter\CF@cycle@parsepreamble\CF@remain@molecule\@nil% \begingroup inclus + \CF@cyclearcfalse + }% + \CF@cnt@cycle\z@ + \edef\CF@hook@cycle{\CF@bond@outnode}% + \let\CF@hook@atomgroup\CF@previous@atomgroup + \CF@incycletrue + \ifnum\CF@last@action=\thr@@ + \pgfmathparse{360/\CF@lastcycle@num-180}% c'est un cycle dans un cycle + \else + \pgfmathparse{-180/\CF@cycle@num-90+\CF@cycle@anglecorrection}% + \fi + \let\CF@initcycle@angle\pgfmathresult + \ifCF@cyclearc% on doit tracer l'arc de cercle dans le cycle ? + \pgfmathparse{\CF@cycle@inraduiscoeff*\CF@current@length*\CF@atom@sep/(2*tan(180/\CF@cycle@num))}% + \let\CF@cyclearc@radius\pgfmathresult + \pgfmathparse{\CF@current@angle+\CF@initcycle@angle+180/\CF@cycle@num+90} + \let\CF@cyclearc@initangle\pgfmathresult + \pgfmathparse{\CF@current@length*\CF@atom@sep/(2*sin(180/\CF@cycle@num))}% + \node[at=(\CF@bond@outnode),shift=(\CF@cyclearc@initangle:\pgfmathresult pt)](arccenter){};% le centre de l'arc + \node[at=(arccenter),shift=(\CF@cyclearc@startangle:\CF@cyclearc@radius pt)](initarc){};% le début de l'arc + \expandafter\draw\expandafter[\CF@cyclearc@directtikz](initarc) arc (\CF@cyclearc@startangle:\CF@cyclearc@endangle:\CF@cyclearc@radius pt); + \fi + \aftergroup\CF@chemfig@iii + \def\CF@next@scan{\CF@expand@second\CF@chemfig@ii\CF@sub@mol}% + \fi + }% + {\PackageError\CF@package@name{Something went wrong at this point: \detokenize\expandafter{\CF@remain@molecule}}{If you think it's a bug, please, send a Minimal Example to the author.}}% + \fi}% + }% + \else + \CF@expand@second{\CF@expand@second{\CF@expand@second\CF@draw@atomgroup\CF@current@angle}\CF@current@toatom}\CF@current@atomgroup + \fi + \fi + \CF@next@scan +} + +\def\CF@cycle@parsepreamble*#1#2\@nil{% + \ifnum#1<\thr@@ + \PackageError\CF@package@name{A cycle must be at least a triangle.}{} + \fi + \def\CF@remain@molecule{#2}% + \CF@expand@second\CF@grab@submol\CF@remain@molecule + \begingroup + \def\CF@cycle@num{#1}% +} + +\def\CF@cycle@parsepreamblewithoptarg*[#1]#2#3\@nil{% + \CF@cycle@parseoptarg#1,,,\@nil + \CF@cycle@parsepreamble*#2#3\@nil +} + +\def\CF@cycle@parseoptarg#1,#2,#3,#4\@nil{% + \ifx\@empty#1\@empty\def\CF@cyclearc@startangle{0}\else\def\CF@cyclearc@startangle{#1}\fi + \ifx\@empty#2\@empty\def\CF@cyclearc@endangle{360}\else\def\CF@cyclearc@endangle{#2}\fi + \def\CF@cyclearc@directtikz{#3}% +} + +\newcommand*\CF@grab@submol[1]{% + \begingroup + \catcode`(\@ne\catcode`)\tw@ + \expandafter\expandafter\expandafter + \endgroup + \expandafter\CF@grab@submol@i\scantokens{\relax#1}% le \relax sert à meubler pour ne pas que l'argument délimité n'enlève les accolades +} + +\def\CF@grab@submol@i#1\@nil{% + \expandafter\assign@tonil\expandafter\CF@remain@molecule\scantokens\expandafter\expandafter\expandafter{\expandafter\@gobble\@gobble#1}% + \expandafter\assign@tonil\expandafter\CF@sub@mol\scantokens\expandafter\expandafter\expandafter{\expandafter\@car\@gobble#1\@nil}% +} + +\def\assign@tonil#1#2\@nil{\def#1{#2}} + +\newcommand*\CF@ifcar@isupperletter[1]{% + \csname @% + \ifcat\relax\noexpand#1second% faux si c'est une sc + \else + \ifnum`#1<`Asecond\else\ifnum`#1>`Zsecond\else first\fi\fi + \fi + oftwo\endcsname +} + +% Créé 4 noeuds au dessus et au dessous des noeuds #1 et #2 +% à une distance de #3 du noeud #1 et #4 du noeud #2 +\newcommand*\CF@create@normnodes[4]{% + \ifx\@empty#3\@empty\else + \node[at=(#1),xshift=#3*\CF@norm@x,yshift=#3*\CF@norm@y](#11){}; + \node[at=(#1),xshift=-#3*\CF@norm@x,yshift=-#3*\CF@norm@y](#12){}; + \fi + \ifx\@empty#4\@empty\else + \node[at=(#2),xshift=#4*\CF@norm@x,yshift=#4*\CF@norm@y](#21){}; + \node[at=(#2),xshift=-#4*\CF@norm@x,yshift=-#4*\CF@norm@y](#22){}; + \fi +} + +\newcommand*\CF@compute@nodevect[2]{% + \pgfextractx\CF@dimax{\pgfpointanchor{#1}{center}}% + \pgfextracty\CF@dimay{\pgfpointanchor{#1}{center}}% + \pgfextractx\CF@dimbx{\pgfpointanchor{#2}{center}}% + \pgfextracty\CF@dimby{\pgfpointanchor{#2}{center}}% + \pgfmathparse{veclen(\CF@dimbx-\CF@dimax,\CF@dimby-\CF@dimay)}\let\CF@len@vector\pgfmathresult + \pgfmathparse{(\CF@dimay-\CF@dimby)/\CF@len@vector}\let\CF@norm@x\pgfmathresult + \pgfmathparse{(\CF@dimbx-\CF@dimax)/\CF@len@vector}\let\CF@norm@y\pgfmathresult +} + +\newcommand*\CF@draw@bond[5]{% #1=type de liaison #2 et #3:nom de noeuds de début et fin #4 et #5: contenu des atomes de début et fin + \edef\CF@start@offset{\ifx#4\CF@empty@node0pt\else\ifx#4\@empty0pt\else\CF@bond@offset\fi\fi}% + \edef\CF@end@offset{\ifx#5\CF@empty@node0pt\else\ifx#5\@empty0pt\else\CF@bond@offset\fi\fi}% + \path(#2)--(#3)coordinate[pos=0](#2@)coordinate[pos=1](#3@);% + \CF@compute@nodevect{#2@}{#3@}% + \pgfmathparse{\CF@start@offset/\CF@len@vector}\let\CF@start@coeff\pgfmathresult + \pgfmathparse{1-\CF@end@offset/\CF@len@vector}\let\CF@end@coeff\pgfmathresult + \path(#2@)--(#3@)coordinate[pos=\CF@start@coeff](#2@@)coordinate[pos=\CF@end@coeff](#3@@);% + \ifcase#1\relax + \PackageError\CF@package@name{Unknown bond type, this error should not occur}{If you think it's a bug, send a Minimal Example to the author.}% + \or% 1 = liaison simple + \CF@draw@bond@i(#2@@)--(#3@@); + \or% 2 = liaison double + \ifCF@incycle + \ifnum\CF@doublebond@type=\z@ + \let\CF@doublebond@type\@ne + \fi + \fi + \ifcase\CF@doublebond@type + \CF@create@normnodes{#2@@}{#3@@}{\CF@double@sep/2}{\CF@double@sep/2}% + \CF@draw@bond@i(#2@@1)--(#3@@1); + \CF@draw@bond@i(#2@@2)--(#3@@2); + \or + \CF@create@normnodes{#2@@}{#3@@}\CF@double@sep\CF@double@sep + \CF@draw@bond@i(#2@@)--(#3@@); + \CF@draw@bond@i(#2@@1)--(#3@@1); + \or + \CF@create@normnodes{#2@@}{#3@@}\CF@double@sep\CF@double@sep + \CF@draw@bond@i(#2@@)--(#3@@); + \CF@draw@bond@i(#2@@2)--(#3@@2); + \fi + \or% 3 = liaison triple + \CF@create@normnodes{#2@@}{#3@@}\CF@double@sep\CF@double@sep + \CF@draw@bond@i(#2@@)--(#3@@); + \CF@draw@bond@i(#2@@1)--(#3@@1); + \CF@draw@bond@i(#2@@2)--(#3@@2); + \or% 4 = liaison Cram pleine de #2 vers #3 + \CF@create@normnodes{#2@@}{#3@@}{\CF@cram@basewidth/2}{}% + \expandafter\filldraw\expandafter[\CF@current@tikz,line join=bevel](#2@@1)--(#2@@2)--(#3@@)--(#2@@1); + \or% 5 = liaison Cram pleine de #3 vers #2 + \CF@create@normnodes{#3@@}{#2@@}{\CF@cram@basewidth/2}{}% + \expandafter\filldraw\expandafter[\CF@current@tikz,line join=bevel](#3@@1)--(#3@@2)--(#2@@)--(#3@@1); + \or% 6 = liaison Cram pointillée de #2 vers #3 + \begin{scope} + \CF@create@normnodes{#2@@}{#3@@}{\CF@cram@basewidth/2}{}% + \clip(#2@@1)--(#2@@2)--(#3@@)--(#2@@1); + \expandafter\draw\expandafter[\CF@current@tikz,dash pattern=on \CF@cram@dashlength off \CF@cram@dashsep,line width=\CF@cram@basewidth](#2@@)--(#3@@); + \end{scope} + \or% 7 = liaison Cram pointillée de #3 vers #2 + \begin{scope} + \CF@create@normnodes{#3@@}{#2@@}{\CF@cram@basewidth/2}{}% + \clip(#3@@1)--(#3@@2)--(#2@@)--(#3@@1); + \expandafter\draw\expandafter[\CF@current@tikz,dash pattern=on \CF@cram@dashlength off \CF@cram@dashsep,line width=\CF@cram@basewidth](#3@@)--(#2@@); + \end{scope} + \or% 8 = liaison Cram triangle évidé de #2 vers #3 + \CF@create@normnodes{#2@@}{#3@@}{\CF@cram@basewidth/2}{}% + \expandafter\draw\expandafter[\CF@current@tikz,line join=bevel](#2@@1)--(#2@@2)--(#3@@)--(#2@@1); + \or% 9 = liaison Cram triangle évidé de #3 vers #1 + \CF@create@normnodes{#3@@}{#2@@}{\CF@cram@basewidth/2}{}% + \expandafter\draw\expandafter[\CF@current@tikz,line join=bevel](#3@@1)--(#3@@2)--(#2@@)--(#3@@1); + \else + \PackageError\CF@package@name{Unknown bond type, this error should not occur}{If you think it's a bug, send a Minimal Example to the author.}% + \fi +} + +\newcommand*\CF@draw@bond@i{\expandafter\draw\expandafter[\CF@current@tikz]} + +\newcommand*\CF@hook@drawall{% dessine tous les crochets contenus dansla sc \CF@hook@draw + \ifx\CF@hook@drawlist\@empty + \else + \expandafter\CF@hook@drawfirst\CF@hook@drawlist\@nil% trace un lien de crochet à crochet + \expandafter\CF@hook@drawall + \fi +} + +\def\CF@hook@drawfirst[#1,#2,#3]#4#5#6#7#8\@nil% +{% + \def\CF@hook@drawlist{#8}% + \begingroup + \def\CF@current@tikz{#3}% + \def\CF@hook@startcontent{#6}\def\CF@hook@endcontent{#7}% + \CF@if@integer{#2}% + {\CF@draw@bond{#2}{#4}{#5}\CF@hook@startcontent\CF@hook@endcontent}% + {\CF@bond@findnum{#2}\CF@bond@currentnum + \CF@draw@bond\CF@bond@currentnum{#4}{#5}\CF@hook@startcontent\CF@hook@endcontent + }% + \endgroup +} + +\def\CF@extract@atom#1-#2\@nil{#2}% transforme le bound@outnode en n° de l'atome + +\newcommand*\CF@draw@atomgroup[3]{% #1=angle d'arrivée de la liaison #2=numero atome sur lequel arrive la liaison #3=groupe d'atomes + \expandafter\let\expandafter\CF@bond@outcontent% assigne le contenu de l'atome d'où part la liaison + \csname\ifdefined\CF@bond@outnode atom@\expandafter\CF@extract@atom\CF@bond@outnode\@nil\else @empty\fi\endcsname + \global\advance\CF@cnt@groupnumber\@ne + \let\CF@current@atom\@empty + \CF@global@let\CF@hook@drawlist\@empty + \CF@cnt@atomingroup\z@ + \CF@if@firsttokmatch{#3}?{\CF@draw@atomgroup@i{{}#3}}{\CF@draw@atomgroup@i{#3}}% + \def\CF@current@atomgroup{#3}% + \CF@if@instr{#3}?% + {\CF@remove@hook\CF@current@atomgroup + \ifx\@empty\CF@current@atomgroup\let\CF@current@atomgroup\CF@empty@node\fi}% + \relax + \ifx\@empty#2\@empty% + \else + \ifnum#2<\@ne + \PackageWarning\CF@package@name{No atom found at position #2.}{Pershaps you mispelled the optional argument of the bond.}% + \else + \ifnum#2>\CF@cnt@atomingroup + \PackageError\CF@package@name{No atom found at position #2.}{Pershaps you mispelled the optional argument of the bond.}% + \fi + \fi + \fi + \edef\CF@hook@atomnumber{% + \ifx\@empty#2\@empty% + \ifdim#1pt>90pt + \ifdim#1pt<270pt \number\CF@cnt@atomingroup\else1\fi + \else1% + \fi + \else#2% + \fi}% + \CF@cnt@atomnumber\CF@hook@atomnumber + \ifx\CF@current@atomgroup\CF@empty@node + \let\CF@node@strut\@empty + \else + \def\CF@node@strut{\vphantom\CF@bond@outcontent}% + \fi + \def\CF@node@content{\expandafter\CF@display@chem\expandafter{\csname atom@\number\CF@cnt@atomnumber\endcsname\CF@node@strut}}% + \edef\CF@opt@string{anchor=\ifnum\CF@last@action=\z@ base\else center\fi,at=(CF@node)}% premier atome de la molécule affiché + \loop + \unless\ifnum\CF@cnt@atomnumber>\CF@cnt@atomingroup + \expandafter\node\expandafter[\CF@opt@string](n\number\CF@cnt@groupnumber-\number\CF@cnt@atomnumber){\CF@node@content};% + \let\CF@node@strut\@empty + \advance\CF@cnt@atomnumber\@ne + \edef\CF@opt@string{anchor=base west,at=(n\number\CF@cnt@groupnumber-\number\numexpr\CF@cnt@atomnumber-1.base east)}% + \repeat + \CF@cnt@atomnumber\CF@hook@atomnumber + \ifnum\CF@last@action=\tw@% s'il faut tracer une liaison + \gdef\CF@cycle@anglecorrection{0}% alors c'est qu'un cycle ne peut pas commencer la molécule : annulation de la correction d'angle + \CF@draw@bond\CF@bond@type{\CF@bond@outnode}{n\number\CF@cnt@groupnumber-\number\CF@cnt@atomnumber}\CF@previous@atomgroup\CF@current@atomgroup + \fi + \let\CF@last@action\@ne% met la dernière action à 1 : affichage d'un noeud + \loop + \ifnum\CF@cnt@atomnumber>\@ne + \advance\CF@cnt@atomnumber\m@ne + \edef\CF@opt@string{anchor=base east,at=(n\number\CF@cnt@groupnumber-\number\numexpr\CF@cnt@atomnumber+1.base west)}% + \expandafter\node\expandafter[\CF@opt@string](n\number\CF@cnt@groupnumber-\number\CF@cnt@atomnumber){\CF@node@content};% + \repeat + \CF@hook@drawall + \edef\CF@last@groupnumber{\number\CF@cnt@groupnumber}% + \let\CF@previous@atomgroup\CF@current@atomgroup +} + +\newcommand*\CF@draw@atomgroup@i[1]{% transforme #1 en un groupe d'atomes + \ifx\@empty#1\@empty% + \else + \advance\CF@cnt@atomingroup\@ne + \CF@if@firsttokmatch{#1}\egroup + {\CF@expand@second{\def\CF@current@atom}{\expandafter{\@car#1\@nil}}}% + {\CF@expand@second{\def\CF@current@atom}{\@car#1\@nil}}% prend le 1er car + \CF@swap@fi\CF@expand@second\CF@draw@atomgroup@ii{\@gobble#1}% + \fi +} + +\newcommand*\CF@draw@atomgroup@ii[1]{% transforme #1 en un groupe d'atomes + \ifx\@empty#1\@empty% + \expandafter\let\csname atom@\number\CF@cnt@atomingroup\endcsname\CF@current@atom + \let\CF@current@atom\@empty + \else + \CF@if@firsttokmatch{#1}\bgroup + {\CF@expadd@tocs\CF@current@atom{\expandafter{\@car#1\@nil}}% + \CF@swap@fi\CF@expand@second\CF@draw@atomgroup@ii{\@gobble#1}% + }% + {\CF@expand@second\CF@ifcar@isupperletter{\@car#1\@nil}% + {\expandafter\let\csname atom@\number\CF@cnt@atomingroup\endcsname\CF@current@atom + \let\CF@current@atom\@empty + \CF@swap@fi\CF@draw@atomgroup@i{#1} + }% + {\CF@if@firsttokmatch{#1}?% + {\expandafter\CF@if@firsttokmatch\expandafter{\@gobble#1}[% un crochet après le "?" + {\expandafter\CF@grab@optarg\@gobble#1\@nil\CF@after@hook}% + {\expandafter\CF@grab@optarg\expandafter[\expandafter]\@gobble#1\@nil\CF@after@hook}% + \CF@expand@second{\CF@expand@second\CF@if@instr\CF@hook@list}{\expandafter(\CF@hook@currentname)}% crochet déjà défini ? + {\expandafter\CF@hook@parselist\expandafter{\CF@hook@currentname}% va chercher les caractéristiques du crochet sauvegardé + \CF@edefadd@tocs\CF@hook@drawlist{% + [\CF@hook@currentname,\CF@hook@currentlink,\CF@hook@currenttikz]{\CF@hook@savedcoord}{n\number\CF@cnt@groupnumber-\number\CF@cnt@atomingroup}}% + \CF@expadd@tocs\CF@hook@drawlist{\expandafter{\CF@hook@savedcontent}}% + \CF@expadd@tocs\CF@hook@drawlist{\expandafter{\CF@current@atom}}% ajoute les 4 arguments à la liste des crochets à tracer + \CF@global@let\CF@hook@drawlist\CF@hook@drawlist + }% + {\CF@edefadd@tocs\CF@hook@list{(\CF@hook@currentname)|n\number\CF@cnt@groupnumber-\number\CF@cnt@atomingroup|}% + \CF@expadd@tocs\CF@hook@list{\CF@current@atom|}% + \CF@global@let\CF@hook@list\CF@hook@list + }% + \CF@swap@fi\CF@expand@second\CF@draw@atomgroup@ii\CF@after@hook + }% + {\CF@expadd@tocs\CF@current@atom{\@car#1\@nil}% + \CF@swap@fi\CF@expand@second\CF@draw@atomgroup@ii{\@gobble#1}% + }% + }% + }% + \fi +} + +\def\CF@kook@defaultname{a} +\def\CF@hook@defaultlink{-} +\def\CF@hook@defaulttikz{} + +\def\CF@hook@parseoptarg#1,#2,#3\@nil{% + \CF@test@assign\CF@hook@currentname{#1}\CF@kook@defaultname + \CF@test@assign\CF@hook@currentlink{#2}\CF@hook@defaultlink + \CF@test@assign\CF@hook@currenttikz{#3}\CF@hook@defaulttikz +} + +\def\CF@grab@optarg[#1]#2\@nil#3{% + \CF@hook@parseoptarg#1,,\@nil + \def#3{#2}% +} + +\newcommand*\CF@hook@parselist[1]{% #1 est le nom du noeud à retrouver + \def\CF@hook@parselist@i##1(#1)|##2|##3|##4\@nil{% + \def\CF@hook@savedcoord{##2}\def\CF@hook@savedcontent{##3}% + }% + \expandafter\CF@hook@parselist@i\CF@hook@list\@nil +} + +\def\CF@remove@hook#1{% enlève tous les crochets (et leurs arguments optionnels) de la sc #1 + \expandafter\CF@if@instr\expandafter{#1}{?[}% + {\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#1% + \expandafter\expandafter\expandafter{\expandafter\CF@remove@opthook#1\@nil}% + \CF@remove@hook#1% + }% + {\CF@remove@hook@i#1}% +} + +\def\CF@remove@hook@i#1{% + \expandafter\CF@if@instr\expandafter{#1}?% + {\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#1% + \expandafter\expandafter\expandafter{\expandafter\CF@remove@singlehook#1\@nil}% + \CF@remove@hook@i#1% + }% + \relax +} + +\def\CF@remove@opthook#1?[#2]#3\@nil{#1#3} + +\def\CF@remove@singlehook#1?#2\@nil{#1#2} + +\newcommand*\setlewis[3]{% + \ifx\@empty#1\@empty\def\CF@lewis@offset{1.5pt}\else\def\CF@lewis@offset{#1}\fi + \ifx\@empty#2\@empty\def\CF@lewis@length{8pt}\else\def\CF@lewis@length{#2}\fi + \ifx\@empty#3\@empty\def\CF@lewis@style{}\else\def\CF@lewis@style{#3}\fi} +\setlewis{}{}{} + +\newcommand*\lewis[1]{\begingroup\@makeother;\CF@lewis@i#1\@nil} + +\def\CF@lewis@i#1,#2\@nil% +{% + \setbox\CF@lewis@box\hbox{\CF@display@chem{#2}}% + \def\CF@lewis@remainpos{#1}% + \let\CF@lewis@previouspos\@empty + \loop + \unless\ifx\CF@lewis@remainpos\@empty + \edef\CF@lewis@currentpos{\expandafter\@car\CF@lewis@remainpos\@nil}% + \edef\CF@lewis@remainpos{\expandafter\@gobble\CF@lewis@remainpos}% + \pgfmathparse{\wd\CF@lewis@box/2+\ifcase\CF@lewis@currentpos\space1\or1\or0\or-1\or-1\or-1\or0\or1\fi*(\wd\CF@lewis@box/2+\CF@lewis@offset)}% + \let\CF@lewis@x\pgfmathresult + \pgfmathparse{\ht\CF@lewis@box/2+\ifcase\CF@lewis@currentpos\space0\or1\or1\or1\or0\or-1\or-1\or-1\fi*(\ht\CF@lewis@box/2\ifnum\CF@lewis@currentpos>4 +\dp\CF@lewis@box\fi+\CF@lewis@offset)}% + \let\CF@lewis@y\pgfmathresult + \edef\CF@lewis@xoffset{\ifcase\CF@lewis@currentpos\space0\or0.7071\or1\or0.7071\or0\or-0.7071\or-1\or-0.7071\fi}% + \edef\CF@lewis@yoffset{\ifcase\CF@lewis@currentpos\space-1\or-0.7071\or0\or0.7071\or1\or0.7071\or0\or-0.7071\fi}% + \if.\expandafter\@car\CF@lewis@remainpos\relax\@nil + \edef\CF@lewis@remainpos{\expandafter\@gobble\CF@lewis@remainpos}% + \tikz \draw[overlay,fill,black] ([xshift=-\CF@lewis@yoffset*0.8,yshift=\CF@lewis@xoffset*0.8]\CF@lewis@x pt,\CF@lewis@y pt)circle(0.8pt);% + \else + \if|\expandafter\@car\CF@lewis@remainpos\relax\@nil + \edef\CF@lewis@remainpos{\expandafter\@gobble\CF@lewis@remainpos}% + \expandafter\tikz\expandafter\draw\expandafter[\CF@lewis@style,overlay]% + (\CF@lewis@x-\CF@lewis@length*\CF@lewis@xoffset/2 pt,\CF@lewis@y-\CF@lewis@length*\CF@lewis@yoffset/2 pt)-- + ([xshift=-\CF@lewis@yoffset*2,yshift=\CF@lewis@xoffset*2]\CF@lewis@x-\CF@lewis@xoffset*\CF@lewis@length/2 pt,\CF@lewis@y-\CF@lewis@yoffset*\CF@lewis@length/2 pt)-- + ([xshift=-\CF@lewis@yoffset*2,yshift=\CF@lewis@xoffset*2]\CF@lewis@x+\CF@lewis@length*\CF@lewis@xoffset/2 pt,\CF@lewis@y+\CF@lewis@length*\CF@lewis@yoffset/2 pt)-- + (\CF@lewis@x+\CF@lewis@length*\CF@lewis@xoffset/2 pt,\CF@lewis@y+\CF@lewis@length*\CF@lewis@yoffset/2 pt)--cycle;% + \else + \expandafter\tikz\expandafter\draw\expandafter[\CF@lewis@style,overlay]% + (\CF@lewis@x-\CF@lewis@length*\CF@lewis@xoffset/2 pt,\CF@lewis@y-\CF@lewis@length*\CF@lewis@yoffset/2 pt)--% + (\CF@lewis@x+\CF@lewis@length*\CF@lewis@xoffset/2 pt,\CF@lewis@y+\CF@lewis@length*\CF@lewis@yoffset/2 pt);% + \fi + \fi + \repeat + \box\CF@lewis@box + \endgroup +} + +\newcommand*\chembelow[3][1.5pt]{% + \setbox\CF@box@boxa\hbox{\CF@display@chem{#2}}\setbox\CF@box@boxb\hbox{\CF@display@chem{#3}}% + \vtop{% + \hbox{\CF@display@chem{#2}}% + \hrule width0pt depth0pt height#1\relax + \hbox{% + \hskip\dimexpr(\wd\CF@box@boxa-\wd\CF@box@boxb)/2\relax + \CF@display@chem{#3}% + \hskip\dimexpr(\wd\CF@box@boxa-\wd\CF@box@boxb)/2\relax + }% + \vskip-\dimexpr\ht\CF@box@boxb+\dp\CF@box@boxb+#1\relax + }% +} + +\newcommand*\chemabove[3][1.5pt]{% + \setbox\CF@box@boxa\hbox{\CF@display@chem{#2}}\setbox\CF@box@boxb\hbox{\CF@display@chem{#3}}% + \vtop{% + \hbox{\CF@display@chem{#2}}% + \hrule width0pt depth0pt height-\dimexpr#1+\ht\CF@box@boxa+\ht\CF@box@boxb+\dp\CF@box@boxb\relax + \hbox{% + \hskip\dimexpr(\wd\CF@box@boxa-\wd\CF@box@boxb)/2\relax + \CF@display@chem{#3}% + \hskip\dimexpr(\wd\CF@box@boxa-\wd\CF@box@boxb)/2\relax + }% + }% +} + +%%%%%% les signes et les flèches +\newcommand*\chemsign[2][0.5em]{\hbox{\kern#1\relax#2\kern#1}} + +\newcommand*\setchemrel[3]{% + \ifx\@empty#1\@empty\def\CF@chemrel@vsep{2pt}\else\def\CF@chemrel@vsep{#1}\fi + \ifx\@empty#2\@empty\def\CF@chemrel@hsep{0.7em}\else\def\CF@chemrel@hsep{#2}\fi + \ifx\@empty#3\@empty\def\CF@chemrel@length{4em}\else\def\CF@chemrel@length{#3}\fi +} + +\setchemrel{}{}{} + +\newcommand*\chemrel[1][]{\def\CF@stuff@above{#1}\CF@chemchemrel@i} +\newcommand*\CF@chemchemrel@i[1][]{\def\CF@stuff@below{#1}\CF@chemchemrel@ii\CF@stuff@above\CF@stuff@below} +\newcommand*\CF@chemchemrel@ii[3]{% + \def\CF@equi@chars{<>}\def\CF@chemrel@chars{#3}% + \def\CF@chemrel@stuff + {\leavevmode\kern\CF@chemrel@hsep + \begin{tikzpicture}[every node/.style={anchor=base,inner sep=0pt,outer sep=0pt,minimum size=0pt},baseline]% + \CF@if@instr{#3}{<>}% + {\node[yshift=-2pt] at(0,0)(chemrel@start){\vphantom I};\node[yshift=-2pt] at(\CF@chemrel@length,0)(chemrel@end){\vphantom I};% + \expandafter\draw\expandafter[\CF@remove@equichars#3,\@nil->](chemrel@start)--(chemrel@end);% + \node[yshift=2pt] at(0,0)(chemrel@start){\vphantom I};\node[yshift=2pt] at(\CF@chemrel@length,0)(chemrel@end){\vphantom I};% + \expandafter\draw\expandafter[\CF@remove@equichars#3,\@nil<-](chemrel@start)--(chemrel@end); + }% + {\node at(0,0)(chemrel@start){\vphantom I};\node at(\CF@chemrel@length,0)(chemrel@end){\vphantom I};% + \draw[#3](chemrel@start)--(chemrel@end);% + }% + \end{tikzpicture}% + \kern\CF@chemrel@hsep + }% + \ifx#1\@empty + \ifx#2\@empty\CF@chemrel@stuff + \else\chembelow[\CF@chemrel@vsep]\CF@chemrel@stuff{\hbox{#2}}% + \fi + \else + \ifx#2\@empty\chemabove[\CF@chemrel@vsep]\CF@chemrel@stuff{\hbox{#1}}% + \else\chemabove[\CF@chemrel@vsep]{\chembelow[\CF@chemrel@vsep]\CF@chemrel@stuff{\hbox{#2}}}{\hbox{#1}}% + \fi + \fi +} + +\def\CF@remove@equichars#1<>#2\@nil{#1#2} +\endinput + +##################################################################### +# Historique # +##################################################################### + +v0.1 2010/06/23 Première version publique sur le CTAN +--------------------------------------------------------------------- \ No newline at end of file diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 4ea105df2b8..8bf1e36eedc 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -69,7 +69,7 @@ my @TLP_working = qw( cd cd-cover cdpbundl cell cellspace censor changebar changelayout changepage changes chappg chapterfolder - chbibref chem-journal chemarrow chembst chemcompounds chemcono + chbibref chem-journal chemarrow chembst chemcompounds chemcono chemfig chemstyle cherokee chess-problem-diagrams chessboard chessfss chicago chicago-annote chletter chngcntr chronology circ circle circuitikz diff --git a/Master/tlpkg/tlpsrc/chemfig.tlpsrc b/Master/tlpkg/tlpsrc/chemfig.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc index e8addd99ffe..703670c97bd 100644 --- a/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-pictures.tlpsrc @@ -4,6 +4,7 @@ depend asyfig depend autoarea depend bardiag depend cachepic +depend chemfig depend combinedgraphics depend circuitikz depend curve -- cgit v1.2.3