In chimica, un cerchio di Frost è un metodo rapido per stimare i livelli di energia relativi degli orbitali molecolari pi in un composto ciclico e quindi in base al posizionamento degli elettroni giudicare la sua aromaticità. Sto cercando un modo per crearli in LaTeX, preferibilmente utilizzando la funzionalità di pacchetti come chemfig
e tikzorbital
, ma mi accontento per una tikz
unica soluzione.
Un cerchio di Frost viene creato inscrivendo il poligono per il composto ciclico (ad esempio un esagono regolare per il benzene) allinterno di un cerchio con un vertice del poligono orientato verso il basso. Ogni posizione in cui un vertice del poligono tocca il cerchio, questo è un orbitale molecolare che può contenere fino a due elettroni (rappresentato dalle frecce dellamo). Gli orbitali sotto la linea orizzontale che divide in due la cerchio sono orbitali leganti. Quelli sopra sono orbitali antilegame. Tutti gli orbitali che si trovano sulla linea sono orbitali non leganti. Gli elettroni vengono inseriti negli orbitali secondo alcune regole.
- Il principio aufbau: gli orbitali sono riempiti in ordine crescente di energia.
- Il principio di esclusione di Pauli: ogni orbitale può contenere solo due elettroni e il Gli spin ir (direzioni della freccia) devono essere opposti.
- Regola di Hund: se due orbitali hanno la stessa energia, un elettrone entra in ciascuno prima che uno dei due riceva il suo secondo elettrone.
Ecco una descrizione più lunga del metodo e della sua applicazione.
La mia soluzione ideale è un nuovo comando che prende la dimensione dellanello e numero di elettroni come input e costruisce cerchi di Frost come i seguenti esempi:
- Disegnando il cerchio
- Inscrivendo il poligono regolare con numero di lati uguale alla dimensione dellanello (su a 10)
- Tracciare segmenti di linea orizzontale ai vertici del poligono per gli orbitali molecolari
- Tracciare lasse verticale dellenergia
- Tracciare la linea tratteggiata per il legame / divisione antilegame
- Popolamento del numero di elettroni secondo le regole precedenti
Ecco alcuni esempi: benzene (dimensione dellanello = 6, elettroni = 6)
catione ciclopentadienile (dimensione dellanello = 5, elettroni = 4)
cicloottatetraene (dimensione dellanello = 8, elettroni = 8)
Commenti
- Mi scusi molto molto per questo commento. Ma hai visto queste immagini?
- @Sebastiano – Ho realizzato queste immagini con un software di disegno chimico, ma ognuna ha impiegato circa 10 minuti. Poiché contengono una miscela di struttura chimica ed elementi non strutturali, non posso esportarli come grafica vettoriale. Se potessi farlo, li importerei semplicemente nel mio documento in lattice in questo modo. Sto lavorando a un documento in cui potrei voler disegnare dozzine di queste.
- Le immagini sono nitide e chiare anche senza il formato svg, puoi semplicemente memorizzare le immagini png su una scala abbastanza grande in modo che quando sono ingranditi quando inclusi nel PDF, diventano ancora più fluidi.
- @AboAmmar – Lo capisco, ma limpegno di tempo per crearne uno è grande per un lavoro molto ripetitivo. Mi piacerebbe avere una macro che lo automatizzi poiché ho intenzione di crearne dozzine.
- @BenNorris Potresti disegnare le tue immagini usando leditor Mathcha. mathcha.io/editor
Risposta
Ecco una soluzione completamente automatizzata. Le chiamate per i tuoi tre esempi sono
\frost{6}{6} \frost{5}{4} \frost{8}{8}
Cè un argomento opzionale per la dimensione del raggio. Limpostazione predefinita è 1 cm. Quindi frost[2cm]{6}{6}
avrebbe un raggio di 2 cm.
Nota: funziona (al momento) solo se è presente un numero pari di elettroni.
\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}
Commenti
- Molto buona anche la tua risposta.
- Eccellente! Funziona magnificamente.
Risposta
Onestamente, ci è voluto un po di impegno, ma la tua figura era intrigante e mi ha permesso di imparare cose nuove 1 quindi va tutto bene.
Fondamentalmente ho creato un \newcommand
, nome \Frostcircle
, che ha 2 argomenti, opzioni e gli elettroni.
Attualmente, i [options]
sono:
-
radius
= il raggio del cerchio, tieni presente che al momento la grafica circostante non si adatta se la ingrandisci. Potrei lavorarci sopra in futuro. Ci vuole solo un numero (incm
) al momento, luso delle lunghezze lo interrompe, non sono ancora sicuro del perché. I suggerimenti sono ben accetti. -
ring size
= si riferisce al numero di lati del poligono. È stato verificato un numero di lati compreso tra 5 e 10. Come ci si potrebbe aspettare, prende un numero come argomento -
frost label
= questa è letichetta in alto, il valore predefinito è vuoto. Assicurati di circondare il testo con parentesi graffe, ad es.frost label={My label here}
Laltro argomento sono gli elettroni, il modo più semplice che ho trovato è impostarli in senso antiorario, partendo dallalto, come in questa figura:
Accetta i valori 0
, 1
e 2
: in ordine, nessun elettrone, un elettrone, due elettroni. Puoi fornirlo come un elenco, quindi dare {0,0,2,2,2,0}
darebbe il tuo benzene
cerchio di ghiaccio. Potrebbe sembrare controintuitivo, ma in realtà è semplice una volta che lo provi.
Se il numero di elementi nellelenco che fornisci è inferiore alla dimensione dellanello, riceverai un errore e il codice non compilare. Se non vuoi lelettrone, digita 0
per risolvere il problema.
Note
La direzione del ” arrow ” per lelettrone è invertito sullaltro lato, non sono sicuro che sia importante per i tuoi grafici. Posso esaminarlo un altro giorno se è importante. FIXED
Inoltre ho aggiunto gli stessi pacchetti di nella Sebastiano “risposta per ottenere i caratteri matematici, ma non sono necessari per il funzionamento del comando.
Output
Codice
\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
- Grazie mille per la citazione del mio nome :-); per il mio modesto parere non era importante. I tuoi diversi codici sono perfetti !!!! +1
- È fantastico! Generalmente nello stato fondamentale, gli elettroni spaiati (frecce) avrebbero lo stesso spin (stessa direzione), quindi la soluzione di SandyG ‘ soddisfa un po meglio le mie esigenze.
- @BenNorris interessante. ‘ lo esaminerò più tardi. Non dovrebbe ‘ essere difficile da raggiungere.
- @BenNorris Volevo solo farti sapere, ho fissato la direzione. È stato piuttosto facile, non so perché ‘ non ci ho pensato prima.
Risposta
Ho fatto con Mathcha il primo esempio. A mio modesto parere sembra molto simile … ma cè un latino maxime: ” 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}