arrows.meta TikZ 库中的角度键如何工作?

arrows.meta TikZ 库中的角度键如何工作?

标题说明了一切。它是如何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 factor1加权线宽是线宽,即黑线的宽度。对于任何其他值,加权线宽将是全部的线宽。

(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}

在此处输入图片描述

相关内容