Saltar al contenido

Dibuja un círculo de escarcha en látex

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 (en cm) 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:

cómo funciona el comando

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

ejemplos de círculo de escarcha

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.

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Sección de Reseñas y Valoraciones

Agradecemos que desees añadir valor a nuestra información dando tu veteranía en las ilustraciones.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *