Te doy la bienvenida a nuestra comunidad, en este lugar encontrarás la respuesta de lo que andabas buscando.
Solución:
Honestamente, me costó un poco de esfuerzo, pero tu figura era intrigante y me permitió aprender cosas nuevas.1 entonces, está todo bien.
Básicamente he creado un newcommand
, nombre Frostcircle
, que tiene 2 argumentos, opciones y los electrones.
Actualmente, el [options]
están:
radius
= el radio del círculo, tenga en cuenta que en este momento los gráficos circundantes no se ajustan si lo hace demasiado grande. Podría trabajar en eso en el futuro. Solo se necesita un número (encm
) en este momento, usar longitudes lo rompe, todavía no estoy seguro de por qué. Las sugerencias son bienvenidas.ring size
= esto se refiere al número de lados del polígono. Se ha probado un número de lados de 5 a 10. Como era de esperar, se necesita un número como argumento.frost label
= esta es la etiqueta en la parte superior, la predeterminada está vacía. Asegúrese de rodear el texto con llaves, p. Ej.frost label=My label here
El otro argumento son los electrones, la forma más fácil que pude encontrar es colocarlos en sentido antihorario, comenzando desde la parte superior, como en esta figura:
Se necesitan valores 0
, 1
, y 2
: en orden, ningún electrón, un electrón, dos electrones. Puede proporcionarlo como una lista para dar 0,0,2,2,2,0
daría tu benzene
círculo de escarcha. Puede parecer contradictorio, pero en realidad es simple una vez que lo intentas.
Si la cantidad de elementos en la lista que proporciona es menor que el tamaño del anillo, obtendrá un error y el código no se compilará. Si no quiere ningún electrón, simplemente escriba 0
para solucionar esto.
Notas
La dirección de la “flecha” del electrón está invertida en el otro lado, no estoy seguro de si esto es importante para sus gráficos. Puedo investigarlo otro día si es importante.REPARADO
También agregué los mismos paquetes que en la respuesta de Sebastiano para obtener la fuente matemática, pero no son necesarios para que el comando funcione.
Producción
Código
documentclass[margin=10pt]article
usepackagetikz
usepackagenewtxtext
usepackageamssymb
usepackagebm
usetikzlibraryarrows.meta,decorations.markings,shapes.geometric
tikzset%
electron/.style=%
postaction=decorate,
decoration=%
markings,
mark=at position .5 with
%
ifnum#1=1relax%
draw[-Straight Barb[left,angle=60:2pt 3]] (0,-6pt) --(0,6pt);
else
ifnum#1=2relax%
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
fifi
,
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,
newcommandFrostcircle[2][]%
tikzsetradius=.8,ring size=5,frost label=,#1
begintikzpicture[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) ;
defelectronarrow#2
foreach polycorner [count=findex starting from 0] in 1,...,numbersides%
pgfmathtruncatemacromaximumhalfnumbersides/2+1
pgfmathsetmacroFindexelectronarrow[findex]
ifnumpolycorner=1relax%
draw[electron=Findex] (FrostCircle.corner polycorner)++(-.8,0) --++ (1.6,0);
else
ifnumpolycorner=maximumhalfrelax%
draw[electron=Findex] (FrostCircle.corner polycorner)++(-.8,0) --++ (1.6,0);
else
ifnumpolycorner
1: El pgfkeys
.
Aquí tienes una solución totalmente automatizada. Las llamadas a sus tres ejemplos son
frost66
frost54
frost88
Existe un argumento opcional para el tamaño del radio. El valor predeterminado es 1 cm. Entonces frost[2cm]66
tendría un radio de 2cm.
Nota: Esto solo funciona (por el momento) si hay un número par de electrones.
documentclassarticle
usepackagetikz
usepackageifthen
usetikzlibrarydecorations.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)
newcommandorblen.8% length of horizontal segments as a percentage of main radius
newcommandarrlen.25cm% half length of each arrow
newcommandfrost[3][1cm]% optional argument is circle radius, #2=edges, #3=electrons
begintikzpicture[line width=1pt]
draw(0,0)circle[radius=#1];% main circle
ifthenelse#3 = 0draw(-.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 kr, 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);
ifthenelsek>1% already did bottom line.
ifthenelselengthtestk pt < r pt% right side
ifthenelse3 < ndraw[updown](t:#1)--+(#1*orblen,0);% 2 arrows
ifthenelse1 < ndraw[uparr](t:#1)--+(#1*orblen,0);% 1 arrow
draw(t:#1)--+(#1*orblen,0);% no arrows
ifthenelselengthtestk pt > r pt% left side
ifthenelse3 < mdraw[updown](t:#1)--+(-#1*orblen,0);% 2arrows
ifthenelse1 < mdraw[dnarr](t:#1)--+(-#1*orblen,0);% 1 arrow
draw(t:#1)--+(-#1*orblen,0);%no arrows
ifthenelse#3 = jdraw[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]bondingphantomantinode[above]antibonding;
draw[-latex](-2.2*#1,-#1)--node[sloped,above,pos=.4]Energy(-2.2*#1,1.8*#1);
endtikzpicture
begindocument
frost66
frost54
frost88
enddocument
He hecho con Mathcha el primer ejemplo. Para mi humilde opinión parece muy parecido ... pero hay un maxime latino: "de gustibus non disputandum est".
documentclass[a4paper,12pt]article
usepackagetikz
usepackagenewtxtext
usepackageamssymb
usepackagebm
begindocument
tikzsetevery picture/.style=line width=0.75pt %set default line width to 0.75pt
begintikzpicture[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] $bmupharpoonleft $;
% Text Node
draw (249,149.4) node [anchor=north west][inner sep=0.75pt] [font=large] $bmupharpoonleft $;
% Text Node
draw (195,173.4) node [anchor=north west][inner sep=0.75pt] [font=large] $bmupharpoonleft $;
% Text Node
draw (130,149.4) node [anchor=north west][inner sep=0.75pt] [font=large] $bmdownharpoonright $;
% Text Node
draw (253,149.4) node [anchor=north west][inner sep=0.75pt] [font=large] $bmdownharpoonright $;
% Text Node
draw (200,173.4) node [anchor=north west][inner sep=0.75pt] [font=large] $bmdownharpoonright $;
% 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);
endtikzpicture
enddocument
Sección de Reseñas y Valoraciones
Agradecemos que desees añadir valor a nuestra información dando tu veteranía en las ilustraciones.