![概括](https://linux22.com/image/318547/%E6%A6%82%E6%8B%AC.png)
最近我将 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}
那是,在颜色和箭头规范之间插入一个空格。