LaTeX 中的分子轨道图?

LaTeX 中的分子轨道图?

这个问题导致了一个新的方案的出现:
modiagram

我想知道是否有人见过在 LaTeX 中绘制(定性)分子轨道分裂图的软件包?或者是否存在可以轻松重新用于此任务的软件包?

否则,我想我会在 TikZ 中尝试一下。

例子

(从维基百科上的图片由“orci”提供- 由于各种元素略有错位,我怀疑它是手工绘制的)

维基百科上“orci”图片中 MO 拆分图示例

在 TikZ 中尝试一下

我决定尝试在 TikZ 中执行此操作,并为氧气准备了一个 MO 图(先前尝试过更简单的二氢)——这就是我想要的那种方案。

氧气 S=1 状态的详细 MO 图

这种方法至少存在三个问题:

  • 它不是很通用,我不知道有什么策略可以使它任意扩展(例如,像示例图中那样堆叠能级等)。部分解决
  • H、H_{2} 标签未与每个 H 的基线对齐,因此 H_{2} 略高于其他两个。已解决,感谢@Matthew Leingang
  • 虽然坐标与文本成比例,但都是硬编码的,我想知道如何使该图在总宽度、总高度和分层分离方面可扩展。解决了使用(可能太多)变量和坐标计算的问题

请帮助我改进这种可能非常幼稚的方法。

规格

带注释的 MO 图

MO 图可以以多种不同的方式绘制。在最简单的情况下,例如这里的 O2 或 H2,左列将一个原子的轨道表示为水平线,按其相对能量垂直排列。右列对另一个原子执行相同操作。在这种情况下,示例图将轨道表示为方框以便清晰显示,因为多个轨道可以具有相同的能量,这就是 3x 2p 轨道和 pi_x、pi_y 轨道的情况。在这种情况下,它们并排显示。轨道可能有零个、一个或两个(反向平行)电子。通常只看到用水平线而不是方框表示的轨道。线连接轨道以指示原子轨道对分子轨道的贡献。

中间一列显示了由原子轨道组合产生的分子轨道,可以是加法(在这种情况下相对能量下降,产生键合轨道)或减法(在这种情况下相对能量相对于原子轨道增加,即反键合轨道)。由于此图仅是定性的,因此可以将分裂视为对称的。

来源

\documentclass{article}
\usepackage{tikz}
\usepackage{textcomp}
\usepackage[version=3]{mhchem}

\newcommand{\moup}{\textuparrow}
\newcommand{\modown}{\textdownarrow}
\newcommand{\moupdown}{\textuparrow\textdownarrow}

\begin{document}

\begin{tikzpicture}[scale=1]

\def\sbaseline{0em};
\def\pbaseline{14em};
\def\ssplit{6em};
\def\psplit{12em};
\def\pextend{5em};
\def\psso{4em};
\def\pxyoffset{1em};
\def\mwidth{3em};
\def\hsep{2em};

\tikzstyle{split} = [densely dashed,draw=gray]
\tikzstyle{orbital} = [rectangle, rounded corners, fill=white, draw=black, minimum width=3.5ex, minimum height=3.5ex]
\tikzstyle{label}   = [rectangle, minimum width=3.5ex, node distance=3.5ex]

%1s splitting
\draw        (\mwidth/-2-\hsep*2,\sbaseline)            -- (\mwidth/-2-\hsep  ,\sbaseline);
\draw[split] (\mwidth/-2-\hsep  ,\sbaseline)            -- (\mwidth/-2        ,\sbaseline+\ssplit/2);
\draw        (\mwidth/-2        ,\sbaseline+\ssplit/2)  -- (\mwidth/2         ,\sbaseline+\ssplit/2);
\draw[split] (\mwidth/2         ,\sbaseline+\ssplit/2)  -- (\mwidth/2+\hsep   ,\sbaseline);
\draw        (\mwidth/2+\hsep   ,\sbaseline)            -- (\mwidth/+2+\hsep*2,\sbaseline);
\draw[split] (\mwidth/-2-\hsep  ,\sbaseline)            -- (\mwidth/-2        ,\sbaseline+\ssplit/-2);
\draw        (\mwidth/-2        ,\sbaseline+\ssplit/-2) -- (\mwidth/2         ,\sbaseline+\ssplit/-2);
\draw[split] (\mwidth/2         ,\sbaseline+\ssplit/-2) -- (\mwidth/2+\hsep   ,\sbaseline);

%left 1s
\draw[] (-\mwidth-\hsep,0em) node[orbital] (l1s) {\moupdown};
\node[label, below of=l1s] (l1sl) {$2s$};

%right 1s
\draw[] (\mwidth+\hsep,0em) node[orbital] (r1s) {\moupdown};
\node[label, below of=r1s] (r1sl) {$2s$};

%sigma bonding
\draw[] (0em,\ssplit/-2) node[orbital] (sb) {\moupdown};
\node[label, below of=sb]  (sbl) {$\sigma$};
\node[label, left of=sb, node distance = 9ex] {\tiny{\color{gray}{$\Psi_{a}+\Psi_{b}$}}};

%sigma antibonding
\draw[] (0em,\ssplit/2) node[orbital] (sa) {\moupdown};
\node[label, below of=sa] (sal) {$\sigma^{*}$};
\node[label, left of=sa, node distance = 9ex] {\tiny{\color{gray}{$\Psi_{a}-\Psi_{b}$}}};

%orbital labels
\node[label, below of=l1sl, node distance=6em]   (a)    {\smash[b]{\ce{O_{a}}}};
\node[label, right of=a   , node distance=\mwidth+\hsep]   (ab)   {\smash[b]{\ce{{O2}}}};
\node[label, right of=a   , node distance=\mwidth*2+\hsep*2]  (b)    {\smash[b]{\ce{O_{b}}}};

%Title
\node[label, below of=ab  , node distance=3em]   (desc) {Dioxygen ($|S|=1$)};

%2p splitting
\draw        (\mwidth/-2-\hsep*2-\pextend,\pbaseline)            -- (\mwidth/-2-\hsep  ,\pbaseline);
\draw[split] (\mwidth/-2-\hsep  ,\pbaseline)            -- (\mwidth/-2        ,\pbaseline+\psplit/2);
\draw        (\mwidth/-2        ,\pbaseline+\psplit/2)  -- (\mwidth/2         ,\pbaseline+\psplit/2);
\draw[split] (\mwidth/2         ,\pbaseline+\psplit/2)  -- (\mwidth/2+\hsep   ,\pbaseline);
\draw        (\mwidth/2+\hsep   ,\pbaseline)            -- (\mwidth/+2+\hsep*2+\pextend,\pbaseline);
\draw[split] (\mwidth/-2-\hsep  ,\pbaseline)            -- (\mwidth/-2        ,\pbaseline+\psplit/-2);
\draw        (\mwidth/-2        ,\pbaseline+\psplit/-2) -- (\mwidth/2         ,\pbaseline+\psplit/-2);
\draw[split] (\mwidth/2         ,\pbaseline+\psplit/-2) -- (\mwidth/2+\hsep   ,\pbaseline);

\draw[split] (\mwidth/-2-\hsep  ,\pbaseline)            -- (\mwidth/-2        ,\pbaseline-\psso+\psplit/2);
\draw        (\mwidth/-2        ,\pbaseline-\psso+\psplit/2)  -- (\mwidth/2         ,\pbaseline-\psso+\psplit/2);
\draw[split] (\mwidth/2         ,\pbaseline-\psso+\psplit/2)  -- (\mwidth/2+\hsep   ,\pbaseline);
\draw[split] (\mwidth/-2-\hsep  ,\pbaseline)            -- (\mwidth/-2        ,\pbaseline+\psso+\psplit/-2);
\draw        (\mwidth/-2        ,\pbaseline+\psso+\psplit/-2) -- (\mwidth/2         ,\pbaseline+\psso+\psplit/-2);
\draw[split] (\mwidth/2         ,\pbaseline+\psso+\psplit/-2) -- (\mwidth/2+\hsep   ,\pbaseline);

%left 2p
\draw[] (-\mwidth-\hsep,\pbaseline) node[orbital] (l2pa) {\moupdown};
\node[orbital, left of=l2pa] (l2pb) {\moup};
\node[orbital, left of=l2pb] (l2pc) {\moup};

\node[label, below of=l2pb] (l2pl) {$2p$};

%right 2p

\draw[] (\mwidth+\hsep,\pbaseline) node[orbital] (r2pa) {\moupdown};
\node[orbital, right of=r2pa] (r2pb) {\moup};
\node[orbital, right of=r2pb] (r2pc) {\moup};

\node[label, below of=r2pb] (r2pl) {$2p$};

%sigmap bonding
\draw[] (0em,\pbaseline+\psplit/-2) node[orbital] (spb) {\moupdown};
\node[label, below of=spb]  (spbl) {$\sigma$};

%sigmap antibonding
\draw[] (0em,\pbaseline+\psplit/2) node[orbital] (spab) {};
\node[label, below of=spab]  (spabl) {$\sigma^{*}$};

%pi antibonding levels
\draw[] (-\pxyoffset,\pbaseline+\psso-\psplit/2) node[orbital] (ppabx) {\moupdown};
\node[label, below of=ppabx]  (ppabxl) {$\pi_{x}$};
\draw[] (+\pxyoffset,\pbaseline+\psso-\psplit/2) node[orbital] (ppaby) {\moupdown};
\node[label, below of=ppaby]  (ppabyl) {$\pi_{y}$};

%pi antibonding levels
\draw[] (-\pxyoffset,\pbaseline-\psso+\psplit/2) node[orbital] (ppbx) {\moup};
\node[label, below of=ppbx]  (ppbxl) {$\pi^{*}_{x}$};
\draw[] (+\pxyoffset,\pbaseline-\psso+\psplit/2) node[orbital] (ppby) {\moup};
\node[label, below of=ppby]  (ppbyl) {$\pi^{*}_{y}$};

\end{tikzpicture}

\end{document}

答案1

我开始根据您的第一个示例图做一个示例,但希望您可以采纳这些想法。

在构建 TikZ 图形时,我经常会发现矩阵连锁店非常有帮助。而且每次都会思考图片的一小部分。

因此,在等待我们的 TikZ 大神 Jake 展示一些更优雅的东西的同时,我想展示一下我对第一个示例图片(Plain-TeX)的看法:

\input tikz
\let\up\uparrow \let\down\downarrow % just to shorten a little
\usetikzlibrary{chains,matrix}
\tikzpicture[
  a/.style={on chain,join,draw,rounded corners,minimum size=1.5em,inner sep=1pt},
  r/.style={a,text=red},
  every scope/.style={start chain,node distance=1mm}
  ]
  \matrix[matrix of nodes,column sep=1.5em,row sep=1.5ex] (mx) {
    &\scope[xshift=1em]\coordinate[a](A);
      \node[a,label=below:$\sigma_\rho^*$]{};
      \coordinate[a](C);\endscope\\
    &\scope\coordinate[a](D);
      \node[r,label=below:$\pi_x^*$]{$\up$};
      \node[r,label=below:$\pi_y^*$]{$\up$};
      \coordinate[a](G);\endscope\\
    \scope\node[a]{$\up$}; \node[a]{$\up$}; \node[a]{$\up\,\down$};
      \coordinate[a](H);\endscope&&
      \scope\coordinate[a](I);
        \node[a]{$\up\,\down$}; \node[a]{$\down$}; \node[a]{$\down$};\endscope\\
    &\scope\coordinate[a](J);
      \node[a,label=below:$\pi_x$]{$\up\,\down$};
      \node[a,label=below:$\pi_y$]{$\up\,\down$};
      \coordinate[a](K);\endscope\\
    &\scope[xshift=1em]\coordinate[a](L);
      \node[a,label=below:$\sigma_\rho$]{$\up\,\down$};
      \coordinate[a](N);\endscope\\
  };

  \draw (H)--(A) (H)--(D) (H)--(J) (H)--(L)
        (I)--(C) (I)--(G) (I)--(K) (I)--(N);

\endtikzpicture
\bye

在此处输入图片描述

思考您可以将链的绘制分离到矩阵外部,并能够分支事物。

答案2

我想知道是否有人见过用于在 LaTeX 中绘制(定性)分子轨道分裂图的软件包?

自 2011 年 9 月底起,模式图它为分子轨道图提供了简单的语法。

两个例子:

\documentclass{article}
\usepackage{modiagram,chemfig}
\usepackage[version=3]{mhchem}
\begin{document}

\begin{MOdiagram}[labels,names,style=square]
 \atom[N]{left}{
   2p = {0;up,up,up}
 }
 \atom[O]{right}{
   2p = {2;pair,up,up}
 }
 \molecule[NO]{
   2pMO  = {1.8,.4;pair,pair,pair,up} ,
   color = {2piy* = red}
 }
\end{MOdiagram}

\begin{MOdiagram}[names]
 \atom[\lewis{0.,F}\hspace*{5mm}\lewis{4.,F}]{left}{
   1s = .2;up,
   up-el-pos = {1sleft=.5}
 }
 \atom[Xe]{right}{
   1s = 1.25;pair
 }
 \molecule[\ce{XeF2}]{
   1sMO = {1/.25;pair}
 }
 \AO(1cm){s}{0;up}
 \AO(3cm){s}{0;pair}
 \connect{ AO1 & AO2 }
 \node[right,xshift=4mm] at (1sigma) {\footnotesize bonding};
 \node[above] at (AO2.90) {\footnotesize non-bonding};
 \node[above] at (1sigma*.90) {\footnotesize anti-bonding};
\end{MOdiagram}

\end{document}

结果

答案3

morbusg 的方法太棒了,对于大多数可以用这种漂亮的矩形合理绘制的分子轨道来说,这应该是人们所希望的。

然而,在某些情况下,可能需要对原子/分子轨道的垂直位置进行更精细的控制(例如,在一氧化氮中,氧的 2p 轨道比氮的 2p 轨道具有更高的能级,根据化学教科书)。将所有轨道放在一个矩阵中会使调整垂直位置变得有点困难。

基于 morbusg 的方法,这里使用每个能级的单独矩阵。矩阵不用于实际放置轨道,而是为了访问允许\execute at begin cell={<some code>}我们将轨道封闭在scopes 中的良好功能,从而启动chains。水平间距是使用这些链完成的,垂直定位是使用yshifts 完成的。

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{chains,matrix}

\newcommand{\moup}{$\uparrow$}
\newcommand{\modown}{$\downarrow$}
\newcommand{\moupdown}{$\uparrow\,\downarrow$}
\begin{document}

\begin{tikzpicture}[
  a/.style={on chain,join,draw,rounded corners,minimum size=1.5em,inner sep=1pt},
  r/.style={a,text=red},
  % Style for molecular orbital matrices
  mo/.style={inner sep=-\pgflinewidth,label distance=0.3em,label position=below},
  % Adjustments for left atom
  left atom/.style={execute at begin cell={\begin{scope}},
    execute at end cell={\coordinate[a];\end{scope}},mo,xshift=-1.5cm,matrix anchor=base east},
  % Adjustments for right atom
  right atom/.style={execute at begin cell={\begin{scope}\coordinate[a];},
    execute at end cell={\end{scope}},mo,xshift=1.5cm,matrix anchor=base west},
  % Adjustments for molecular orbitals
  molecule/.style={execute at begin cell={\begin{scope}\coordinate[a,inner sep=2cm];},
    execute at end cell={\coordinate[a];\end{scope}},mo,anchor=base},
  % Morbusg's scope-chain magic
  every scope/.style={start chain,node distance=1mm},
  ]

\matrix[molecule,yshift=2cm] (as) { % Antibonding Sigma
    \node[a,label=$\sigma_\rho^*$]{}; \\};

\matrix[molecule,yshift=0.8cm] (ap) {  % Antibonding Pi
    \node[a,label=$\pi_x^*$]{\moup};
    \node[a,label=$\pi_y^*$]{}; \\};

\matrix[molecule,yshift=-0.8cm] (bp) { % Bonding Pi
      \node[a,label=$\pi_x$]{\moupdown};
      \node[a,label=$\pi_y$]{\moupdown}; \\};

\matrix[molecule,yshift=-2cm] (bs) { % Bonding Sigma
    \node[a,label=$\sigma_\rho$]{\moupdown}; \\};

\matrix [left atom,yshift=-0.4cm] (la){ % Left Atom
    \node[a]{\moup}; \node[a]{\moup}; \node[a]{\moup};\\};

\matrix [right atom,yshift=0.5cm] (ra) { % Right Atom
   \node[a]{\moupdown}; \node[a]{\modown}; \node[a]{\modown}; \\};

\draw [densely dashed] (la.base east) -- (bs.base west)
  (bs.base east) -- (ra.base west) -- (as.base east)
  (as.base west) -- (la.base east) -- (bp.base west)
  (bp.base east) -- (ra.base west) -- (ap.base east)
  (ap.base west) -- (la.base east);
\end{tikzpicture}

\end{document}

一氧化氮分子轨道图

相关内容