În chimie, un cerc Frost este o metodă rapidă pentru a estima nivelurile relative de energie ale orbitalilor moleculari pi într-un compus ciclic și apoi pe baza plasării electronilor, evaluați aromaticitatea acestuia. Caut o modalitate de a le crea în LaTeX, de preferință folosind funcționalitatea pachetelor precum chemfig și tikzorbital, dar mă voi rezolva pentru o soluție tikz.

Un cerc Frost este creat prin inscrierea poligonului pentru compusul ciclic (de exemplu un hexagon regulat pentru benzen) în interiorul unui cerc cu un vârf al poligonului orientat în jos. Fiecare locație în care un vârf al poligonului atinge cercul, acesta este un orbital molecular care poate avea până la doi electroni în el (reprezentat de săgeți cu cârlig de pește). Orbitalii sub linia orizontală care împarte în două cercul este orbitali care leagă. Cei de mai sus sunt orbitali anti-legători. Orice orbitali de pe linie sunt orbitali fără legătură. Electronii sunt așezați în orbitali prin niște reguli.

  • Principiul aufbau: Orbitalii sunt umpluți în ordinea creșterii energiei.
  • Principiul de excludere Pauli: Fiecare orbital poate conține doar doi electroni și Rotirile (direcțiile săgeții) trebuie să fie opuse.
  • Regula lui Hund: Dacă doi orbitali au aceeași energie, un electron o face în fiecare înainte ca oricare dintre ei să primească al doilea electron.

Iată o descriere mai lungă a metodei și a aplicației sale.

Soluția mea ideală este o nouă comandă care ia dimensiunea inelului și numărul de electroni ca intrare și construiește cercuri de îngheț precum următoarele exemple prin:

  • Desenarea cercului
  • Înscrierea poligonului regulat cu numărul de laturi egal cu dimensiunea inelului (în sus la 10)
  • Tragerea segmentelor de linie orizontală la vârfurile poligonului pentru orbitalele moleculare
  • Tragerea axei verticale a energiei
  • Tragerea liniei punctate pentru legătură / diviziunea anti-legare
  • Popularea numărului de electroni conform regulilor de mai sus

Iată câteva exemple: benzen (dimensiunea inelului = 6, electroni = 6)

cerc de îngheț pentru benzen

cation ciclopentadienil (dimensiunea inelului = 5, electroni = 4)

cerc de îngheț cu 5 atomi și 4 electroni

ciclooctatetraenă (dimensiunea inelului = 8, electroni = 8)

introduceți descrierea imaginii aici

Comentarii

  • Scuzați-mă foarte mult mult pentru acest comentariu. Dar ați văzut aceste imagini?
  • @Sebastiano – Am realizat aceste imagini în software de desen chimic, dar fiecare a durat aproximativ 10 minute. Deoarece conțin un amestec de structură chimică și elemente nestructurale, nu le pot exporta ca grafică vectorială. Dacă aș putea face asta, aș importa-le în documentul meu din latex în acest fel. Lucrez la un document în care poate vreau să desenez zeci dintre acestea.
  • Imaginile sunt clare și clare chiar și fără format svg, puteți stoca doar imagini PNG la o scară suficient de mare, astfel încât atunci când sunt micșorate atunci când sunt incluse în fișierul PDF, devin și mai fine.
  • @AboAmmar – Înțeleg asta, dar angajamentul de timp pentru realizarea unuia este mare pentru lucrări foarte repetitive. Aș dori să am un macro care îl automatizează, deoarece intenționez să realizez zeci din acestea.
  • @BenNorris Ați putea să vă desenați imaginile folosind editorul Mathcha. mathcha.io/editor

Răspuns

Iată o soluție complet automatizată. Apelurile pentru cele trei exemple ale tale sunt

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

Există un argument opțional pentru dimensiunea razei. Valoarea implicită este de 1cm. Deci, frost[2cm]{6}{6} ar avea o rază de 2cm.

introduceți descrierea imaginii aici

Notă: Acest lucru funcționează (momentan) numai dacă există un număr par de electroni.

\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} 

Comentarii

  • Foarte bine și răspunsul dvs.
  • Excelent! Acest lucru funcționează frumos.

Răspuns

Sincer, a fost nevoie de ceva efort, dar figura ta a fost fascinantă și mi-a permis să învăț lucruri noi 1 , așa că este „bine”.

Practic am creat un nume \newcommand \Frostcircle, care are 2 argumente, opțiuni și electroni.

În prezent, [options] sunt:

  • radius = raza cercului, vă rugăm să rețineți că momentan grafica din jur nu se ajustează dacă o faceți prea mare. S-ar putea să lucrez la ea în viitor. Este nevoie doar de un număr (în cm) în acest moment, folosind lungimi o rupe, nu sunt sigur de ce încă. Sugestiile sunt binevenite.
  • ring size = aceasta se referă la numărul de laturi ale poligonului. Numărul de laturi de la 5 la 10 a fost testat. După cum v-ați putea aștepta, este nevoie de un număr ca argument
  • frost label = aceasta este eticheta din partea de sus, implicit este goală. Asigurați-vă că înconjurați textul cu aparate dentare, de ex. frost label={My label here}

Celălalt argument este electronii, cel mai simplu mod pe care l-aș putea găsi este să-i setez în sens invers acelor de ceasornic, începând de sus, ca în această figură:

cum funcționează comanda

Este nevoie de valori 0, 1 și 2: în ordine, fără electron, un electron, doi electroni. Puteți să o furnizați ca o listă, astfel încât {0,0,2,2,2,0} să dea benzene cercului de îngheț. S-ar putea să sune contraintuitiv, dar este de fapt simplu după ce încercați.

Dacă numărul de elemente din lista pe care o furnizați este mai mic decât dimensiunea inelului, veți primi o eroare și codul va fi nu compilați. Dacă nu doriți niciun electron, tastați doar 0 pentru a rezolva acest lucru.

Note

Direcția ” săgeată ” pentru electron este inversat pe cealaltă parte, nu sunt sigur dacă acest lucru este important pentru graficele dvs. zi dacă este important. FIXAT

De asemenea, am adăugat aceleași pachete ca în răspunsul lui Sebastiano pentru a obține fontul matematic, dar nu sunt necesare pentru ca comanda să funcționeze.

Ieșire

exemple de cerc de îngheț

Cod

\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: pgfkeys.

Com ments

  • Vă mulțumesc foarte mult pentru citarea numelui meu :-); pentru umila mea părere nu era importantă. Diferitele tale coduri sunt perfecte !!!! +1
  • Este minunat! În general, în starea de bază, electronii (săgeți) nepereche ar avea aceeași rotire (aceeași direcție), astfel încât soluția SandyG ‘ se potrivește puțin mai bine cu nevoile mele.
  • @BenNorris interesant. ‘ Voi arunca o privire mai târziu. ‘ nu ar trebui să fie greu de realizat.
  • @BenNorris Am vrut doar să vă anunț, am stabilit direcția. A fost destul de ușor, nu sunt sigur de ce nu m-am gândit ‘ mai repede la asta.

Răspunde

Am făcut cu Mathcha primul exemplu. Pentru umila mea părere pare foarte asemănător … dar există o latină maximă: ” de gustibus non disputandum 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} 

introduceți descrierea imaginii aici

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *