这个问题导致了一个新的方案的出现:
modiagram
我想知道是否有人见过在 LaTeX 中绘制(定性)分子轨道分裂图的软件包?或者是否存在可以轻松重新用于此任务的软件包?
否则,我想我会在 TikZ 中尝试一下。
例子
(从维基百科上的图片由“orci”提供- 由于各种元素略有错位,我怀疑它是手工绘制的)
在 TikZ 中尝试一下
我决定尝试在 TikZ 中执行此操作,并为氧气准备了一个 MO 图(先前尝试过更简单的二氢)——这就是我想要的那种方案。
这种方法至少存在三个问题:
- 它不是很通用,我不知道有什么策略可以使它任意扩展(例如,像示例图中那样堆叠能级等)。部分解决
- H、H_{2} 标签未与每个 H 的基线对齐,因此 H_{2} 略高于其他两个。已解决,感谢@Matthew Leingang
- 虽然坐标与文本成比例,但都是硬编码的,我想知道如何使该图在总宽度、总高度和分层分离方面可扩展。解决了使用(可能太多)变量和坐标计算的问题
请帮助我改进这种可能非常幼稚的方法。
规格
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>}
我们将轨道封闭在scope
s 中的良好功能,从而启动chain
s。水平间距是使用这些链完成的,垂直定位是使用yshift
s 完成的。
\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}