我尝试使用 和 创建一个稳定状态箭头,pgfarrowsdeclare
但pgfsetinnerlinewidth
放置在箭头声明中似乎没有任何效果。因此,以下代码显示了我的解决方案,但一点也不方便。
\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 使箭头双线化而无需手动设置hlinewidth
?innerlinewidth
也许在箭头声明中?
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}
这里我们在箭头上使用一个选项来设置绘制的弧的大小。该选项还可用于例如线宽或形状的一些细微变化。如果您想传递多个选项,则必须对可以传递的单个选项命令进行一些解析。结果如下所示:
更新:这显示了如何缩短符号并将多个选项传递给箭头。
\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 代码中)。