화학에서 Frost circle은 순환 화합물에서 파이 분자 궤도의 상대적 에너지 수준을 추정하는 빠른 방법입니다. 그런 다음 전자 배치에 따라 방향성을 판단합니다. chemfig
및 tikzorbital
와 같은 패키지의 기능을 사용하여 LaTeX에서이를 생성하는 방법을 찾고 있습니다. tikz
전용 솔루션입니다.
Frost 원은 원 안에 순환 화합물 (예 : 벤젠의 정육각형)에 대한 다각형을 다각형의 한 정점은 아래쪽을 향합니다. 다각형의 정점이 원과 닿는 각 위치는 최대 2 개의 전자를 가질 수있는 분자 궤도입니다 (낚시 화살표로 표시됨). 원은 결합 궤도입니다. 위의 궤도는 반 결합 궤도입니다. 선 위에 놓인 모든 궤도는 비 결합 궤도입니다. 전자는 몇 가지 규칙에 따라 궤도에 배치됩니다.
- aufbau 원리 : 궤도가 채워집니다. 에너지를 증가시키는 순서입니다.
- 파울리 배제 원리 : 각 궤도는 2 개의 전자 만 보유 할 수 있습니다. ir 스핀 (화살표 방향)은 반대 여야합니다.
- 헌드의 법칙 : 두 개의 궤도가 같은 에너지를 가지고 있다면, 하나의 전자가 두 번째 전자를 얻기 전에 각각에 한 전자가 들어갑니다.
나의 이상적인 솔루션은 링 크기와 입력으로 전자의 수를 입력하고 다음 예와 같이 Frost 원을 만듭니다.
- 원 그리기
- 고리 크기와 동일한 변의 수로 정다각형에 새기는 to 10)
- 분자 궤도를 위해 다각형의 꼭지점에 수평선 선분 그리기
- 수직 에너지 축 그리기
- 결합을위한 점선 그리기 / antibonding division
- 위의 규칙에 따라 전자 수 채우기
다음은 몇 가지 예입니다. 벤젠 (고리 크기 = 6, 전자 = 6)
시클로 펜타 디에 닐 양이온 (고리 크기 = 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
, 1
및 2
: 순서대로 전자 없음, 하나의 전자, 두 개의 전자. 목록으로 제공 할 수 있으므로 {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}