我正在尝试定义一个箭头,用于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}