化学では、フロストサークルは環状化合物のパイ分子軌道の相対エネルギーレベルを推定する簡単な方法です。次に、電子配置に基づいて、その芳香族性を判断します。 LaTeXでこれらを作成する方法を探しています。できれば、chemfig
やtikzorbital
などのパッケージの機能を使用しますが、解決します。 tikz
のみのソリューションの場合。
フロストサークルは、環状化合物のポリゴン(ベンゼンの正六角形など)を円の中に書き込むことで作成されます。ポリゴンの1つの頂点が下向きです。ポリゴンの頂点が円に接する各位置で、これは最大2つの電子を含むことができる分子軌道です(フィッシュフック矢印で表されます)。水平線の下の軌道は、円は結合軌道です。上記は反結合軌道です。線上にある軌道はすべて非結合軌道です。電子はいくつかの規則によって軌道に配置されます。
- オーフバウの原理:軌道は満たされますエネルギーが増加する順に。
- パウリ排除原理:各軌道は2つの電子とirスピン(矢印の方向)は反対でなければなりません。
- フントの法則:2つの軌道が同じエネルギーを持っている場合、どちらかが2番目の電子を取得する前に1つの電子がそれぞれに侵入します。
メソッドとそのアプリケーションの詳細な説明は次のとおりです。
私の理想的な解決策は、リングサイズと入力としての電子の数と、次の例のようなフロスト円を作成します。
- 円を描く
- リングサイズに等しい辺の数で通常のポリゴンを書き込む(上〜10)
- 分子軌道のポリゴンの頂点に水平線セグメントを描画する
- 垂直エネルギー軸を描画する
- 結合のために破線を描画する/反結合性分割
- 上記の規則による電子数の入力
いくつかの例を示します:ベンゼン(リングサイズ= 6、電子= 6)
シクロペンタジエニルカチオン(リングサイズ= 5、電子= 4)
シクロオクタテトラエン(リングサイズ= 8、電子= 8)
コメント
- すみませんこのコメントは大いにあります。しかし、これらの画像を見たことがありますか?
- @ Sebastiano-化学描画ソフトウェアでこれらの画像を作成しましたが、それぞれに約10分かかりました。化学構造と非構造要素が混在しているため、ベクターグラフィックとしてエクスポートすることはできません。それができれば、その方法でラテックスドキュメントにインポートするだけです。私はこれらを何十枚も描きたいと思うかもしれないドキュメントに取り組んでいます。
- svg形式がなくても画像は鮮明で鮮明なので、png画像を十分な大きさで保存できるので、 PDFに含めるとズームアウトすると、さらにスムーズになります。
- @ AboAmmar-わかりましたが、非常に繰り返しの多い作業では、作成にかかる時間は長くなります。数十個作成する予定なので、自動化するマクロが欲しいのですが。
- @BenNorrisMathchaエディターを使って画像を描くことができます。 mathcha.io/editor
回答
これが完全に自動化されたソリューションです。 3つの例の呼び出しは次のとおりです。
\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}
もう1つの議論は電子です。私が見つける最も簡単な方法は、上から始めて反時計回りに設定することです。この図のように:
値0
、1
、および2
を取ります:順番に、電子なし、 1つの電子、2つの電子。リストとして指定できるため、{0,0,2,2,2,0}
を指定すると、benzene
の霜の輪が表示されます。直感に反するように聞こえるかもしれませんが、試してみると実際には簡単です。
リスト内の要素の数がリングサイズより少ない場合、エラーが発生し、コードは次のようになります。コンパイルしないでください。電子が必要ない場合は、0
と入力してこれを解決してください。
注意事項
arrow “は反対側で反転していますが、これがグラフにとって重要かどうかはわかりません。別の方法で調べることができます。重要な場合は日。修正済み
また、同じパッケージを追加しました 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 “。
\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}