PGF/TikZ 中的箭头定义

PGF/TikZ 中的箭头定义

我正在尝试定义一个箭头,用于tikzpictures(类似于 IPE 使用的小箭头)5pt 长(尖端到末端)和 3.333pt 宽(底部)。以下是我想出的:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows}

\pgfarrowsdeclare{ipe arrow}{ipe arrow}{
  \arrowsize=5pt
  \pgfarrowsleftextend{-.5\pgflinewidth}
  \pgfarrowsrightextend{.5\pgflinewidth}
} 
{ 
  \arrowsize=5pt
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathlineto{\pgfpoint{-5pt}{-1.666pt}}
  \pgfpathlineto{\pgfpoint{-5pt}{1.666pt}}  
  \pgfpathlineto{\pgfpointorigin}  
  \pgfusepathqfill
}

\begin{document}

\begin{tikzpicture}
\draw [<->,>=ipe arrow](0,0) -- (1,0);
\end{tikzpicture}
\end{document}

然而,这条线突出了箭头的尖端(见右侧):

在此处输入图片描述

我猜想该错误一定与有关\pgfarrowsrightextend,但我似乎不明白它是如何工作的。

答案1

长度\arrowsize只是用来计算长度的辅助尺寸,与箭头大小其实没有任何关系。

右延伸是应用箭头时线条将缩短的长度。这也会移动箭头坐标系(\pgfpointorigin您使用的坐标系)的原点。如果您想绘制箭头,则需要考虑相同的量。

这条线必须缩短1.5的宽度

然后是左侧扩展(实际上只有在您想要组合箭头时才需要)5pt-1.5\pgflinewidth。我使用了基本的 TeX 尺寸计算和\pgfutil@tempdima尺寸来计算它,这样就不需要 PGF 数学解析器了(如+扩展宏中的所示和强制的那样)。

\pgftransformshift宏用于将原点移回箭头尖端。使用q的快速版本,\pgfpoint因为其参数也不需要通过 PGF 数学进行解析。

而不是\pgfpathlineto我使用的另一个\pgfpathclose(这是的低级等价物-- cycle),即使您使用填充并且暗示关闭。

backgrounds及其gridded选项仅用于让人们轻松找到坐标(0,0)(1,0)。第二张图片是的结果opacity=.5,分别显示了线和箭头尖端。

代码

\documentclass[tikz,convert=false]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,backgrounds}

\makeatletter
\pgfarrowsdeclare{ipe arrow}{ipe arrow}{%
  \pgfutil@tempdima=5pt\relax
  \advance\[email protected]\pgflinewidth
  \pgfarrowsleftextend{+-\pgfutil@tempdima}%
  \pgfarrowsrightextend{+1.5\pgflinewidth}%
}{%
  \pgftransformshift{\pgfqpoint{1.5\pgflinewidth}{0pt}}%
  \pgfpathmoveto{\pgfpointorigin}%
  \pgfpathlineto{\pgfqpoint{-5pt}{-1.666pt}}%
  \pgfpathlineto{\pgfqpoint{-5pt}{+1.666pt}}%
  \pgfpathclose
  \pgfusepathqfill
}
\makeatother
\begin{document}

输出

在此处输入图片描述

在此处输入图片描述

相关内容