声明化学平衡箭头(稳态箭头)

声明化学平衡箭头(稳态箭头)

我尝试使用 和 创建一个稳定状态箭头,pgfarrowsdeclarepgfsetinnerlinewidth放置在箭头声明中似乎没有任何效果。因此,以下代码显示了我的解决方案,但一点也不方便。

 \documentclass[border=5mm]{standalone}
    \usepackage{tikz}

    \begin{document}
    \newdimen\arrowsize
    \pgfarrowsdeclare{mya}{mya}{% next two lines do not work as expected. 
    %   \pgfsetinnerlinewidth{3pt} %no effect here
    %   \pgfsetlinewidth{5pt} % works but spreads over every line in the file
    \arrowsize=0.2pt \advance\arrowsize by .5\pgflinewidth %
\pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth} %
    \pgfarrowsrightextend{.5\pgflinewidth}
     }%
     {%
      \pgfsetlinewidth{1pt}
      \pgfsetdash{}{0pt} % do not dash 
      \pgfsetroundjoin % fix join 
      \pgfsetroundcap   % fix cap
  \pgfpathmoveto{\pgfpoint{-10pt}{12pt}} \pgfpatharc{180}{270}{10pt} %
  \pgfusepathqstroke%
 }

\begin{tikzpicture}
  \node  (n1) at (0,0) {Node1};
  \node(n2)at (0,2) {Node2} ;
  \node(n3)at (0,4) {Node3} ;
%The following code produces correct output
  {\pgfsetinnerlinewidth{3pt} %wont stay local
   \pgfsetlinewidth{5pt} % seems to stay local
   \draw[mya-mya] (n1)--(n2); }
   \pgfsetlinewidth{1pt}
   \draw (n2)--(n3);
\end{tikzpicture}
\end{document}

在此处输入图片描述

有没有办法告诉 pgf 使箭头双线化而无需手动设置hlinewidthinnerlinewidth也许在箭头声明中?

PS 我简单看了一下 chemfig 包,我觉得 Christian 使用了几条分离的路径来构造双箭头。也许这样比较简单,所以我会在以后的方法中考虑这一点。

编辑:这是产生的输出

\documentclass[border=5mm]{standalone}

 \usepackage{tikz}


 \begin{document}
        \newdimen\arrowsize
        \pgfarrowsdeclare{mya}{mya}{% next two lines do not work as    expected. 

          \pgfsetinnerlinewidth{4pt} %does sth strange
               \pgfsetlinewidth{5pt} % works but spreads over every 
    %line in the file
            \arrowsize=0.2pt \advance\arrowsize by .5\pgflinewidth%
            \pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth} %
            \pgfarrowsrightextend{.5\pgflinewidth}
             }%
             {%
              \pgfsetlinewidth{1pt}
              \pgfsetdash{}{0pt} % do not dash 
              \pgfsetroundjoin % fix join 
              \pgfsetroundcap   % fix cap
              \pgfpathmoveto{\pgfpoint{-10pt}{12pt}}\pgfpatharc{180}{270}{10pt} %
             \pgfusepathqstroke}

    \begin{tikzpicture}
      \node  (n1) at (0,0) {Node1};
      \node(n2)at (0,2) {Node2} ;
      \node(n3)at (0,4) {Node3} ;
    %
       \draw[mya-mya] (n1)--(n2);% 
       \draw (n2)--(n3);
    %
    \end{tikzpicture}


    \end{document}

在此处输入图片描述

答案1

您可以使用double来获取双线。在我看来,这应该与箭头定义分开保存,因为箭头定义仅用于定义尖端。一个简单的解决方案是定义一种样式来设置双线的绘图命令,并创建一个新的箭头尖端以匹配您在示例中所拥有的。这引出了以下内容:

\documentclass{article}
\usepackage{tikz}
\newdimen\arrowsize
\newdimen\mylw
\pgfkeys{/my arrows/chemeq/.style={draw,thick,double distance=2pt,onearc-onearc}}
\pgfkeys{/my arrows/size/.code={\pgfsetarrowoptions{onearc}{#1}}}
\def\myalw{.4pt}
\pgfarrowsdeclare{onearc}{onearc}{%
  \mylw=\myalw
  \pgfarrowsleftextend{-\pgfgetarrowoptions{onearc}-.5\mylw}
  \pgfarrowsrightextend{0pt}
}{%
  \pgfsetdash{}{0pt}
  \mylw=\pgflinewidth
  \pgfsetlinewidth{\myalw}
  \advance\arrowsize by.5\pgflinewidth
  \pgfpathmoveto{\pgfpoint{-\pgfgetarrowoptions{onearc}}{-\pgfgetarrowoptions{onearc}-.5\mylw}}%
  \pgfpatharc{180}{90}{\pgfgetarrowoptions{onearc}}
  \pgfusepathqstroke
}
\begin{document}
  \begin{tikzpicture}
    \node[draw] (x) at (0,0) {x};
    \node[draw] (y) at (2,0) {y};
    \path[/my arrows/chemeq,/my arrows/size=4pt] (x) -- (y);
    \path[/my arrows/chemeq,/my arrows/size=8pt] (0,1) node[below] {Node 1} -- (0,3) node[above] {Node 2};
  \end{tikzpicture}
\end{document}

这里我们在箭头上使用一个选项来设置绘制的弧的大小。该选项还可用于例如线宽或形状的一些细微变化。如果您想传递多个选项,则必须对可以传递的单个选项命令进行一些解析。结果如下所示:

TikZ 化学方程式箭头

更新:这显示了如何缩短符号并将多个选项传递给箭头。

\documentclass{article}
\usepackage{tikz}
\newdimen\mylw
\tikzset{chemeq/.style={draw,thick,double distance=2pt,onearc-onearc,/chemeq/size={#1}}}
\tikzset{chemeq/.default={.4pt 6pt}}
\pgfkeys{/chemeq/size/.code={\pgfsetarrowoptions{onearc}{#1}}}
\def\parseopts#1 #2{\xdef\myalw{#1}\xdef\myasize{#2}}
\pgfarrowsdeclare{onearc}{onearc}{%
  {\edef\x{\pgfgetarrowoptions{onearc}}\expandafter\parseopts\x}
  \mylw=\myalw
  \pgfarrowsleftextend{-\myasize-.5\mylw}
  \pgfarrowsrightextend{0pt}
}{%
  \pgfsetdash{}{0pt}
  {\edef\x{\pgfgetarrowoptions{onearc}}\expandafter\parseopts\x}
  \mylw=\pgflinewidth
  \pgfsetlinewidth{\myalw}
  \pgfpathmoveto{\pgfpoint{-\myasize}{-\myasize-.5\mylw}}%
  \pgfpatharc{180}{90}{\myasize}
  \pgfusepathqstroke
}
\begin{document}
  \begin{tikzpicture}
    \node[draw] (x) at (0,0) {x};
    \node[draw] (y) at (2,0) {y};
    \path[chemeq={.8pt 8pt}] (x) -- (y);
    \path[chemeq] (0,1) node[below] {Node 1} -- (0,3) node[above] {Node 2};
  \end{tikzpicture}
\end{document}

看起来几乎一样,只有x-y连接上的箭头略有不同。我非常怀疑完全可以不使用 double(当然,您可以使用 TikZ innerlinewidth 原语,但它的作用完全相同,您将无法将这些命令移到 arrowtip 代码中)。

相关内容