标题说明了一切。它是如何angle=<angle>:<first dimen> <second dimen>
工作的。更确切地说,第一个长度和第二个长度是什么意思?
\usetikzlibrary{arrows.meta}
\tikzset{mparr/.tip={Triangle[round,angle=45:4bp 0bp]}}
我试图复制我喜欢的 MetaPost 的风格。因此,主要思想是找到正确的值,<first dimen>
以便<second dimen>
它类似于 MetaPost 中的箭头。
无论如何,如果您有任何模仿 MetaPost 风格的建议,我们欢迎您提出。(库bend
中的选项bending
并不能说服我,结果总是不如 MetaPost 箭头那么漂亮。)
以下是 MetaPost 图形的示例。\relax
之所以出现这些奇怪的 es,是因为我玩了 和\rlap
,\llap
想看看在玩这些值时图形是否有类似的结果。
%!TEX TS-program = lualatex
\documentclass{scrartcl}
\usepackage{tikz,luamplib,tkz-euclide}
\usetikzlibrary{arrows.meta,bending,decorations.markings}
\tikzset{mparr/.tip={Triangle[round,angle=45:5bp]}} % 5bp being 4bp+2\pgflinewidth
\tikzset{mpstyle/.style={line width=.5bp,line join=round,line cap=round,>=mparr,every node/.append style={inner sep=2bp}}}
\begin{document}
\indent\relax{\begin{tikzpicture}[mpstyle]
\draw[<->] (2,0) -- (0,0) -- (0,2);
\draw[->] (0,0) .. controls (1,0) and (1,2) .. (2,2);
\end{tikzpicture}}%
\relax{\begin{mplibcode}
%ahlength := 4bp;
%ahangle := 45;
beginfig(1);
drawdblarrow (2cm,0) -- (0,0) -- (0,2cm);
drawarrow (0,0) .. controls (1cm,0) and (1cm,2cm) .. (2cm,2cm)
%withpen pencircle scaled 10bp
;
endfig;
\end{mplibcode}}
\end{document}
有几件事我不完全理解:我无法在 TikZ 中用任何线宽绘制箭头,它似乎是固定的,该round
选项不考虑线宽是否为,例如11cm
;如果我改变了,ahangle := 20
那么相似性就会丢失,即使我这样做angle=20:5bp
,我真的不知道它是如何工作的。
附言:我知道标题中的问题有很多不错的答案,但是我在问题中说过我的目标是从 MetaPost 复制箭头(以及一般的样式),所以我会等待一段时间,以防有人能提出好的解决方案。
答案1
事实上,angle
接受四个参数:(注意空格)
angle=⟨angle⟩:⟨dimension⟩␣⟨line width factor⟩␣⟨outer factor⟩
提出这些论点只有一个原因:灵活性。
(1 2 3)
首先,我们想直接指定箭头的形状和大小。这导致了一个简单的约定:
angle=⟨angle⟩:⟨dimension⟩
如果线条太粗,就无法形成箭头。尤其是在情况 (3) 中,线条与尖端一样粗。
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60:10pt ]}]( 1,0)--+(0,1)node{ 1};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60:10pt ]}]( 2,0)--+(0,1)node{ 2};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60:10pt ]}]( 3,0)--+(0,1)node{ 3};
(4 5 6)
因此我们有一个更详细的协议:
angle=⟨angle⟩:⟨dimension⟩␣⟨line width factor⟩
在这些情况下,提示的大小是线的两倍。
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt 2]}]( 4,0)--+(0,1)node{ 4};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt 2]}]( 5,0)--+(0,1)node{ 5};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt 2]}]( 6,0)--+(0,1)node{ 6};
(7 8 9)
您还可以如下图所示,将提示的尺寸设置为比线条的尺寸正好大5pt
。
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :5pt 1]}]( 7,0)--+(0,1)node{ 7};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :5pt 1]}]( 8,0)--+(0,1)node{ 8};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :5pt 1]}]( 9,0)--+(0,1)node{ 9};
更加复杂
一旦界限double
模糊,事情就会变得疯狂。
(4 5 6 7 8 9)
前六个箭头看起来不错:尖端大小是线宽的线性函数。
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt 2 ]}]( 4,0)--+(0,3)node{ 4};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt 2 ]}]( 5,0)--+(0,3)node{ 5};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt 2 ]}]( 6,0)--+(0,3)node{ 6};
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :5pt 1 ]}]( 7,0)--+(0,3)node{ 7};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :5pt 1 ]}]( 8,0)--+(0,3)node{ 8};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :5pt 1 ]}]( 9,0)--+(0,3)node{ 9};
(10 11 12)
然后出现一个问题:尖端尺寸是否会随着外线宽?因此涉及第四个参数。
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt 1 1]}](10,0)--+(0,3)node{10};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt 1 1]}](11,0)--+(0,3)node{11};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt 1 1]}](12,0)--+(0,3)node{12};
默认情况下,outer factor
第四个参数 被设置为0
。因此加权线宽,要乘以的尺寸line width factor
,等于全部的线宽。即黑白黑线宽度之和。或相等内+ 2·外。
另一方面,如果outer factor
是1
,加权线宽是外线宽,即黑线的宽度。对于任何其他值,加权线宽将是全部的和外线宽。
(13 14 15)
那么……小费的大小可以随着内线宽是多少?答案需要一些数学知识:
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt -1 2]}](13,0)--+(0,3)node{13};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt -1 2]}](14,0)--+(0,3)node{14};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt -1 2]}](15,0)--+(0,3)node{15};
完整代码和侧标
- 在 的定义中
lw0r
, 的line width=0
目的是为了取消提示的反路径。- 奇怪的是
draw=none
出现了do not know the key 'draw'
错误。
- 奇怪的是
- 如果你擅长数学,你会发现我们无法设定加权线宽内+外。
- 为了便于以后参考,主要计算是
\pgfarrowslinewidthdependent
在 中完成的pgfcorearrows.code.tex
。
尖端长度 = 尺寸·cos(角度/2)
尖端宽度 = 尺寸·2·sin(角度/2)
尺寸 = ⟨尺寸⟩ + ⟨线宽因子⟩·加权
加权= ⟨外部因素⟩·外+ (1-⟨外部因子⟩)·全部的
加权= (2-⟨外部因子⟩)·外+ (1-⟨外部因子⟩)·内
- 在同一个文件中,还有一个
\pgfarrowslengthdependent
接受三个参数的:⟨dimension⟩
,,⟨length factor⟩
。⟨line width factor⟩
尖端宽度 = ⟨尺寸⟩ + ⟨长度因子⟩·尖端长度 + ⟨线宽因子⟩·线宽
dependent
据我所知,不再有类似宏的。
代码:
\documentclass[border=9,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\tikzset{/pgf/arrow keys/lw0r/.style={line width=0,red}}
\begin{tikzpicture}[nodes=above]
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60:10pt ]}]( 1,0)--+(0,1)node{ 1};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60:10pt ]}]( 2,0)--+(0,1)node{ 2};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60:10pt ]}]( 3,0)--+(0,1)node{ 3};
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt 2]}]( 4,0)--+(0,1)node{ 4};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt 2]}]( 5,0)--+(0,1)node{ 5};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt 2]}]( 6,0)--+(0,1)node{ 6};
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :5pt 1]}]( 7,0)--+(0,1)node{ 7};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :5pt 1]}]( 8,0)--+(0,1)node{ 8};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :5pt 1]}]( 9,0)--+(0,1)node{ 9};
\end{tikzpicture}
\begin{tikzpicture}[nodes=above,every path/.style=double,double distance=10pt]
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt 2 ]}]( 4,0)--+(0,3)node{ 4};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt 2 ]}]( 5,0)--+(0,3)node{ 5};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt 2 ]}]( 6,0)--+(0,3)node{ 6};
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :5pt 1 ]}]( 7,0)--+(0,3)node{ 7};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :5pt 1 ]}]( 8,0)--+(0,3)node{ 8};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :5pt 1 ]}]( 9,0)--+(0,3)node{ 9};
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt 1 1]}](10,0)--+(0,3)node{10};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt 1 1]}](11,0)--+(0,3)node{11};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt 1 1]}](12,0)--+(0,3)node{12};
\draw[line width= 2pt,arrows={-Triangle[lw0r,angle=60 :0pt -1 2]}](13,0)--+(0,3)node{13};
\draw[line width= 5pt,arrows={-Triangle[lw0r,angle=60 :0pt -1 2]}](14,0)--+(0,3)node{14};
\draw[line width=10pt,arrows={-Triangle[lw0r,angle=60 :0pt -1 2]}](15,0)--+(0,3)node{15};
\end{tikzpicture}
\end{document}
答案2
从手册,第 186 页
举个小例子
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,bending}
\tikzset{mparr/.tip={Triangle[round,angle=45:4bp]}}
\tikzset{mpstyle/.style={line width=.5bp,line join=round,line cap=round,>=mparr}}
\begin{document}
\begin{tikzpicture}
\begin{scope}[mpstyle]
\draw[->] (0,0) .. controls (1,0) and (1,2) .. (2,2) ;
\draw[<->] (2,0) -- (0,0) -- (0,2);
\end{scope}
\begin{scope}[mparr/.tip={Triangle[round,angle=45:4bp 4]},
mpstyle, xshift=3cm]
\draw[->] (0,0) .. controls (1,0) and (1,2) .. (2,2) ;
\draw[<->] (2,0) -- (0,0) -- (0,2);
\end{scope}
\end{tikzpicture}
\end{document}