我一直在尝试使用“chemfig”包来绘制给定键上的电子。我使用“chemmove”命令来绘制电子,但修改和重复使用效率很低。我希望我的 chemfig 完全包含在“adjustbox”中,但其中某些部分位于所需边界之外。有没有更有效的方法来绘制键上的电子并将我的 chemfig 的内容包含在 adjustbox 或类似的东西中?
\documentclass[10pt,letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage{chemfig}
\usepackage{adjustbox}
\usetikzlibrary{calc}
\begin{document}
\tikzstyle{electron}=[circle,fill,inner sep=0.75pt,blue]
\begin{adjustbox}{frame}
\chemfig{
@{s}S
(-[:0,,,,]@{o1}\charge{0=\:,90=\:,270=\:}{O})
(-[:90,,,,]@{o2}\charge{0=\:,90=\:,180=\:}{O})
(=[:180]@{o3}\charge{135=\:,225=\:}{O})
(=[:270]@{o4}\charge{225=\:,315=\:}{O})
}
\chemmove{
\node[] (b1) at ($(s)!0.5!(o1)$){};
\node[electron] at ($(s)!0.60!(o1)$){};
\node[electron] at ($(s)!0.40!(o1)$){};
\node[electron] at ($(s)!0.60!(o2)$){};
\node[electron] at ($(s)!0.40!(o2)$){};
\node[electron, shift={(0,0.04)}] at ($(s)!0.60!(o3)$){};
\node[electron, shift={(0,0.04)}] at ($(s)!0.40!(o3)$){};
\node[electron, shift={(0,-0.04)}] at ($(s)!0.60!(o3)$){};
\node[electron, shift={(0,-0.04)}] at ($(s)!0.40!(o3)$){};
\node[electron, shift={(0.04,0)}] at ($(s)!0.60!(o4)$){};
\node[electron, shift={(0.04,0)}] at ($(s)!0.40!(o4)$){};
\node[electron, shift={(-0.04,0)}] at ($(s)!0.60!(o4)$){};
\node[electron, shift={(-0.04,0)}] at ($(s)!0.40!(o4)$){};
\draw[draw=green, fill=yellow, fill opacity=0] (o1) circle[radius=0.49cm];
\draw[draw=green, fill=yellow, fill opacity=0] (s) circle[radius=0.49cm];
}
\end{adjustbox}
\end{document}
答案1
您的问题包含两个子问题:
- 如何让原子周围的电子保持在图片的边界框内
chemfig
? - 如何以更优雅的方式将蓝色电子放置在键上?
对于第一个子问题,您可以[overlay=false]
向相关\charge
宏添加选项。这将覆盖默认行为,以在边界框外绘制电荷注释。
至于第二个子问题,我认为创建自定义装饰将电子放置在键上并将此样式应用于图片中的相关键要简单得多chemfig
。您可以使用decorations.markings
tikz 提供的库来实现这一点。我将 设置为inner sep
,0.15ex
因为这是手册中所述的电荷注释中小圆圈的半径chemfig
。
\documentclass[border=10pt]{standalone}
\usepackage{adjustbox}
\usepackage{chemfig}
\usetikzlibrary{decorations.markings}
\begin{document}
\tikzset{
electron/.style={circle, fill, inner sep=0.15ex, blue},
electrons on bond/.style={
postaction={decorate, decoration={
markings,
mark=between positions 0.33 and 0.66 step 0.33 with {
\node[electron] {};
}
} }
}
}
\begin{adjustbox}{frame}
\chemfig{
@{s}S
(-[:0,,,,electrons on bond]@{o1}\charge{[overlay=false]0=\:,90=\:,270=\:}{O})
(-[:90,,,,electrons on bond]@{o2}\charge{[overlay=false]0=\:,90=\:,180=\:}{O})
(=[:180,,,,electrons on bond]@{o3}\charge{[overlay=false]135=\:,225=\:}{O})
(=[:270,,,,electrons on bond]@{o4}\charge{[overlay=false]225=\:,315=\:}{O})
}
\end{adjustbox}
\end{document}
如果你想添加圆环,事情就会变得棘手得多。主要问题是宏\chemmove
将所有东西都绘制为叠加层,不会影响chemfig
图片的边界框。
overlay=false
另一个问题是,如果你在宏上使用上述方法\charge
,这将影响相关原子的边界框,因此中心会偏移。如果你添加一个以此类原子的中心为中心的圆,它会看起来很奇怪。
第三个小问题是,由于装饰样式中的位置是从线的起点和终点计算的(而不是从相关节点中心的起点和终点计算的),所以您可能需要稍微调整位置。
所以,您可以做的是(但我必须承认这不是最优雅的解决方案)不要使用overlay=false
您想要围绕其画圈的原子的选项,而是只在图片\hspace
后面放置一些chemfig
。
无论如何,您需要注意adjustbox
环境内的每个空行都会在里面添加一个空格,从而增加框的宽度。
\documentclass[border=10pt]{standalone}
\usepackage{adjustbox}
\usepackage{chemfig}
\usetikzlibrary{decorations.markings}
\begin{document}
\tikzset{
electron/.style={circle, fill, inner sep=0.15ex, blue},
electrons on bond/.style={
postaction={decorate, decoration={
markings,
mark=between positions 0.3 and 0.75 step 0.45 with {
\node[electron] {};
}
} }
}
}
\begin{adjustbox}{frame}
\chemfig{
@{s}S
(-[:0,,,,electrons on bond]@{o1}\charge{0=\:,90=\:,270=\:}{O})
(-[:90,,,,electrons on bond]@{o2}\charge{[overlay=false]0=\:,90=\:,180=\:}{O})
(=[:180,,,,electrons on bond]@{o3}\charge{[overlay=false]135=\:,225=\:}{O})
(=[:270,,,,electrons on bond]@{o4}\charge{[overlay=false]225=\:,315=\:}{O})
}
\chemmove{
\draw[draw=green] (o1) circle[radius=0.49cm];
\draw[draw=green] (s) circle[radius=0.49cm];
}
\hspace{.125cm}
\end{adjustbox}
\end{document}
答案2
一个简单的方法是在氧原子上添加看不见的键,这将使分子占据更多的空间,并且盒子不会接触电子。
\documentclass[10pt,letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage{chemfig}
\usepackage{adjustbox}
\usetikzlibrary{calc}
\begin{document}
\tikzstyle{electron}=[circle,fill,inner sep=0.75pt,blue]
\begin{adjustbox}{frame}
\chemfig{
@{s}S
(-[:0,,,,]@{o1}\charge{0=\:,90=\:,270=\:}{O}-[0,.5,,,,draw=none])
(-[:90,,,,]@{o2}\charge{0=\:,90=\:,180=\:}{O}-[90,.3,,,,draw=none])
(=[:180]@{o3}\charge{135=\:,225=\:}{O}-[180,.3,,,,draw=none])
(=[:270]@{o4}\charge{225=\:,315=\:}{O}-[270,.3,,,,draw=none])
}
\chemmove{
\node[] (b1) at ($(s)!0.5!(o1)$){};
\node[electron] at ($(s)!0.60!(o1)$){};
\node[electron] at ($(s)!0.40!(o1)$){};
\node[electron] at ($(s)!0.60!(o2)$){};
\node[electron] at ($(s)!0.40!(o2)$){};
\node[electron, shift={(0,0.04)}] at ($(s)!0.60!(o3)$){};
\node[electron, shift={(0,0.04)}] at ($(s)!0.40!(o3)$){};
\node[electron, shift={(0,-0.04)}] at ($(s)!0.60!(o3)$){};
\node[electron, shift={(0,-0.04)}] at ($(s)!0.40!(o3)$){};
\node[electron, shift={(0.04,0)}] at ($(s)!0.60!(o4)$){};
\node[electron, shift={(0.04,0)}] at ($(s)!0.40!(o4)$){};
\node[electron, shift={(-0.04,0)}] at ($(s)!0.60!(o4)$){};
\node[electron, shift={(-0.04,0)}] at ($(s)!0.40!(o4)$){};
\draw[draw=green, fill=yellow, fill opacity=0] (o1) circle[radius=0.49cm];
\draw[draw=green, fill=yellow, fill opacity=0] (s) circle[radius=0.49cm];
}
\end{adjustbox}
\end{document}