使用 chemfig 绘制指向同一复合物的多个箭头

使用 chemfig 绘制指向同一复合物的多个箭头

我目前正在尝试使用 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 等)并不重要,您似乎可以自由命名它们。

subschemes 可能对您的任务有用,也可能没用,但您当然可以将它们与分支结合起来。

结果

\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 获得更好的效果。不幸的是,我最终不得不使用屏幕截图,因为它们似乎不再支持创建图像。

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}

进化

相关内容