![使用 chemfig 绘制指向同一复合物的多个箭头](https://linux22.com/image/475106/%E4%BD%BF%E7%94%A8%20chemfig%20%E7%BB%98%E5%88%B6%E6%8C%87%E5%90%91%E5%90%8C%E4%B8%80%E5%A4%8D%E5%90%88%E7%89%A9%E7%9A%84%E5%A4%9A%E4%B8%AA%E7%AE%AD%E5%A4%B4.png)
我目前正在尝试使用 chemfig 在 latex 中绘制化学反应网络,但是在绘制指向链接类中同一复合体的多个箭头时遇到了问题。这是我目前的脚本:
\documentclass{article}
\usepackage{amssymb}
\usepackage{chemfig}
\newcommand{\aaa}{A_1}
\newcommand{\bb}{B_1}
\newcommand{\cc}{C_1}
\begin{document}
\begin{figure}
\centering
\schemestart
\subscheme{$\aaa + \bb$}
\arrow{<=>[$k_1$][$k_{-1}$]}
\chemfig{\cc}
\arrow{->[$k_{\cc}$]}
\chemfig{\varnothing}
\arrow{<-[$k_{\aaa}$]}[90]
\chemfig{\aaa}
\schemestop
\end{figure}
\end{document}
其中\aaa,\bb
和\cc
是我定义的宏。我想创建另一个复合体,\chemfig{\bb}
另一个箭头指向\chemfig{\varnothing}
相反的一侧,\chemfig{\cc}
但我不确定如何做到这一点。从我从文档中读到的内容来看,如果您将化学品标记为等,则可以做到这一点,A,B,
但我不知道如何使用自定义宏来做到这一点。再举一个例子:
我发现的这个例子包含多个从多个方向衰减到 0 的复合体。我想在我的图表中做同样的事情。
答案1
我认为你正在寻找的功能是branching
,请参阅IV 7 分支在手册中。
下面我根据你的问题勾勒出关键结构,忽略了方向和标签,以便更好地显示重要内容。几点说明:
- 当你开发绘图时,最好使用类
standalone
\includegraphics
您可以单独编译它们,然后通过包中包含 pdfgraphicx
chemfig
建立在 之上Tikz
,但抽象了很多东西以简化大多数化学绘图;所以你基本上可以“从左到右绘制”- 因此你需要的一件事乍一看并不太明显:你已经放置的节点的节点位置
chemfig
@
的替代方案是使用\arrow
- 所以在这里我把
@a
在位置上画的任何东西都关联起来A
因此,“绘图仪”不会从 A 到 B 再到 .. E,而是一直返回到 @a 并从那里重新开始。名称(a、bb 等)并不重要,您似乎可以自由命名它们。
subscheme
s 可能对您的任务有用,也可能没用,但您当然可以将它们与分支结合起来。
\documentclass[10pt,border=3mm,tikz]{standalone}
\usepackage{chemfig}
\begin{document}
\schemestart
A\arrow(a--bb) B
\arrow(@a--cc)[ 90] C
\arrow(@a--dd)[180] D
\arrow(@a--ee)[-90] E
\schemestop
\end{document}
附言为了更快地得到结果,我建议遵循以下步骤:
- 首先创建整体方案的结构,就像我展示的那样,使用 A、B、C 等占位符,然后进行编译
- 接下来,调整箭头方向和类型
- 接下来开始用化学公式或化合物替换一些占位符
- 接下来在需要的地方给箭头添加标签
- 接下来用一个或多个宏替换它们或它们的一部分:清晰度和便利性应该是您的指南
- 继续这个迭代过程,直到你既创建了最终方案,又创建了干净的代码(很容易写出丑陋的东西,一天或一周后很难阅读)
- 从一开始就在代码中使用注释:这是一个简单的救星
例子按照上述流程:
逐步发展:
代码:
\documentclass[10pt,border=3mm,tikz]{standalone}
\usepackage{chemfig}
\begin{document}
% ~~~ following the process for the 3rd example given ~~~
% ~~~ 1. overall structure
\schemestart
A\arrow(s1--zero) B
\arrow C
\arrow(@zero--p)[-90] P
\schemestop
% ~~~ 2. arrow directions and types ~~~
\schemestart
A\arrow(s1--zero){<=>} B
\arrow {<=>} C
\arrow(@zero--p){<-}[-90] P
\schemestop
% ~~~ 3. replacing placeholders ~~~
\schemestart
S1\arrow(s1--zero){<=>} 0
\arrow {<=>} S2
\arrow(@zero--p){<-}[-90] P
\schemestop
% ~~~ 4. adding labels ~~~
\schemestart
S1\arrow(s1--zero){<=>[$\zeta_{S1}$][$F_{S1}$]} 0
\arrow {<=>[$\zeta_{S1}$][$F_{S2}$]} S2
\arrow(@zero--p){<-[(above)][*{0}$\zeta_P$]}[-90] P
\schemestop
\end{document}
此时我会停止该过程,因为进一步的步骤既不需要也没有用,除非整体背景(数十个类似的反应)要求进一步重构,例如作为准备步骤;此代码似乎足够干净和清晰(对我而言):
% ~~~ delete everything else ~~~
\schemestart
S1\arrow(s1--zero){<=>[$\zeta_{S1}$][$F_{S1}$]} 0
\arrow {<=>[$\zeta_{S1}$][$F_{S2}$]} S2
\arrow(@zero--p){<-[][*{0}$\zeta_P$]}[-90] P
\schemestop
顺便提一句,如果朝向 S2 的方向和标签很重要,则需要某种方法来交换事物。显而易见的方法是交换标签,例如[above][below]
朝向[below][above]
。
答案2
如果要使用宏作为名称,则可以(<name1>--<name2>)
在 后直接使用可选的 覆盖默认命名方案\arrow
。如果<name1>
或 两个名称引用现有节点,请使用@
语法来引用它们。
例如,
\documentclass[border=10pt]{standalone}
\usepackage{amssymb}
\usepackage{chemfig}
\newcommand{\aaa}{A_1}
\newcommand{\bb}{B_1}
\newcommand{\cc}{C_1}
\begin{document}
\schemestart
\subscheme{$\aaa + \bb$}
\arrow(sssb--cc){<=>[$k_1$][$k_{-1}$]}
\chemfig{\cc}
\arrow(@cc--vn){->[$k_{\cc}$]}
\chemfig{\varnothing}
\arrow(@vn--aaa){<-[$k_{\aaa}$]}[90]
\chemfig{\aaa}
\arrow(@vn--bb){<-[$k_{\bb}$]}
\chemfig{\bb}
\schemestop
\end{document}
产生我认为你想要的输出。我通常制作图像粘贴到帖子中的方法目前会产生问题,所以这是一个实验,看看我能否从 Overleaf 获得更好的效果。不幸的是,我最终不得不使用屏幕截图,因为它们似乎不再支持创建图像。
这比 Okular 目前给我的要好,但为什么这么暗?
答案3
让我借此机会来说明一下遵循过程,就像我在我的其他答案,最好与重构相结合,其方法最好Test-Driven-Design (TDD)
(我们通过编译步骤自动完成并查看结果(=测试))。
(A)最终结果(按照上述流程)
\documentclass[10pt,border=3mm,tikz]{standalone}
\usepackage{chemfig}
\usepackage{amssymb}
\newcommand\cA[0]{A_1}
\newcommand\cB[0]{B_1}
\newcommand\cC[0]{C_1}
\newcommand\kr[1]{$k_{#1}$}% k-r eplacement
\begin{document}
\schemestart
\chemfig{\cA{} + \cB}
\arrow {<=>[$k_1$][$k_{-1}$]} \chemfig{\cC}
\arrow(t--u) {->[\kr{\cC}][]} \chemfig{\varnothing}
\arrow {<-[\kr{\cB}]} \chemfig{\cB}
\arrow(@u--w) {<-[\kr{\cA}]}[90] \chemfig{\cA}
\schemestop
\end{document}
(B)按照上述流程
看看代码是如何在很短的时间内一步步自行演化的。思考越少,结果越多。
步骤 #5 真的有必要吗?这得看情况。这可能是口味或偏好的问题,也可能是准备一些你知道接下来会发生的事情的更复杂的事情。
它必须在这里停止吗?是也不是。您可能喜欢所取得的成果。您可能不喜欢笨拙的调用\kr{\cC}
:为什么不使用几个带有 0 个参数的宏,即提供常量文本?所有这些都是有效的考虑。这仅取决于您想去哪里或到达哪里。
\documentclass[10pt,border=3mm,tikz]{standalone}
\usepackage{chemfig}
% ~~~ introduced in step #3 ~~~
\usepackage{amssymb}
% ~~~ introduced in step #5a ~~~
\newcommand\cA[0]{A_1}
\newcommand\cB[0]{B_1}
\newcommand\cC[0]{C_1}
% ~~~ introduced in step #5b ~~~~~~~
\newcommand\kr[1]{$k_{#1}$}% k-r eplacement
\begin{document}
% ~~~ following the process for the 3rd example given ~~~
% ~~~ 1. overall structure using silly names
\schemestart
S\arrow T \arrow(t--u) U \arrow V
\arrow(@u--w)[90]W
\schemestop
% ~~~ 2. arrow directions and types ~~~
% kindly watch the minimalistic use of coordinates
% (t--u) is only needed to recall @u
\schemestart
S
\arrow {<=>} T
\arrow(t--u) U
\arrow {<-} V
\arrow(@u--w) {<-}[90] W
\schemestop
% ~~~ 3. replacing placeholders ~~~
\schemestart
\chemfig{A_1 + B_1}
\arrow {<=>} \chemfig{C_1}
\arrow(t--u) \chemfig{\varnothing}
\arrow {<-} \chemfig{B_1}
\arrow(@u--w) {<-}[90] \chemfig{A_1}
\schemestop
% ~~~ 4. adding labels ~~~
\schemestart
\chemfig{A_1 + B_1}
\arrow {<=>[$k_1$][$k_{-1}$]} \chemfig{C_1}
\arrow(t--u) {->[$k_{C_1}$][]} \chemfig{\varnothing}
\arrow {<-[$k_{B_1}$]} \chemfig{B_1}
\arrow(@u--w) {<-[$k_{A_1}$]}[90] \chemfig{A_1}
\schemestop
% ~~~ 5. introducing useful (?) macro shortcuts ~~~
% 5a. intermediate result: let's remove most k's !
\schemestart
\chemfig{\cA{} + \cB}
\arrow {<=>[$k_1$][$k_{-1}$]} \chemfig{\cC}
\arrow(t--u) {->[$k_{\cC}$][]} \chemfig{\varnothing}
\arrow {<-[$k_{\cB}$]} \chemfig{\cB}
\arrow(@u--w) {<-[$k_{\cA}$]}[90] \chemfig{\cA}
\schemestop
% 5b. the outcome
\schemestart
\chemfig{\cA{} + \cB}
\arrow {<=>[$k_1$][$k_{-1}$]} \chemfig{\cC}
\arrow(t--u) {->[\kr{\cC}][]} \chemfig{\varnothing}
\arrow {<-[\kr{\cB}]} \chemfig{\cB}
\arrow(@u--w) {<-[\kr{\cA}]}[90] \chemfig{\cA}
\schemestop
\end{document}