화학에서 Frost circle은 순환 화합물에서 파이 분자 궤도의 상대적 에너지 수준을 추정하는 빠른 방법입니다. 그런 다음 전자 배치에 따라 방향성을 판단합니다. chemfigtikzorbital와 같은 패키지의 기능을 사용하여 LaTeX에서이를 생성하는 방법을 찾고 있습니다. tikz 전용 솔루션입니다.

Frost 원은 원 안에 순환 화합물 (예 : 벤젠의 정육각형)에 대한 다각형을 다각형의 한 정점은 아래쪽을 향합니다. 다각형의 정점이 원과 닿는 각 위치는 최대 2 개의 전자를 가질 수있는 분자 궤도입니다 (낚시 화살표로 표시됨). 원은 결합 궤도입니다. 위의 궤도는 반 결합 궤도입니다. 선 위에 놓인 모든 궤도는 비 결합 궤도입니다. 전자는 몇 가지 규칙에 따라 궤도에 배치됩니다.

  • aufbau 원리 : 궤도가 채워집니다. 에너지를 증가시키는 순서입니다.
  • 파울리 배제 원리 : 각 궤도는 2 개의 전자 만 보유 할 수 있습니다. ir 스핀 (화살표 방향)은 반대 여야합니다.
  • 헌드의 법칙 : 두 개의 궤도가 같은 에너지를 가지고 있다면, 하나의 전자가 두 번째 전자를 얻기 전에 각각에 한 전자가 들어갑니다.

방법과 그 적용에 대한 더 긴 설명이 있습니다.

나의 이상적인 솔루션은 링 크기와 입력으로 전자의 수를 입력하고 다음 예와 같이 Frost 원을 만듭니다.

  • 원 그리기
  • 고리 크기와 동일한 변의 수로 정다각형에 새기는 to 10)
  • 분자 궤도를 위해 다각형의 꼭지점에 수평선 선분 그리기
  • 수직 에너지 축 그리기
  • 결합을위한 점선 그리기 / antibonding division
  • 위의 규칙에 따라 전자 수 채우기

다음은 몇 가지 예입니다. 벤젠 (고리 크기 = 6, 전자 = 6)

벤젠 용 서리 고리

시클로 펜타 디에 닐 양이온 (고리 크기 = 5, 전자 = 4)

5 개의 원자와 4 개의 전자를 가진 서리 원

시클로 옥타 테트라 엔 (고리 크기 = 8, 전자 = 8)

여기에 이미지 설명 입력

댓글

  • 실례합니다. 이 의견에 대해 많이. 하지만이 이미지를 본 적이 있습니까?
  • @Sebastiano-이 이미지를 화학 그리기 소프트웨어로 만들었는데 각각 10 분 정도 걸렸습니다. 화학 구조와 비 구조 요소가 혼합되어 있기 때문에 벡터 그래픽으로 내보낼 수 없습니다. 그렇게 할 수 있다면 그런 식으로 라텍스 문서로 가져 오기만하면됩니다. 수십 개를 그릴 수있는 문서를 작업 중입니다.
  • 이미지는 svg 형식이 없어도 선명하고 선명합니다. png 이미지를 충분히 큰 크기로 저장할 수 있습니다. PDF에 포함 할 때 축소하면 훨씬 더 부드러워집니다.
  • @AboAmmar-이해합니다.하지만 매우 반복적 인 작업에는 시간이 많이 소요됩니다. 수십 개를 만들 계획이므로이를 자동화하는 매크로를 갖고 싶습니다.
  • @BenNorris Mathcha 편집기를 사용하여 이미지를 그릴 수 있습니다. mathcha.io/editor

답변

여기 완전 자동화 된 솔루션이 있습니다. 세 가지 예에 대한 호출은 다음과 같습니다.

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

반경 크기에 대한 선택적 인수가 있습니다. 기본값은 1cm입니다. 따라서 frost[2cm]{6}{6}의 반경은 2cm입니다.

이미지 설명을 입력하세요. 여기

참고 : 이것은 (현재) 전자가 짝수 일 때만 작동합니다.

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

댓글

  • 답변도 아주 좋습니다.
  • 훌륭합니다! 이것은 멋지게 작동합니다.

답변

솔직히 약간의 노력이 필요했지만 당신의 모습은 흥미롭고 새로운 것을 배울 수 있도록 1 그래서 “모두 좋습니다.

기본적으로 저는 \newcommand 이름을 만들었습니다. \Frostcircle에는 2 개의 인수, 옵션 및 전자가 있습니다.

현재 [options]는 다음과 같습니다.

  • radius = 원의 반경. 현재 주변 그래픽을 너무 크게 만들면 조정되지 않습니다. 작업 할 수 있습니다. 현재로서는 숫자 (cm) 만 필요하며 길이를 사용하면 중단됩니다. 그 이유는 아직 모르겠습니다. 제안을 환영합니다.
  • ring size = 다각형의 변 수를 나타냅니다. 5에서 10까지의면 수가 테스트되었습니다. 예상 할 수 있듯이 인수로 숫자를 사용합니다.
  • frost label = 이것은 상단의 레이블이고 기본값은 비어 있습니다. 텍스트를 중괄호로 묶어야합니다 (예 : frost label={My label here}

다른 인수는 전자입니다. 제가 찾을 수있는 가장 쉬운 방법은 전자를 맨 위에서부터 시계 반대 방향으로 설정하는 것입니다. 이 그림에서와 같이 :

명령 작동 방식

0, 12 : 순서대로 전자 없음, 하나의 전자, 두 개의 전자. 목록으로 제공 할 수 있으므로 {0,0,2,2,2,0}를 제공하면 benzene 서리 서클이 제공됩니다. 직관에 반하는 것처럼 들릴 수 있지만 실제로 시도해 보면 간단합니다.

제공 한 목록의 요소 수가 링 크기보다 적 으면 오류가 발생하고 코드가 전자가 필요하지 않으면 0를 입력하여이 문제를 해결하세요.

참고

” 화살표 ” 전자에 대한 반대쪽이 반전되어 이것이 그래프에 중요한지 확실하지 않습니다. 다른 쪽을 살펴볼 수 있습니다. 중요한 경우. 고정

또한 다음과 같은 패키지를 추가했습니다. Sebastiano의 답변 에서 수학 글꼴을 가져 오지만 명령이 작동하는 데는 필요하지 않습니다.

출력

프로스트 서클 예

코드

\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

  • 제 이름을 인용 해주셔서 감사합니다. :-); 내 겸손한 의견으로는 중요하지 않았습니다. 당신의 다른 코드는 완벽합니다 !!!! +1
  • 대단합니다! 일반적으로 바닥 상태에서 짝을 이루지 않은 전자 (화살표)는 동일한 회전 (동일한 방향)을 가지므로 SandyG ‘의 솔루션이 제 요구에 조금 더 적합합니다.
  • @BenNorris 흥미 롭습니다. ‘ 나중에 살펴 보겠습니다. ‘ 달성하기가 어렵지 않아야합니다.
  • @BenNorris 알려 드리고자했는데 방향을 정했습니다. 다소 쉬웠고, 왜 더 빨리 생각하지 않았는지 ‘ 확실하지 않았습니다.

답변

첫 번째 예는 Mathcha 입니다. 내 겸손한 의견으로는 매우 비슷해 보이지만 라틴어 격언이 있습니다. ” de gustibus non disputandum est ”

p>

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

여기에 이미지 설명 입력

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다