In de chemie is een Frost-cirkel een snelle methode om de relatieve energieniveaus van de pi-moleculaire orbitalen in een cyclische verbinding te schatten en beoordeel vervolgens op basis van elektronenplaatsing de aromaticiteit ervan. Ik “zoek naar een manier om deze in LaTeX te maken, bij voorkeur met behulp van de functionaliteit van pakketten zoals chemfig en tikzorbital, maar ik zal het regelen voor een tikz enige oplossing.

Een Frost-cirkel wordt gemaakt door de polygoon voor de cyclische verbinding in te schrijven (bijvoorbeeld een regelmatige zeshoek voor benzeen) in een cirkel met één hoekpunt van de veelhoek naar beneden gericht. Elke locatie waar een hoekpunt van de veelhoek de cirkel raakt, dit is een moleculaire orbitaal die maximaal twee elektronen kan bevatten (weergegeven door pijlen met vishaken). De orbitalen onder de horizontale lijn die de cirkel doorsnijdt cirkel zijn bindende orbitalen. De bovenstaande zijn antibindende orbitalen. Alle orbitalen die op de lijn liggen, zijn niet-bindende orbitalen. Elektronen worden volgens bepaalde regels in de orbitalen geplaatst.

  • Het aufbau-principe: orbitalen worden gevuld in volgorde van toenemende energie.
  • Het Pauli-uitsluitingsprincipe: elke orbitaal kan slechts twee elektronen bevatten en de ir spins (pijlrichtingen) moeten tegengesteld zijn.
  • Hund-regel: als twee orbitalen dezelfde energie hebben, doet één elektron in elk voordat een van beide zijn tweede elektron krijgt.

Hier is een langere beschrijving van de methode en de toepassing ervan.

Mijn ideale oplossing is een nieuw commando dat de ringmaat en aantal elektronen als input en bouwt Frost-cirkels zoals in de volgende voorbeelden door:

  • De cirkel te tekenen
  • De regelmatige veelhoek in te schrijven met het aantal zijden dat gelijk is aan de ringmaat (tot tot 10)
  • Horizontale lijnsegmenten tekenen op de hoekpunten van de polygoon voor de moleculaire orbitalen
  • De verticale energieas tekenen
  • De onderbroken lijn tekenen voor de binding / antibindende deling
  • Het aantal elektronen vullen volgens de bovenstaande regels

Hier zijn enkele voorbeelden: benzeen (ringmaat = 6, elektronen = 6)

frost circle voor benzeen

cyclopentadienylkation (ringmaat = 5, elektronen = 4)

vorstcirkel met 5 atomen en 4 elektronen

cyclooctatetraeen (ringmaat = 8, elektronen = 8)

voer de beschrijving van de afbeelding hier in

Opmerkingen

  • Excuseer me zeer veel voor deze opmerking. Maar heb je deze afbeeldingen gezien?
  • @Sebastiano – Ik heb deze afbeeldingen gemaakt in scheikundetekensoftware, maar ze duurden ongeveer 10 minuten. Omdat ze een mix van chemische structuur en niet-structurele elementen bevatten, kan ik ze niet exporteren als vectorafbeeldingen. Als ik dat zou kunnen doen, zou ik ze op die manier gewoon in mijn latexdocument importeren. Ik werk aan een document waarin ik er misschien tientallen wil tekenen.
  • De afbeeldingen zijn scherp en duidelijk, zelfs zonder svg-indeling, je kunt png-afbeeldingen gewoon opslaan op een schaal die groot genoeg is, zodat wanneer ze zijn uitgezoomd wanneer ze in de pdf worden opgenomen, worden ze nog soepeler.
  • @AboAmmar – Dat begrijp ik, maar de tijd die nodig is om er een te maken is groot voor zeer repetitief werk. Ik zou graag een macro hebben die het automatiseert, aangezien ik van plan ben er tientallen te maken.
  • @BenNorris Je zou je afbeeldingen kunnen tekenen met de Mathcha-editor. mathcha.io/editor

Antwoord

Hier is een volledig geautomatiseerde oplossing. De oproepen voor uw drie voorbeelden zijn

\frost{6}{6} \frost{5}{4} \frost{8}{8} 

Er is een optioneel argument voor straalgrootte. Standaard is 1 cm. Dus frost[2cm]{6}{6} zou een straal van 2 cm hebben.

voer een afbeeldingsbeschrijving in hier

Opmerking: dit werkt alleen (momenteel) als er een even aantal elektronen is.

\documentclass{article} \usepackage{tikz} \usepackage{ifthen} \usetikzlibrary{decorations.markings} \tikzset% Define decorations {updown/.style={postaction=decorate, decoration={markings, mark=at position .5 with {\draw[line join=round] (-2pt,-\arrlen)--++(0pt,2*\arrlen)--(-4pt,1pt); \draw[line join=round] (2pt,\arrlen)--++(0pt,-2*\arrlen)--(4pt,-1pt); }}},% 2 arrows uparr/.style={postaction=decorate, decoration={markings, mark=at position .5 with {\draw[line join=round] (0pt,-\arrlen)--++(0pt,2*\arrlen)--(-2pt,1pt); }}},% 1 arrow, right side dnarr/.style={postaction=decorate, decoration={markings, mark=at position .5 with {\draw[line join=round] (0pt,\arrlen)--++(0pt,-2*\arrlen)--(2pt,-1pt); }}}% 1 arrow left side (points down since lines will be drawn right to left) } \newcommand{\orblen}{.8}% length of horizontal segments as a percentage of main radius \newcommand{\arrlen}{.25cm}% half length of each arrow \newcommand{\frost}[3][1cm]% optional argument is circle radius, #2=edges, #3=electrons {\begin{tikzpicture}[line width=1pt] \draw(0,0)circle[radius=#1];% main circle \ifthenelse{#3 = 0}{\draw(-.5*#1*\orblen,-#1)--(.5*#1*\orblen,-#1);}% draw bottom line segment... {\draw[updown](-.5*#1*\orblen,-#1)--(.5*#1*\orblen,-#1);}% ...with arrows if >0 electrons \foreach \k [evaluate=\k as \r using .5*#2+1,% point right if k<r, point left if k>r, top if k=r evaluate=\k as \t using (\k-1)*360/#2-90,% angles of polygon vertices. k=1 is bottom. evaluate=\k as \n using -4*\k+6+#3,% who gets 2 electrons (right)? evaluate=\k as \m using -4*(#2+2-\k)+6+#3,% who gets 2 electrons (left)? evaluate=\k as \j using 2*#2] in {1,...,#2}% electrons for top if #3=2*#2 {\draw(\t:#1)--(\t+360/#2:#1); \ifthenelse{\k>1}% already did bottom line. {\ifthenelse{\lengthtest{\k pt < \r pt}}% right side {\ifthenelse{3 < \n}{\draw[updown](\t:#1)--+(#1*\orblen,0);}% 2 arrows {\ifthenelse{1 < \n}{\draw[uparr](\t:#1)--+(#1*\orblen,0);}% 1 arrow {\draw(\t:#1)--+(#1*\orblen,0);}}}% no arrows {\ifthenelse{\lengthtest{\k pt > \r pt}}% left side {\ifthenelse{3 < \m}{\draw[updown](\t:#1)--+(-#1*\orblen,0);}% 2arrows {\ifthenelse{1 < \m}{\draw[dnarr](\t:#1)--+(-#1*\orblen,0);}% 1 arrow {\draw(\t:#1)--+(-#1*\orblen,0);}}}%no arrows {\ifthenelse{#3 = \j}{\draw[updown](-.5*#1*\orblen,#1)--(.5*#1*\orblen,#1);}% 2 arrows on top {\draw(-.5*#1*\orblen,#1)--(.5*#1*\orblen,#1);}}} % no arrows on top }{} % do nothing if k=1 (bottom) } \draw[dotted](-2*#1,0)--(3*#1,0)node[below]{bonding\phantom{anti}}node[above]{antibonding}; \draw[-latex](-2.2*#1,-#1)--node[sloped,above,pos=.4]{Energy}(-2.2*#1,1.8*#1); \end{tikzpicture} } \begin{document} \frost{6}{6} \frost{5}{4} \frost{8}{8} \end{document} 

Reacties

  • Zeer goed ook jouw antwoord.
  • Uitstekend! Dit werkt prachtig.

Antwoord

Eerlijk gezegd, het heeft wat moeite gekost, maar je figuur was intrigerend en het stelde me in staat om nieuwe dingen te leren 1 dus het is allemaal goed.

In feite heb ik “een \newcommand, naam gemaakt \Frostcircle, met 2 argumenten, opties en de elektronen.

Momenteel zijn de [options]:

  • radius = de straal van de cirkel, houd er rekening mee dat de omringende afbeeldingen op dit moment niet worden aangepast als je ze te groot maakt. Ik zou eraan kunnen werken in de toekomst. Er is op dit moment slechts een getal nodig (in cm), door lengtes te breken, weet ik nog niet waarom. Suggesties zijn welkom.
  • ring size = dit verwijst naar het aantal zijden van de polygoon. Aantal zijden van 5 tot 10 zijn getest. Zoals je zou verwachten, heeft het een getal als argument.
  • frost label = dit is het label bovenaan, standaard is leeg. Zorg ervoor dat u de tekst tussen accolades plaatst, bijv. frost label={My label here}

Het andere argument zijn de elektronen, de gemakkelijkste manier die ik kon vinden is om ze tegen de klok in in te stellen, beginnend vanaf de bovenkant, zoals in deze afbeelding:

hoe het commando werkt

Er zijn waarden 0, 1 en 2 nodig: in volgorde, geen elektron, één elektron, twee elektronen. Je kunt het als een lijst aanleveren, dus als je {0,0,2,2,2,0} geeft, krijg je je benzene frost circle. Het klinkt misschien contra-intuïtief, maar het is eigenlijk simpel als je het eenmaal probeert.

Als het aantal elementen in de lijst dat je opgeeft kleiner is dan de ringmaat, krijg je een foutmelding en zal de code niet compileren. Als je geen elektron wilt, typ dan 0 om dit op te lossen.

Opmerkingen

De richting van de ” pijl ” voor het elektron is aan de andere kant omgekeerd, ik weet niet zeker of dit belangrijk is voor je grafieken. Ik kan er een andere bekijken dag als het belangrijk is. FIXED

Ook heb ik dezelfde pakketten toegevoegd als in Sebastianos antwoord om het wiskundige lettertype te krijgen, maar ze zijn niet nodig om het commando te laten werken.

Uitvoer

voorbeelden van vorstcirkels

Code

\documentclass[margin=10pt]{article} \usepackage{tikz} \usepackage{newtxtext} \usepackage{amssymb} \usepackage{bm} \usetikzlibrary{arrows.meta,decorations.markings,shapes.geometric} \tikzset{% electron/.style={% postaction={decorate, decoration={% markings, mark=at position .5 with {% \ifnum#1=1\relax% \draw[-{Straight Barb[left,angle=60:2pt 3]}] (0,-6pt) --(0,6pt); \else \ifnum#1=2\relax% \draw[-{Straight Barb[left,angle=60:2pt 3]}] (-1pt,-6pt) -- (-1pt,6pt); \draw[{Straight Barb[left,angle=60:2pt 3]}-] (1pt,-6pt) -- (1pt,6pt); \else \fi\fi }} } }, mlbl/.style={anchor=south, align=center, midway, sloped}, } \pgfkeys{/tikz/.cd,% to set the path radius/.initial=.8, % initial value radius/.get=\circleradius, % to get the value from a macro radius/.store in=\circleradius, % to store the value into a macro ring size/.initial=5, ring size/.get=\numbersides, ring size/.store in=\numbersides, frost label/.initial=, frost label/.get=\frostlabel, frost label/.store in=\frostlabel, } \newcommand\Frostcircle[2][]{% \tikzset{radius=.8,ring size=5,frost label=,#1} \begin{tikzpicture}[line width=1pt] \draw[-{Stealth[scale=1.5]}] (0,0) -- (0,3cm) node[mlbl] {Energy} node[anchor=north west, xshift=2mm] {\frostlabel}; \draw[dotted, shorten >=-1cm] (.5,1) -- (4,1) node[anchor=south west] {antibonding} node[anchor=north west] {bonding}; \draw (2,1) circle (\circleradius); \node[% regular polygon, rotate=360/\numbersides/2, regular polygon sides=\numbersides, minimum size=\circleradius*2 cm, draw, outer sep=0pt ] at (2,1) (FrostCircle) {}; \def\electronarrow{{#2}} \foreach \polycorner [count=\findex starting from 0] in {1,...,\numbersides}{% \pgfmathtruncatemacro\maximumhalf{\numbersides/2+1} \pgfmathsetmacro\Findex{\electronarrow[\findex]} \ifnum\polycorner=1\relax% \draw[electron=\Findex] (FrostCircle.corner \polycorner)++(-.8,0) --++ (1.6,0); \else \ifnum\polycorner=\maximumhalf\relax% \draw[electron=\Findex] (FrostCircle.corner \polycorner)++(-.8,0) --++ (1.6,0); \else \ifnum\polycorner<\maximumhalf\relax% \draw[electron=\Findex] (FrostCircle.corner \polycorner)++ (-.8,0) -- (FrostCircle.corner \polycorner); \else \draw[electron=\Findex] (FrostCircle.corner \polycorner) --++ (.8,0); \fi\fi\fi }% \end{tikzpicture}% } \begin{document} \Frostcircle[% ring size=6, radius=1, frost label={benzene (ring size = 6, electrons = 6)} ]{0,0,2,2,2,0} \vspace{1cm} \Frostcircle[% ring size=5, radius=1, frost label={cyclopentadienyl cation (ring size = 5, electrons = 4)} ]{0,1,2,1,0} \vspace{1cm} \Frostcircle[% ring size=8, radius=1, frost label={cyclooctatetraene (ring size = 8, electrons = 8)} ]{0,0,1,2,2,2,1,0} \end{document} 

1: De pgfkeys.

Com ments

  • Heel erg bedankt voor het citeren van mijn naam :-); naar mijn bescheiden mening was het niet belangrijk. Uw verschillende codes zijn perfect !!!! +1
  • Dit is geweldig! Over het algemeen zouden ongepaarde elektronen (pijlen) in de grondtoestand dezelfde spin (dezelfde richting) hebben, dus de oplossing van SandyG ‘ komt iets beter overeen met mijn behoeften.
  • @BenNorris interessant. Ik ‘ zal daar later naar kijken. Het zou niet ‘ moeilijk te bereiken moeten zijn.
  • @BenNorris Ik wilde het je gewoon laten weten, ik heb de richting bepaald. Het was vrij gemakkelijk, ik wist niet zeker waarom ik ‘ er niet eerder aan dacht.

Antwoord

Ik heb klaar met Mathcha het eerste voorbeeld. Naar mijn bescheiden mening lijkt het erg op elkaar … maar er is een latijnse maxime: ” de gustibus non-dispandum est “.

\documentclass[a4paper,12pt]{article} \usepackage{tikz} \usepackage{newtxtext} \usepackage{amssymb} \usepackage{bm} \begin{document} \tikzset{every picture/.style={line width=0.75pt}} %set default line width to 0.75pt \begin{tikzpicture}[x=0.75pt,y=0.75pt,yscale=-1,xscale=1] %uncomment if require: \path (0,300); %set diagram left start at 0, and has height of 300 %Shape: Regular Polygon [id:dp9024119328579219] \draw [line width=1.5] (203,184) -- (161.86,160.25) -- (161.86,112.75) -- (203,89) -- (244.14,112.75) -- (244.14,160.25) -- cycle ; %Shape: Circle [id:dp3742321630799761] \draw [line width=1.5] (155.5,136.5) .. controls (155.5,110.27) and (176.77,89) .. (203,89) .. controls (229.23,89) and (250.5,110.27) .. (250.5,136.5) .. controls (250.5,162.73) and (229.23,184) .. (203,184) .. controls (176.77,184) and (155.5,162.73) .. (155.5,136.5) -- cycle ; %Straight Lines [id:da6431705906977057] \draw [line width=1.5] (101,185) -- (101,31.71) ; \draw [shift={(101,27.71)}, rotate = 450] [fill={rgb, 255:red, 0; green, 0; blue, 0 } ][line width=0.08] [draw opacity=0] (13.4,-6.43) -- (0,0) -- (13.4,6.44) -- (8.9,0) -- cycle ; %Straight Lines [id:da03628267423150655] \draw [line width=1.5] (176.75,89) -- (229.25,89) ; %Straight Lines [id:da6999074691962319] \draw [line width=1.5] (244.14,112.75) -- (285.5,112.75) ; %Straight Lines [id:da6267867712352968] \draw [line width=1.5] (120.5,112.75) -- (161.86,112.75) ; %Straight Lines [id:da4603867099439829] \draw [line width=1.5] (244.14,160.25) -- (285.5,160.25) ; %Straight Lines [id:da018369347304083128] \draw [line width=1.5] (120.5,160.25) -- (161.86,160.25) ; %Straight Lines [id:da7545009709936943] \draw [line width=1.5] (176.75,184) -- (229.25,184) ; %Straight Lines [id:da42526907269791137] \draw [line width=1.5] [dash pattern={on 1.69pt off 2.76pt}] (120.5,136.5) -- (346.5,136.5) ; % Text Node \draw (126,149.4) node [anchor=north west][inner sep=0.75pt] [font=\large] {$\bm{\upharpoonleft }$}; % Text Node \draw (249,149.4) node [anchor=north west][inner sep=0.75pt] [font=\large] {$\bm{\upharpoonleft }$}; % Text Node \draw (195,173.4) node [anchor=north west][inner sep=0.75pt] [font=\large] {$\bm{\upharpoonleft }$}; % Text Node \draw (130,149.4) node [anchor=north west][inner sep=0.75pt] [font=\large] {$\bm{\downharpoonright }$}; % Text Node \draw (253,149.4) node [anchor=north west][inner sep=0.75pt] [font=\large] {$\bm{\downharpoonright }$}; % Text Node \draw (200,173.4) node [anchor=north west][inner sep=0.75pt] [font=\large] {$\bm{\downharpoonright }$}; % Text Node \draw (74,149) node [anchor=north west][inner sep=0.75pt] [font=\large,rotate=-270] [align=left] {Energy}; % Text Node \draw (288,103) node [anchor=north west][inner sep=0.75pt] [font=\large] [align=left] {Antibonding}; % Text Node \draw (288,150) node [anchor=north west][inner sep=0.75pt] [font=\large] [align=left] {Bonding}; % Text Node \draw (120,36) node [anchor=north west][inner sep=0.75pt] [align=left] {\large benzene (6 atoms, 6 electrons)}; \end{tikzpicture} \end{document} 

voer hier een beschrijving van de afbeelding in

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *