post length
为什么选项中的加号和减号没有按我预期的方式工作
\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}[thick, above]
\draw[red] (0,0) --node{5cm} (5,0);
\draw[teal,
decoration={moveto, post=lineto, post length={4cm}}, decorate
] (0,-1) --node{4cm} (5,-1);
\draw[blue,
decoration={moveto, post=lineto, post length={4cm+1cm}}, decorate
] (0,-2) --node{4cm+1cm} (5,-2);
\draw[orange,
decoration={moveto, post=lineto, post length={4cm-1cm}}, decorate
] (0,-3) --node{4cm-1cm} (5,-3);
\end{tikzpicture}
\end{document}
编辑:在这个选项中,加号相当于减号,减号相当于加号。我的问题是为什么会发生这种情况!?-以及是否可以通过其他符号或添加额外代码来纠正这种行为。实际上不需要解决方法,因为写加号而不是减号很简单。
答案1
原因基本相同强制执行维度表达式的运算顺序? 仅处于 TikZ 的内部层面。
例如,值4cm-1cm
只是存储在键中/pgf/decoration/post length
。在装饰代码中的某个地方,它通过这个来检索\pgfkeysvalueof{/pgf/decoration/post length}
,这只是一个“愚蠢”的替换。
\pgfmetadecoratedremainingdistance-\pgfkeysvalueof{/pgf/decoration/post length}
将计算为
<some value>-4cm-1cm
从数学上讲,这等同于
<some value>-5cm
和不是
<some value>-(4cm-1cm)
我认为这在某种程度上是 TikZ 的一个错误。
类似的事情发生在delta angle
其值从中减去的情况end angle
(start angle
当然,当没有给出时)。(例如参见我的另一个答案我()
在其中使用三元运算符,因为它会产生非常奇怪的效果。)
因此你需要括号({}
PGFKeys 会去掉括号)
\draw[blue,
decoration={moveto, post=lineto, post length=(4cm+1cm)}, decorate
] (0,-2) --node{4cm+1cm} (5,-2);
\draw[orange,
decoration={moveto, post=lineto, post length=(4cm-1cm)}, decorate
] (0,-3) --node{4cm-1cm} (5,-3);
或者在装饰代码到达之前评估结果:
\draw[blue,
decoration={moveto, post=lineto, post length/.evaluated=4cm+1cm}, decorate
] (0,-2) --node{4cm+1cm} (5,-2);
\draw[orange,
decoration={moveto, post=lineto, post length/.evaluated=4cm-1cm}, decorate
] (0,-3) --node{4cm-1cm} (5,-3);
pt
从技术上讲,这将在键中存储一个没有单位的结果,但这将由PGFMath 再次转换。
当然,你也可以这样做
\pgfmathset(length)macro\<something>{4cm±1cm}
然后改用\<something>
。
(\dimexpr
当 PGFMath 到达 A 时,它会被交给 eTeX,由于它是贪婪的,它会抓取尽可能多的数据。)
答案2
尝试使用\dimexpr
(由 eTeX 引入):
\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}[thick, above]
\draw[red] (0,0) --node{5cm} (5,0);
\draw[teal,
decoration={moveto, post=lineto, post length={4cm}}, decorate]
(0,-1) -- node{4cm} (5,-1);
\draw[blue,
decoration={moveto, post=lineto, post length={\dimexpr4cm+1cm}}, decorate]
(0,-2) -- node{4cm+1cm} (5,-2);
\draw[orange,
decoration={moveto, post=lineto, post length={\dimexpr4cm-1cm}}, decorate]
(0,-3) --node{4cm-1cm} (5,-3);
\end{tikzpicture}
\end{document}
答案3
加号也不起作用。
实现这一点的一种方法是,例如通过声明counter
然后设置它的值或者从中添加或替换数字。
这是此实现的代码。
每次我需要计数器的值时,我都会调用它\the<name of counter>
,在这种情况下它被命名为l
。
\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{decorations.pathmorphing}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}[thick, above]
\newcounter{l}
\setcounter{l}{5}
\draw[red] (0,0) --node{5cm} (5,0);
\draw[teal,
decoration={moveto, post=lineto, post length=4 cm}, decorate
] (0,-1) --node{4cm} (5,-1);
\addtocounter{l}{-1}
\draw[blue,
decoration={moveto, post=lineto, post length={\thel cm}}, decorate
] (0,-2) --node{4cm+1cm} (5,-2);
\addtocounter{l}{-1}
\draw[orange,
decoration={moveto, post=lineto, post length={\thel cm}}, decorate
] (0,-3) --node{4cm-1cm} (5,-3);
\end{tikzpicture}
\end{document}