柱长装饰中的加减反转

柱长装饰中的加减反转

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

相关内容