概括

概括

最近我将 TikZ 安装升级到版本3.0.1并观察到 ​​arrows.meta 中的箭头选项不再起作用。例如:

\documentclass[border=3mm,
               tikz]{standalone}
\usetikzlibrary{arrows.meta}

    \begin{document}
\begin{tikzpicture}
%\draw[blue,{Circle[slant=0.3]-Latex[]}]  (0,0) -- (2,0);
%\draw[blue,{Circle[]-Triangle[length=4pt]}]  (0,0) -- (2,0);
\draw[blue,{Circle[]-Triangle[]}]  (0,0) -- (2,0);
\end{tikzpicture}
    \end{document}

给出错误:

Package pgfkeys Error: I do not know the key tikz/Circle[slant', to which you passed 0.3. Perhaps you misspelled it.

对于任何箭头选项,我都会收到类似的错误。

我使用 64 位 MikTeX 2.9。这是 MikTeX 安装中的错误吗?我需要单独安装 pgfkeys(从哪里安装?)还是这是最近的 TikZ 中的错误?

答案1

我认为你的牙套是错的

\documentclass[border=3mm,
               tikz]{standalone}
               \usepackage{tikz}
\usetikzlibrary{arrows.meta}

    \begin{document}
\begin{tikzpicture}
\draw[blue,{Circle[slant=0.3]}-{Latex[]}]  (0,1) -- (2,1);
\draw[blue,{Circle[]}-{Triangle[length=4pt]}]  (0,0) -- (2,0);
\draw[blue,{Circle[]}-{Triangle[]}]  (0,-1) -- (2,-1);
\end{tikzpicture}
    \end{document}

答案2

我认为 Ulrike 关于错误的观点是正确的,因为快速试错显示了问题。发生的事情是,解析器在理解 之后到达要点blue,解析剩余部分直到出现逗号 或] 。首先在键系列中查找蓝色,如果在几个地方找不到,TikZ 会将其抛出,希望it must be a color then。我们有

\draw[blue,%<- this is a single style candidate 
    {Circle[slant=0.3]-Latex[]}%<-- this is also a single style candidate for the parser
]  (0,0) -- (2,0);

现在它寻找=并找到了一个。所以这肯定是一个键值对。然后像错误提示的那样将两者分开,一个Circle[slant是键,一个是值。0.3]-Latex[]

但是,如果你将括号对限制到每个箭头选项,那么它首先会找到-并理解这些括号的左右两侧是箭头规范。然后将它们发送到元解析器,它理解并<name>[extra spec]因此正常工作。

我认为这是以前的一个错误,并且 3.0.1 已修复它,因为它现在更有意义了。

答案3

概括

这个答案现在给出了我到达这一点的历史。如果你只是想让错误消失,而不喜欢旅行日志,那么底线是:

在箭头规范前添加一个空格显然可以让 TikZ 正确解析它。就是这样。

<colour>, {<Tip>[<key>=<value>]-<Tip>[<key>=<value>]}

成功的地方

<colour>,{<Tip>[<key>=<value>]-<Tip>[<key>=<value>]}

失败。

当然,这并不是说前一种语法值得推荐。它可能只是偶然起作用,也可能只是偶然下周就会彻底失败。

买者自负...

尽管如此,就目前而言,它确实有效......


探索记录

我总是在规范的两端使用花括号,而不是只在外面使用。因此,我无法确认行为是否有所改变,只能说此语法仍然正常工作:

\documentclass[border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}

\begin{document}
  \begin{tikzpicture}
    \draw[blue,{Circle[slant=0.3]}-{Latex[]}]  (0,1) -- (2,1);
    \draw[blue,{Circle[]}-{Triangle[length=4pt]}]  (0,.5) -- (2,.5);
    \draw[blue,{Circle[]}-{Triangle[]}]  (0,0) -- (2,0);
  \end{tikzpicture}
\end{document}

工作语法

编辑

正如我所说的评论,我不知道其他语法是否错误。但我可以确认,我在使用 OP 的示例和percusse 发布的代码,我有 PGF 3.0.1。

编辑 编辑

查看文档,显然需要非常小心这里的语法,但文档从未明确告诉过您。

请考虑以下示例:

\documentclass[border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}

\begin{document}
  \begin{tikzpicture}
    [arrows={Circle[slant=0.3]-Latex[]}, draw=blue]
    \draw  (0,1) -- (2,1);
    \begin{scope}
      [arrows={Circle[]}-{Triangle[length=4pt]}, draw=red]
      \draw  (0,.5) -- (2,.5);
    \end{scope}
    \draw [green, {[color=orange]Circle[]-[length=6pt]Triangle[]}]  (0,0) -- (2,0);
  \end{tikzpicture}
\end{document}

这很好用:

工作箭头

请注意,这意味着percusse 的解释我认为,这太简单了,因为它正确地解析了

green, {[color=orange]Circle[]-[length=6pt]Triangle[]}

-因此,在处理符号之前,必须先看到=。仅凭未解析表达式包含这一事实=本身不足以引起问题。此外,它显然违反了规范-,只将橙色应用于左端,只将长度调整应用于右端。

此外,我们现在可以<key>=<value>向特定提示添加选项而不会出现错误:

    \draw [magenta, {[color=orange]Circle[fill=yellow]-[length=6pt]Triangle[width=2pt]}]  (0,-.5) -- (2,-.5);

更漂亮的箭头

这显然立即暗示了以下可能性:

    \draw [purple, {[]Diamond[fill=gray]-[]Triangle[length=12pt]}]  (0,-1) -- (2,-1);

再次,它起作用了:

紫色变化

事实上,我们可以删除第二个[]

\draw [purple, {[]Diamond[fill=gray]-Triangle[length=12pt]}]  (0,-1) -- (2,-1);

产生相同的结果,同样没有错误。

但是现在我们已经完成了整个过程,因为事实证明下面的方法同样有效:

\documentclass[border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}

\begin{document}
  \begin{tikzpicture}
    \draw[blue, {Circle[slant=0.3]-Latex[]}]  (0,0) -- (2,0);
    \draw[blue, {Circle[]-Triangle[length=4pt]}]  (0,1) -- (2,1);
  \end{tikzpicture}
\end{document}

蓝色箭头

那是,在颜色和箭头规范之间插入一个空格

相关内容